diff --git a/fdbclient/DatabaseContext.h b/fdbclient/DatabaseContext.h index fafe04da39..184d1f1fae 100644 --- a/fdbclient/DatabaseContext.h +++ b/fdbclient/DatabaseContext.h @@ -229,10 +229,10 @@ public: double detailedHealthMetricsLastUpdated; UniqueOrderedOptionList<FDBTransactionOptions> transactionDefaults; - std::shared_ptr<SpecialKeySpace> specialKeySpace; - std::shared_ptr<ConflictingKeysImpl> cKImpl; - std::shared_ptr<ReadConflictRangeImpl> rCRImpl; - std::shared_ptr<WriteConflictRangeImpl> wCRImpl; + + std::vector<std::unique_ptr<SpecialKeyRangeBaseImpl>> specialKeySpaceModules; + std::unique_ptr<SpecialKeySpace> specialKeySpace; + void registerSpecialKeySpaceModule(std::unique_ptr<SpecialKeyRangeBaseImpl> module); }; #endif diff --git a/fdbclient/NativeAPI.actor.cpp b/fdbclient/NativeAPI.actor.cpp index 738f64624f..bf0ab6bcb4 100644 --- a/fdbclient/NativeAPI.actor.cpp +++ b/fdbclient/NativeAPI.actor.cpp @@ -493,6 +493,12 @@ ACTOR static Future<HealthMetrics> getHealthMetricsActor(DatabaseContext *cx, bo Future<HealthMetrics> DatabaseContext::getHealthMetrics(bool detailed = false) { return getHealthMetricsActor(this, detailed); } + +void DatabaseContext::registerSpecialKeySpaceModule(std::unique_ptr<SpecialKeyRangeBaseImpl> module) { + specialKeySpace->registerKeyRange(module->getKeyRange(), module.get()); + specialKeySpaceModules.push_back(std::move(module)); +} + DatabaseContext::DatabaseContext(Reference<AsyncVar<Reference<ClusterConnectionFile>>> connectionFile, Reference<AsyncVar<ClientDBInfo>> clientInfo, Future<Void> clientInfoMonitor, TaskPriority taskID, LocalityData const& clientLocality, @@ -527,10 +533,7 @@ DatabaseContext::DatabaseContext(Reference<AsyncVar<Reference<ClusterConnectionF transactionsProcessBehind("ProcessBehind", cc), outstandingWatches(0), latencies(1000), readLatencies(1000), commitLatencies(1000), GRVLatencies(1000), mutationsPerCommit(1000), bytesPerCommit(1000), mvCacheInsertLocation(0), healthMetricsLastUpdated(0), detailedHealthMetricsLastUpdated(0), internal(internal), - specialKeySpace(std::make_shared<SpecialKeySpace>(normalKeys.begin, specialKeys.end)), - cKImpl(std::make_shared<ConflictingKeysImpl>(conflictingKeysRange)), - rCRImpl(std::make_shared<ReadConflictRangeImpl>(readConflictRangeKeysRange)), - wCRImpl(std::make_shared<WriteConflictRangeImpl>(writeConflictRangeKeysRange)) { + specialKeySpace(std::make_unique<SpecialKeySpace>(normalKeys.begin, specialKeys.end)) { dbId = deterministicRandom()->randomUniqueID(); connected = clientInfo->get().proxies.size() ? Void() : clientInfo->onChange(); @@ -550,9 +553,9 @@ DatabaseContext::DatabaseContext(Reference<AsyncVar<Reference<ClusterConnectionF monitorMasterProxiesInfoChange = monitorMasterProxiesChange(clientInfo, &masterProxiesChangeTrigger); clientStatusUpdater.actor = clientStatusUpdateActor(this); if (apiVersionAtLeast(630)) { - specialKeySpace->registerKeyRange(conflictingKeysRange, cKImpl.get()); - specialKeySpace->registerKeyRange(readConflictRangeKeysRange, rCRImpl.get()); - specialKeySpace->registerKeyRange(writeConflictRangeKeysRange, wCRImpl.get()); + registerSpecialKeySpaceModule(std::make_unique<ConflictingKeysImpl>(conflictingKeysRange)); + registerSpecialKeySpaceModule(std::make_unique<ReadConflictRangeImpl>(readConflictRangeKeysRange)); + registerSpecialKeySpaceModule(std::make_unique<WriteConflictRangeImpl>(writeConflictRangeKeysRange)); } } diff --git a/fdbclient/ReadYourWrites.actor.cpp b/fdbclient/ReadYourWrites.actor.cpp index 6a065dec8f..705f46f8a8 100644 --- a/fdbclient/ReadYourWrites.actor.cpp +++ b/fdbclient/ReadYourWrites.actor.cpp @@ -1290,9 +1290,7 @@ Future< Standalone<RangeResultRef> > ReadYourWritesTransaction::getRange( bool snapshot, bool reverse ) { - if (getDatabase()->apiVersionAtLeast(630)) { - // special key space are only allowed to query if both begin and end are in \xff\xff, \xff\xff\xff if (specialKeys.contains(begin.getKey()) && end.getKey() <= specialKeys.end) return getDatabase()->specialKeySpace->getRange(Reference<ReadYourWritesTransaction>::addRef(this), begin, end, limits, reverse); diff --git a/fdbclient/SpecialKeySpace.actor.h b/fdbclient/SpecialKeySpace.actor.h index d3787f334f..d6bef5d1e5 100644 --- a/fdbclient/SpecialKeySpace.actor.h +++ b/fdbclient/SpecialKeySpace.actor.h @@ -44,6 +44,8 @@ public: ACTOR Future<Void> normalizeKeySelectorActor(const SpecialKeyRangeBaseImpl* pkrImpl, Reference<ReadYourWritesTransaction> ryw, KeySelector* ks); + virtual ~SpecialKeyRangeBaseImpl() {} + protected: KeyRange range; // underlying key range for this function }; diff --git a/fdbserver/workloads/SpecialKeySpaceCorrectness.actor.cpp b/fdbserver/workloads/SpecialKeySpaceCorrectness.actor.cpp index 48e6b8d20c..77744434c4 100644 --- a/fdbserver/workloads/SpecialKeySpaceCorrectness.actor.cpp +++ b/fdbserver/workloads/SpecialKeySpaceCorrectness.actor.cpp @@ -75,7 +75,7 @@ struct SpecialKeySpaceCorrectnessWorkload : TestWorkload { double getCheckTimeout() override { return std::numeric_limits<double>::max(); } Future<Void> _setup(Database cx, SpecialKeySpaceCorrectnessWorkload* self) { - cx->specialKeySpace = std::make_shared<SpecialKeySpace>(); + cx->specialKeySpace = std::make_unique<SpecialKeySpace>(); if (self->clientId == 0) { self->ryw = Reference(new ReadYourWritesTransaction(cx)); self->ryw->setOption(FDBTransactionOptions::SPECIAL_KEY_SPACE_RELAXED);