summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorTommaso Tocci <tommaso.tocci@mongodb.com>2023-03-15 23:21:46 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-03-16 00:48:44 +0000
commit1ca7dd4d7a4f2a9bbe8f9d8ad8a8442b91c3baad (patch)
tree00729be3ee180733640129c4cbe9e24a5fdb4606 /src/mongo/db
parent85492fee5ab876a538f1e3915d26eb9b28ffff2e (diff)
downloadmongo-1ca7dd4d7a4f2a9bbe8f9d8ad8a8442b91c3baad.tar.gz
SERVER-74667 Use lock-free read approch for checkMetadataConsistency command
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/s/shardsvr_check_metadata_consistency_participant_command.cpp43
1 files changed, 27 insertions, 16 deletions
diff --git a/src/mongo/db/s/shardsvr_check_metadata_consistency_participant_command.cpp b/src/mongo/db/s/shardsvr_check_metadata_consistency_participant_command.cpp
index b093d20486d..7645a8f6500 100644
--- a/src/mongo/db/s/shardsvr_check_metadata_consistency_participant_command.cpp
+++ b/src/mongo/db/s/shardsvr_check_metadata_consistency_participant_command.cpp
@@ -73,10 +73,10 @@ public:
Response typedRun(OperationContext* opCtx) {
uassertStatusOK(ShardingState::get(opCtx)->canAcceptShardedCommands());
+ opCtx->setAlwaysInterruptAtStepDownOrUp_UNSAFE();
const auto& nss = ns();
const auto& shardId = ShardingState::get(opCtx)->shardId();
- const auto& collectionCatalog = CollectionCatalog::get(opCtx);
const auto& primaryShardId = request().getPrimaryShardId();
// Get the list of collections from configsvr sorted by namespace
@@ -86,27 +86,38 @@ public:
repl::ReadConcernLevel::kMajorityReadConcern,
BSON(CollectionType::kNssFieldName << 1) /*sort*/);
- std::vector<NamespaceString> localNssCollections;
- {
+ const auto localCollectionsSorted = [&] {
+ std::vector<CollectionPtr> colls;
+
// Get the list of local collections sorted by namespace
- Lock::DBLock dbLock{opCtx, nss.db(), MODE_S};
- localNssCollections =
- collectionCatalog->getAllCollectionNamesFromDb(opCtx, nss.db());
- }
- std::sort(localNssCollections.begin(), localNssCollections.end());
- std::vector<CollectionPtr> localCollection;
- for (const auto& localNss : localNssCollections) {
- if (!localNss.isNormalCollection()) {
- continue;
+ AutoGetDbForReadMaybeLockFree lockFreeReadBlock(opCtx, nss.dbName());
+ tassert(7466700, "Lock-free mode not avaialable", opCtx->isLockFreeReadsOp());
+ // Take a snapshot of the catalog;
+ auto collectionCatalog = CollectionCatalog::get(opCtx);
+ for (auto it = collectionCatalog->begin(opCtx, nss.dbName());
+ it != collectionCatalog->end(opCtx);
+ ++it) {
+ if (!(*it)->ns().isNormalCollection()) {
+ continue;
+ }
+ colls.emplace_back(CollectionPtr(*it));
}
- localCollection.push_back(
- CollectionPtr(collectionCatalog->lookupCollectionByNamespace(opCtx, localNss)));
- }
+ std::sort(colls.begin(),
+ colls.end(),
+ [](const CollectionPtr& prev, const CollectionPtr& next) {
+ return prev->ns() < next->ns();
+ });
+ return colls;
+ }();
// Check consistency between local metadata and configsvr metadata
auto inconsistencies =
metadata_consistency_util::checkCollectionMetadataInconsistencies(
- opCtx, shardId, primaryShardId, catalogClientCollections, localCollection);
+ opCtx,
+ shardId,
+ primaryShardId,
+ catalogClientCollections,
+ localCollectionsSorted);
auto exec = metadata_consistency_util::makeQueuedPlanExecutor(
opCtx, std::move(inconsistencies), nss);