FetchKeys and blob restore - only fetch keys from blob storage for those are doing restore

This commit is contained in:
Hui Liu 2022-11-29 16:01:38 -08:00
parent a8dfc9d42b
commit 7b65307f0d
3 changed files with 15 additions and 4 deletions

View File

@ -529,6 +529,13 @@ ACTOR Future<int64_t> lastBlobEpoc(Database db, Reference<BlobConnectionProvider
// Return true if the given key range is restoring
ACTOR Future<bool> isFullRestoreMode(Database db, KeyRangeRef keys) {
KeyRange range = wait(getRestoringRange(db, keys));
return !range.empty();
}
// Check the given key range and return subrange that is doing restore. Returns empty range if no restoring
// for any portion of the given range.
ACTOR Future<KeyRange> getRestoringRange(Database db, KeyRangeRef keys) {
state Transaction tr(db);
loop {
tr.setOption(FDBTransactionOptions::PRIORITY_SYSTEM_IMMEDIATE);
@ -543,9 +550,11 @@ ACTOR Future<bool> isFullRestoreMode(Database db, KeyRangeRef keys) {
RangeResult ranges = wait(tr.getRange(begin, end, limits, Snapshot::True));
for (auto& r : ranges) {
KeyRange keyRange = decodeBlobRestoreCommandKeyFor(r.key);
if (keyRange.contains(keys)) {
if (keys.intersects(keyRange)) {
Standalone<BlobRestoreStatus> status = decodeBlobRestoreStatus(r.value);
return status.phase < BlobRestorePhase::DONE;
if (status.phase < BlobRestorePhase::DONE) {
return KeyRangeRef(std::max(keys.begin, keyRange.begin), std::min(keys.end, keyRange.end));
}
}
}
if (!ranges.more) {
@ -557,7 +566,7 @@ ACTOR Future<bool> isFullRestoreMode(Database db, KeyRangeRef keys) {
begin = firstGreaterThan(ranges.end()[-1].key);
}
}
return false;
return KeyRangeRef();
} catch (Error& e) {
wait(tr.onError(e));
}

View File

@ -164,6 +164,7 @@ ACTOR Future<BlobGranuleRestoreVersionVector> listBlobGranules(Database db, Refe
ACTOR Future<int64_t> lastBlobEpoc(Database db, Reference<BlobConnectionProvider> blobConn);
ACTOR Future<bool> isFullRestoreMode(Database db, KeyRangeRef range);
ACTOR Future<Void> updateRestoreStatus(Database db, KeyRangeRef range, BlobRestoreStatus status);
ACTOR Future<KeyRange> getRestoringRange(Database db, KeyRangeRef keys);
ACTOR Future<Optional<BlobRestoreStatus>> getRestoreStatus(Database db, KeyRangeRef range);
#include "flow/unactorcompiler.h"

View File

@ -7139,7 +7139,8 @@ ACTOR Future<Void> fetchKeys(StorageServer* data, AddingShard* shard) {
state PromiseStream<RangeResult> results;
state Future<Void> hold;
if (isFullRestore) {
hold = tryGetRangeFromBlob(results, &tr, keys, fetchVersion, data->blobConn);
KeyRange range = wait(getRestoringRange(data->cx, keys));
hold = tryGetRangeFromBlob(results, &tr, range, fetchVersion, data->blobConn);
} else {
hold = tryGetRange(results, &tr, keys);
}