FetchKeys and blob restore - only fetch keys from blob storage for those are doing restore
This commit is contained in:
parent
a8dfc9d42b
commit
7b65307f0d
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue