perpetual wiggle key functions

This commit is contained in:
Xiaoxi Wang 2022-12-08 16:46:05 -05:00
parent 16d11143fa
commit ccc494319c
5 changed files with 39 additions and 7 deletions

View File

@ -8631,7 +8631,7 @@ Future<Version> DatabaseContext::verifyBlobRange(const KeyRange& range,
ACTOR Future<std::vector<std::pair<UID, StorageWiggleValue>>> readStorageWiggleValues(Database cx,
bool primary,
bool use_system_priority) {
state const Key readKey = perpetualStorageWiggleIDPrefix.withSuffix(primary ? "primary/"_sr : "remote/"_sr);
state const Key readKey = perpetualStorageWigglePrefixFor(primary, PerpetualWigglePrefixType::STORAGE_ID);
state KeyBackedObjectMap<UID, StorageWiggleValue, decltype(IncludeVersion())> metadataMap(readKey,
IncludeVersion());
state Reference<ReadYourWritesTransaction> tr(new ReadYourWritesTransaction(cx));

View File

@ -868,8 +868,32 @@ const KeyRef configKeysPrefix = configKeys.begin;
const KeyRef perpetualStorageWiggleKey("\xff/conf/perpetual_storage_wiggle"_sr);
const KeyRef perpetualStorageWiggleLocalityKey("\xff/conf/perpetual_storage_wiggle_locality"_sr);
const KeyRef perpetualStorageWiggleIDPrefix("\xff/storageWiggleID/"_sr); // withSuffix /primary or /remote
// The below two are there for compatible upgrade and downgrade. After 7.3, the perpetual wiggle related keys should use
// format "\xff/storageWiggle/[primary | remote]/[fieldName]"
const KeyRef perpetualStorageWiggleIDPrefix("\xff/storageWiggleID/"_sr); // withSuffix /primary/ or /remote/
const KeyRef perpetualStorageWiggleStatsPrefix("\xff/storageWiggleStats/"_sr); // withSuffix /primary or /remote
// "\xff/storageWiggle/[primary | remote]/[fieldName]"
const KeyRef perpetualStorageWigglePrefix("\xff/storageWiggle/"_sr);
// the final char is "/"
const Key perpetualStorageWigglePrefixFor(bool primaryDc, PerpetualWigglePrefixType type) {
if (type == PerpetualWigglePrefixType::STORAGE_ID)
return perpetualStorageWiggleIDPrefix.withSuffix(primaryDc ? "primary/"_sr : "remote/"_sr);
ASSERT(false);
return ""_sr;
}
const Key perpetualStorageWiggleKeyFor(bool primaryDc, PerpetualWiggleKeyType type) {
if (type == PerpetualWiggleKeyType::WIGGLE_STATS)
return perpetualStorageWiggleStatsPrefix.withSuffix(primaryDc ? "primary"_sr : "remote"_sr);
Key result = perpetualStorageWigglePrefix.withSuffix(primaryDc ? "primary/"_sr : "remote/"_sr);
if (type == PerpetualWiggleKeyType::WIGGLE_DELAY)
return result.withSuffix("wiggleDelay"_sr);
ASSERT(false);
return ""_sr;
}
const KeyRef triggerDDTeamInfoPrintKey("\xff/triggerDDTeamInfoPrint"_sr);

View File

@ -108,7 +108,7 @@ ACTOR template <typename TxnType>
Future<Optional<StorageWiggleMetrics>> loadStorageWiggleMetrics(TxnType tr, PrimaryRegion primary) {
tr->setOption(FDBTransactionOptions::READ_SYSTEM_KEYS);
tr->setOption(FDBTransactionOptions::READ_LOCK_AWARE);
auto f = tr->get(perpetualStorageWiggleStatsPrefix.withSuffix(primary ? "primary"_sr : "remote"_sr));
auto f = tr->get(perpetualStorageWiggleKeyFor(primary, PerpetualWiggleKeyType::WIGGLE_STATS));
Optional<Value> value = wait(safeThreadFutureToFuture(f));
if (!value.present()) {
return Optional<StorageWiggleMetrics>();
@ -124,7 +124,7 @@ Future<Void> updateStorageWiggleMetrics(TxnType tr, StorageWiggleMetrics metrics
auto f = tr->get(perpetualStorageWiggleKey);
Optional<Value> v = wait(safeThreadFutureToFuture(f));
if (v.present() && v == "1"_sr) {
tr->set(perpetualStorageWiggleStatsPrefix.withSuffix(primary ? "primary"_sr : "remote"_sr),
tr->set(perpetualStorageWiggleKeyFor(primary, PerpetualWiggleKeyType::WIGGLE_STATS),
ObjectWriter::toValue(metrics, IncludeVersion()));
} else {
CODE_PROBE(true, "Intend to update StorageWiggleMetrics after PW disabled");
@ -147,7 +147,7 @@ Future<Void> resetStorageWiggleMetrics(TrType tr,
if (metrics.present()) {
metrics.get().reset();
tr->set(perpetualStorageWiggleStatsPrefix.withSuffix(primary ? "primary"_sr : "remote"_sr),
tr->set(perpetualStorageWiggleKeyFor(primary, PerpetualWiggleKeyType::WIGGLE_STATS),
ObjectWriter::toValue(metrics.get(), IncludeVersion()));
}
return Void();

View File

@ -277,6 +277,11 @@ extern const KeyRef perpetualStorageWiggleKey;
extern const KeyRef perpetualStorageWiggleLocalityKey;
extern const KeyRef perpetualStorageWiggleIDPrefix;
extern const KeyRef perpetualStorageWiggleStatsPrefix;
// the final char is "/"
enum class PerpetualWigglePrefixType { STORAGE_ID };
enum class PerpetualWiggleKeyType { WIGGLE_STATS, WIGGLE_DELAY };
const Key perpetualStorageWigglePrefixFor(bool primaryDc, PerpetualWigglePrefixType type);
const Key perpetualStorageWiggleKeyFor(bool primaryDc, PerpetualWiggleKeyType type);
// Change the value of this key to anything and that will trigger detailed data distribution team info log.
extern const KeyRef triggerDDTeamInfoPrintKey;

View File

@ -1925,7 +1925,7 @@ public:
}
ACTOR static Future<Void> updateNextWigglingStorageID(DDTeamCollection* self) {
state Key writeKey = perpetualStorageWiggleIDPrefix.withSuffix(self->primary ? "primary/"_sr : "remote/"_sr);
state Key writeKey = perpetualStorageWigglePrefixFor(self->primary, PerpetualWigglePrefixType::STORAGE_ID);
state KeyBackedObjectMap<UID, StorageWiggleValue, decltype(IncludeVersion())> metadataMap(writeKey,
IncludeVersion());
state UID nextId = wait(self->getNextWigglingServerID());
@ -1951,6 +1951,9 @@ public:
return Void();
}
// Persistent the total delay time to the database.
ACTOR static Future<Void> perpetualStorageWiggleDelay(DDTeamCollection* self) { return Void(); }
ACTOR static Future<Void> perpetualStorageWiggleRest(DDTeamCollection* self) {
state bool takeRest = true;
state Promise<int64_t> avgShardBytes;
@ -2035,7 +2038,7 @@ public:
AsyncVar<bool>* stopSignal,
PromiseStream<Void> finishStorageWiggleSignal) {
state KeyBackedObjectMap<UID, StorageWiggleValue, decltype(IncludeVersion())> metadataMap(
perpetualStorageWiggleIDPrefix.withSuffix(self->primary ? "primary/"_sr : "remote/"_sr), IncludeVersion());
perpetualStorageWigglePrefixFor(self->primary, PerpetualWigglePrefixType::STORAGE_ID), IncludeVersion());
state Future<StorageWiggleValue> nextFuture = Never();
state Future<Void> moveFinishFuture = Never();