diff options
author | Abdul Qadeer <abdul.qadeer@mongodb.com> | 2022-06-14 03:10:29 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-06-14 03:41:48 +0000 |
commit | 26a60b400fc8ceb021ddb81048a65850df4cb0e2 (patch) | |
tree | 6f67da1cc354f3ac7f9516acd67341f03a180378 /src/mongo/db/s/resharding | |
parent | 4776e5c58aff4900ccef48596388656c258c55b4 (diff) | |
download | mongo-26a60b400fc8ceb021ddb81048a65850df4cb0e2.tar.gz |
SERVER-62415 Change Resharding State Machines to clear filtering metadata only for active resharding op
Diffstat (limited to 'src/mongo/db/s/resharding')
10 files changed, 111 insertions, 44 deletions
diff --git a/src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp b/src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp index 43d91e83b97..27157f82b66 100644 --- a/src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp +++ b/src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp @@ -332,7 +332,12 @@ void clearFilteringMetadata(OperationContext* opCtx, bool scheduleAsyncRefresh) return true; }); } + clearFilteringMetadata(opCtx, namespacesToRefresh, scheduleAsyncRefresh); +} +void clearFilteringMetadata(OperationContext* opCtx, + stdx::unordered_set<NamespaceString> namespacesToRefresh, + bool scheduleAsyncRefresh) { for (const auto& nss : namespacesToRefresh) { AutoGetCollection autoColl(opCtx, nss, MODE_IX); CollectionShardingRuntime::get(opCtx, nss)->clearFilteringMetadata(opCtx); diff --git a/src/mongo/db/s/resharding/resharding_donor_recipient_common.h b/src/mongo/db/s/resharding/resharding_donor_recipient_common.h index 2efba26f659..10be195c586 100644 --- a/src/mongo/db/s/resharding/resharding_donor_recipient_common.h +++ b/src/mongo/db/s/resharding/resharding_donor_recipient_common.h @@ -77,6 +77,10 @@ void processReshardingFieldsForCollection(OperationContext* opCtx, void clearFilteringMetadata(OperationContext* opCtx, bool scheduleAsyncRefresh); +void clearFilteringMetadata(OperationContext* opCtx, + stdx::unordered_set<NamespaceString> namespacesToRefresh, + bool scheduleAsyncRefresh); + void refreshShardVersion(OperationContext* opCtx, const NamespaceString& nss); } // namespace resharding diff --git a/src/mongo/db/s/resharding/resharding_donor_recipient_common_test.cpp b/src/mongo/db/s/resharding/resharding_donor_recipient_common_test.cpp index 3fccff9812c..d4aae1cd424 100644 --- a/src/mongo/db/s/resharding/resharding_donor_recipient_common_test.cpp +++ b/src/mongo/db/s/resharding/resharding_donor_recipient_common_test.cpp @@ -133,17 +133,18 @@ protected: return CollectionMetadata(std::move(cm), kThisShard.getShardId()); } - ReshardingDonorDocument makeDonorStateDoc() { + ReshardingDonorDocument makeDonorStateDoc(NamespaceString sourceNss, + NamespaceString tempReshardingNss, + BSONObj reshardingKey, + std::vector<mongo::ShardId> recipientShards) { DonorShardContext donorCtx; donorCtx.setState(DonorStateEnum::kPreparingToDonate); - ReshardingDonorDocument doc(std::move(donorCtx), - {kThisShard.getShardId(), kOtherShard.getShardId()}); + ReshardingDonorDocument doc(std::move(donorCtx), recipientShards); - NamespaceString sourceNss = kOriginalNss; auto sourceUUID = UUID::gen(); auto commonMetadata = CommonReshardingMetadata( - UUID::gen(), sourceNss, sourceUUID, kTemporaryReshardingNss, kReshardingKeyPattern); + UUID::gen(), sourceNss, sourceUUID, tempReshardingNss, reshardingKey); doc.setCommonReshardingMetadata(std::move(commonMetadata)); return doc; @@ -262,6 +263,19 @@ protected: ASSERT(donorShardMap.empty()); } + void addFilteringMetadata(OperationContext* opCtx, NamespaceString sourceNss, ShardId shardId) { + AutoGetCollection autoColl(opCtx, sourceNss, LockMode::MODE_IS); + const auto metadata{makeShardedMetadataForOriginalCollection(opCtx, shardId)}; + ScopedSetShardRole scopedSetShardRole{opCtx, + sourceNss, + metadata.getShardVersion() /* shardVersion */, + boost::none /* databaseVersion */}; + + auto csr = CollectionShardingRuntime::get(opCtx, sourceNss); + csr->setFilteringMetadata(opCtx, metadata); + ASSERT(csr->getCurrentMetadataIfKnown()); + } + private: DonorShardFetchTimestamp makeDonorShardFetchTimestamp( ShardId shardId, boost::optional<Timestamp> fetchTimestamp) { @@ -553,34 +567,10 @@ TEST_F(ReshardingDonorRecipientCommonInternalsTest, ClearReshardingFilteringMeta } // Add filtering metadata for the collection being resharded. - { - AutoGetCollection autoColl(opCtx, kOriginalNss, LockMode::MODE_IS); - const auto metadata{ - makeShardedMetadataForOriginalCollection(opCtx, kThisShard.getShardId())}; - ScopedSetShardRole scopedSetShardRole{opCtx, - kOriginalNss, - metadata.getShardVersion() /* shardVersion */, - boost::none /* databaseVersion */}; - - auto csr = CollectionShardingRuntime::get(opCtx, kOriginalNss); - csr->setFilteringMetadata(opCtx, metadata); - ASSERT(csr->getCurrentMetadataIfKnown()); - } + addFilteringMetadata(opCtx, kOriginalNss, kThisShard.getShardId()); // Add filtering metadata for the temporary resharding namespace. - { - AutoGetCollection autoColl(opCtx, kTemporaryReshardingNss, LockMode::MODE_IS); - const auto metadata{makeShardedMetadataForTemporaryReshardingCollection( - opCtx, kThisShard.getShardId())}; - ScopedSetShardRole scopedSetShardRole{opCtx, - kTemporaryReshardingNss, - metadata.getShardVersion() /* shardVersion */, - boost::none /* databaseVersion */}; - - auto csr = CollectionShardingRuntime::get(opCtx, kTemporaryReshardingNss); - csr->setFilteringMetadata(opCtx, metadata); - ASSERT(csr->getCurrentMetadataIfKnown()); - } + addFilteringMetadata(opCtx, kTemporaryReshardingNss, kThisShard.getShardId()); // Prior to adding a resharding document, assert that attempting to clear filtering does // nothing. @@ -595,7 +585,11 @@ TEST_F(ReshardingDonorRecipientCommonInternalsTest, ClearReshardingFilteringMeta doSetupFunc(); // Add a resharding donor document that targets the namespaces involved in resharding. - ReshardingDonorDocument donorDoc = makeDonorStateDoc(); + ReshardingDonorDocument donorDoc = + makeDonorStateDoc(kOriginalNss, + kTemporaryReshardingNss, + kReshardingKeyPattern, + {kThisShard.getShardId(), kOtherShard.getShardId()}); ReshardingDonorService::DonorStateMachine::insertStateDocument(opCtx, donorDoc); // Clear the filtering metadata (without scheduling a refresh) and assert the metadata is gone. @@ -622,5 +616,49 @@ TEST_F(ReshardingDonorRecipientCommonInternalsTest, ClearReshardingFilteringMeta } } +TEST_F(ReshardingDonorRecipientCommonInternalsTest, ClearReshardingFilteringMetaDataForActiveOp) { + OperationContext* opCtx = operationContext(); + NamespaceString sourceNss1 = NamespaceString("db", "one"); + NamespaceString tempReshardingNss1 = + constructTemporaryReshardingNss(sourceNss1.db(), UUID::gen()); + NamespaceString sourceNss2 = NamespaceString("db", "two"); + NamespaceString tempReshardingNss2 = + constructTemporaryReshardingNss(sourceNss2.db(), UUID::gen()); + ShardId shardId1 = ShardId{"recipient1"}; + ShardId shardId2 = ShardId{"recipient2"}; + ReshardingDonorDocument doc1 = + makeDonorStateDoc(sourceNss1, tempReshardingNss1, BSON("newKey1" << 1), {shardId1}); + ReshardingDonorDocument doc2 = + makeDonorStateDoc(sourceNss2, tempReshardingNss2, BSON("newKey2" << 1), {shardId2}); + + ReshardingDonorService::DonorStateMachine::insertStateDocument(opCtx, doc1); + ReshardingDonorService::DonorStateMachine::insertStateDocument(opCtx, doc2); + + // Add filtering metadata for the collection being resharded. + addFilteringMetadata(opCtx, sourceNss1, {shardId1}); + addFilteringMetadata(opCtx, sourceNss2, {shardId2}); + + // Add filtering metadata for the temporary resharding namespace. + addFilteringMetadata(opCtx, tempReshardingNss1, {shardId1}); + addFilteringMetadata(opCtx, tempReshardingNss2, {shardId2}); + + // Clear the filtering metadata (without scheduling a refresh) for only on single operation + // related namespaces + resharding::clearFilteringMetadata(opCtx, {sourceNss1, tempReshardingNss1}, false); + + for (auto const& nss : {sourceNss1, tempReshardingNss1}) { + AutoGetCollection autoColl(opCtx, nss, LockMode::MODE_IS); + auto csr = CollectionShardingRuntime::get(opCtx, nss); + ASSERT(csr->getCurrentMetadataIfKnown() == boost::none); + } + + // Assert that the filtering metadata is not cleared for other operation + for (auto const& nss : {sourceNss2, tempReshardingNss2}) { + AutoGetCollection autoColl(opCtx, nss, LockMode::MODE_IS); + auto csr = CollectionShardingRuntime::get(opCtx, nss); + ASSERT(csr->getCurrentMetadataIfKnown() != boost::none); + } +} + } // namespace } // namespace mongo diff --git a/src/mongo/db/s/resharding/resharding_donor_service.cpp b/src/mongo/db/s/resharding/resharding_donor_service.cpp index 2ba67f8463b..868e240e5e0 100644 --- a/src/mongo/db/s/resharding/resharding_donor_service.cpp +++ b/src/mongo/db/s/resharding/resharding_donor_service.cpp @@ -178,8 +178,12 @@ public: } } - void clearFilteringMetadata(OperationContext* opCtx) { - resharding::clearFilteringMetadata(opCtx, true /* scheduleAsyncRefresh */); + void clearFilteringMetadata(OperationContext* opCtx, + const NamespaceString& sourceNss, + const NamespaceString& tempReshardingNss) { + stdx::unordered_set<NamespaceString> namespacesToRefresh{sourceNss, tempReshardingNss}; + resharding::clearFilteringMetadata( + opCtx, namespacesToRefresh, true /* scheduleAsyncRefresh */); } }; @@ -375,8 +379,8 @@ ExecutorFuture<void> ReshardingDonorService::DonorStateMachine::_finishReshardin { auto opCtx = _cancelableOpCtxFactory->makeOperationContext(&cc()); - - _externalState->clearFilteringMetadata(opCtx.get()); + _externalState->clearFilteringMetadata( + opCtx.get(), _metadata.getSourceNss(), _metadata.getTempReshardingNss()); RecoverableCriticalSectionService::get(opCtx.get()) ->releaseRecoverableCriticalSection( diff --git a/src/mongo/db/s/resharding/resharding_donor_service.h b/src/mongo/db/s/resharding/resharding_donor_service.h index 2d5fc6e05df..3f3d88965db 100644 --- a/src/mongo/db/s/resharding/resharding_donor_service.h +++ b/src/mongo/db/s/resharding/resharding_donor_service.h @@ -297,7 +297,9 @@ public: const BSONObj& query, const BSONObj& update) = 0; - virtual void clearFilteringMetadata(OperationContext* opCtx) = 0; + virtual void clearFilteringMetadata(OperationContext* opCtx, + const NamespaceString& sourceNss, + const NamespaceString& tempReshardingNss) = 0; }; } // namespace mongo diff --git a/src/mongo/db/s/resharding/resharding_donor_service_test.cpp b/src/mongo/db/s/resharding/resharding_donor_service_test.cpp index 0f40919d14d..f0ffd9ef028 100644 --- a/src/mongo/db/s/resharding/resharding_donor_service_test.cpp +++ b/src/mongo/db/s/resharding/resharding_donor_service_test.cpp @@ -85,7 +85,9 @@ public: const BSONObj& query, const BSONObj& update) override {} - void clearFilteringMetadata(OperationContext* opCtx) override {} + void clearFilteringMetadata(OperationContext* opCtx, + const NamespaceString& sourceNss, + const NamespaceString& tempReshardingNss) override {} }; class DonorOpObserverForTest : public OpObserverForTest { diff --git a/src/mongo/db/s/resharding/resharding_recipient_service.cpp b/src/mongo/db/s/resharding/resharding_recipient_service.cpp index f3dbeca4811..d64e180304d 100644 --- a/src/mongo/db/s/resharding/resharding_recipient_service.cpp +++ b/src/mongo/db/s/resharding/resharding_recipient_service.cpp @@ -370,7 +370,9 @@ ExecutorFuture<void> ReshardingRecipientService::RecipientStateMachine::_finishR if (!_isAlsoDonor) { auto opCtx = factory.makeOperationContext(&cc()); - _externalState->clearFilteringMetadata(opCtx.get()); + _externalState->clearFilteringMetadata(opCtx.get(), + _metadata.getSourceNss(), + _metadata.getTempReshardingNss()); RecoverableCriticalSectionService::get(opCtx.get()) ->releaseRecoverableCriticalSection( diff --git a/src/mongo/db/s/resharding/resharding_recipient_service_external_state.cpp b/src/mongo/db/s/resharding/resharding_recipient_service_external_state.cpp index 3e929815454..222a2c6f86a 100644 --- a/src/mongo/db/s/resharding/resharding_recipient_service_external_state.cpp +++ b/src/mongo/db/s/resharding/resharding_recipient_service_external_state.cpp @@ -186,8 +186,12 @@ void RecipientStateMachineExternalStateImpl::updateCoordinatorDocument(Operation } } -void RecipientStateMachineExternalStateImpl::clearFilteringMetadata(OperationContext* opCtx) { - resharding::clearFilteringMetadata(opCtx, true /* scheduleAsyncRefresh */); +void RecipientStateMachineExternalStateImpl::clearFilteringMetadata( + OperationContext* opCtx, + const NamespaceString& sourceNss, + const NamespaceString& tempReshardingNss) { + stdx::unordered_set<NamespaceString> namespacesToRefresh{sourceNss, tempReshardingNss}; + resharding::clearFilteringMetadata(opCtx, namespacesToRefresh, true /* scheduleAsyncRefresh */); } } // namespace mongo diff --git a/src/mongo/db/s/resharding/resharding_recipient_service_external_state.h b/src/mongo/db/s/resharding/resharding_recipient_service_external_state.h index c1597da7f7c..0a2749a66fc 100644 --- a/src/mongo/db/s/resharding/resharding_recipient_service_external_state.h +++ b/src/mongo/db/s/resharding/resharding_recipient_service_external_state.h @@ -90,7 +90,9 @@ public: const BSONObj& query, const BSONObj& update) = 0; - virtual void clearFilteringMetadata(OperationContext* opCtx) = 0; + virtual void clearFilteringMetadata(OperationContext* opCtx, + const NamespaceString& sourceNss, + const NamespaceString& tempReshardingNss) = 0; /** * Creates the temporary resharding collection locally. @@ -137,7 +139,9 @@ public: const BSONObj& query, const BSONObj& update) override; - void clearFilteringMetadata(OperationContext* opCtx) override; + void clearFilteringMetadata(OperationContext* opCtx, + const NamespaceString& sourceNss, + const NamespaceString& tempReshardingNss) override; private: template <typename Callable> diff --git a/src/mongo/db/s/resharding/resharding_recipient_service_test.cpp b/src/mongo/db/s/resharding/resharding_recipient_service_test.cpp index 78316aacca7..22ae1f61542 100644 --- a/src/mongo/db/s/resharding/resharding_recipient_service_test.cpp +++ b/src/mongo/db/s/resharding/resharding_recipient_service_test.cpp @@ -136,7 +136,9 @@ public: const BSONObj& query, const BSONObj& update) override {} - void clearFilteringMetadata(OperationContext* opCtx) override {} + void clearFilteringMetadata(OperationContext* opCtx, + const NamespaceString& sourceNss, + const NamespaceString& tempReshardingNss) override {} private: RoutingTableHistoryValueHandle _makeStandaloneRoutingTableHistory(RoutingTableHistory rt) { |