mirror of
https://github.com/apple/foundationdb.git
synced 2025-06-02 19:25:52 +08:00
blob: check if blob range exists and fail accordingly
This commit is contained in:
parent
736ef4f2c9
commit
5085c21d0d
@ -175,7 +175,7 @@ ACTOR Future<bool> blobRangeCommandActor(Database localDb,
|
||||
fmt::print("Invalid blob range [{0} - {1})\n", tokens[2].printable(), tokens[3].printable());
|
||||
} else {
|
||||
if (tokencmp(tokens[1], "start") || tokencmp(tokens[1], "stop")) {
|
||||
bool starting = tokencmp(tokens[1], "start");
|
||||
state bool starting = tokencmp(tokens[1], "start");
|
||||
if (tokens.size() > 4) {
|
||||
printUsage(tokens[0]);
|
||||
return false;
|
||||
@ -184,11 +184,19 @@ ACTOR Future<bool> blobRangeCommandActor(Database localDb,
|
||||
starting ? "Starting" : "Stopping",
|
||||
tokens[2].printable().c_str(),
|
||||
tokens[3].printable().c_str());
|
||||
state bool success = false;
|
||||
if (starting) {
|
||||
wait(localDb->blobbifyRange(KeyRangeRef(begin, end)));
|
||||
wait(store(success, localDb->blobbifyRange(KeyRangeRef(begin, end))));
|
||||
} else {
|
||||
wait(localDb->unblobbifyRange(KeyRangeRef(begin, end)));
|
||||
wait(store(success, localDb->unblobbifyRange(KeyRangeRef(begin, end))));
|
||||
}
|
||||
if (!success) {
|
||||
fmt::print("{0} blobbify range for [{1} - {2}) failed\n",
|
||||
starting ? "Starting" : "Stopping",
|
||||
tokens[2].printable().c_str(),
|
||||
tokens[3].printable().c_str());
|
||||
}
|
||||
return success;
|
||||
} else if (tokencmp(tokens[1], "purge") || tokencmp(tokens[1], "forcepurge") || tokencmp(tokens[1], "check")) {
|
||||
bool purge = tokencmp(tokens[1], "purge") || tokencmp(tokens[1], "forcepurge");
|
||||
bool forcePurge = tokencmp(tokens[1], "forcepurge");
|
||||
|
@ -9808,19 +9808,31 @@ Future<Void> DatabaseContext::waitPurgeGranulesComplete(Key purgeKey) {
|
||||
return waitPurgeGranulesCompleteActor(Reference<DatabaseContext>::addRef(this), purgeKey);
|
||||
}
|
||||
|
||||
ACTOR Future<Void> setBlobRangeActor(Reference<DatabaseContext> cx, KeyRange range, bool active) {
|
||||
ACTOR Future<bool> setBlobRangeActor(Reference<DatabaseContext> cx, KeyRange range, bool active) {
|
||||
state Database db(cx);
|
||||
state Reference<ReadYourWritesTransaction> tr = makeReference<ReadYourWritesTransaction>(db);
|
||||
|
||||
state Value value = active ? LiteralStringRef("1") : LiteralStringRef("0");
|
||||
state Value value = active ? blobRangeActive : blobRangeInactive;
|
||||
|
||||
loop {
|
||||
try {
|
||||
tr->setOption(FDBTransactionOptions::ACCESS_SYSTEM_KEYS);
|
||||
tr->setOption(FDBTransactionOptions::PRIORITY_SYSTEM_IMMEDIATE);
|
||||
|
||||
// FIXME: check that the set range is currently inactive, and that a revoked range is currently its own
|
||||
// range in the map and fully set.
|
||||
if (active) {
|
||||
state RangeResult results = wait(krmGetRanges(tr, blobRangeKeys.begin, range));
|
||||
ASSERT(results.size() >= 2);
|
||||
if (results[0].key == range.begin && results[1].key == range.end &&
|
||||
results[0].value == blobRangeActive) {
|
||||
return true;
|
||||
} else {
|
||||
for (int i = 0; i < results.size(); i++) {
|
||||
if (results[i].value == blobRangeActive) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tr->set(blobRangeChangeKey, deterministicRandom()->randomUniqueID().toString());
|
||||
// This is not coalescing because we want to keep each range logically separate.
|
||||
@ -9830,18 +9842,18 @@ ACTOR Future<Void> setBlobRangeActor(Reference<DatabaseContext> cx, KeyRange ran
|
||||
range.begin.printable().c_str(),
|
||||
range.end.printable().c_str(),
|
||||
value.printable().c_str());
|
||||
return Void();
|
||||
return true;
|
||||
} catch (Error& e) {
|
||||
wait(tr->onError(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<Void> DatabaseContext::blobbifyRange(KeyRange range) {
|
||||
Future<bool> DatabaseContext::blobbifyRange(KeyRange range) {
|
||||
return setBlobRangeActor(Reference<DatabaseContext>::addRef(this), range, true);
|
||||
}
|
||||
|
||||
Future<Void> DatabaseContext::unblobbifyRange(KeyRange range) {
|
||||
Future<bool> DatabaseContext::unblobbifyRange(KeyRange range) {
|
||||
return setBlobRangeActor(Reference<DatabaseContext>::addRef(this), range, false);
|
||||
}
|
||||
|
||||
|
@ -385,8 +385,8 @@ public:
|
||||
bool force = false);
|
||||
Future<Void> waitPurgeGranulesComplete(Key purgeKey);
|
||||
|
||||
Future<Void> blobbifyRange(KeyRange range);
|
||||
Future<Void> unblobbifyRange(KeyRange range);
|
||||
Future<bool> blobbifyRange(KeyRange range);
|
||||
Future<bool> unblobbifyRange(KeyRange range);
|
||||
|
||||
// private:
|
||||
explicit DatabaseContext(Reference<AsyncVar<Reference<IClusterConnectionRecord>>> connectionRecord,
|
||||
|
@ -270,7 +270,8 @@ struct BlobGranuleCorrectnessWorkload : TestWorkload {
|
||||
self->directories[directoryIdx]->directoryRange =
|
||||
KeyRangeRef(tenantEntry.prefix, tenantEntry.prefix.withSuffix(normalKeys.end));
|
||||
tenants.push_back({ self->directories[directoryIdx]->tenantName, tenantEntry });
|
||||
wait(cx->blobbifyRange(self->directories[directoryIdx]->directoryRange));
|
||||
bool _success = wait(cx->blobbifyRange(self->directories[directoryIdx]->directoryRange));
|
||||
ASSERT(_success);
|
||||
}
|
||||
tenantData.addTenants(tenants);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user