summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/resharding
diff options
context:
space:
mode:
authorAbdul Qadeer <abdul.qadeer@mongodb.com>2022-06-14 03:10:29 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-06-14 03:41:48 +0000
commit26a60b400fc8ceb021ddb81048a65850df4cb0e2 (patch)
tree6f67da1cc354f3ac7f9516acd67341f03a180378 /src/mongo/db/s/resharding
parent4776e5c58aff4900ccef48596388656c258c55b4 (diff)
downloadmongo-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')
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp5
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_recipient_common.h4
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_recipient_common_test.cpp102
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_service.cpp12
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_service.h4
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_service_test.cpp4
-rw-r--r--src/mongo/db/s/resharding/resharding_recipient_service.cpp4
-rw-r--r--src/mongo/db/s/resharding/resharding_recipient_service_external_state.cpp8
-rw-r--r--src/mongo/db/s/resharding/resharding_recipient_service_external_state.h8
-rw-r--r--src/mongo/db/s/resharding/resharding_recipient_service_test.cpp4
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) {