From 647bfee7a2e21b6589a01dd707a9a540d60c20fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Jos=C3=A9=20Grillo=20Ramirez?= Date: Mon, 6 Feb 2023 17:15:47 +0000 Subject: SERVER-73212 Remove collection locks on sharding index catalog shard observer's onCommit handlers --- src/mongo/db/s/global_index_ddl_util.cpp | 51 +++++++++++++++++++++-------- src/mongo/db/s/global_index_ddl_util.h | 3 +- src/mongo/db/s/shard_server_op_observer.cpp | 11 +------ 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/mongo/db/s/global_index_ddl_util.cpp b/src/mongo/db/s/global_index_ddl_util.cpp index 9ed85490fa4..f2ac257377b 100644 --- a/src/mongo/db/s/global_index_ddl_util.cpp +++ b/src/mongo/db/s/global_index_ddl_util.cpp @@ -69,8 +69,13 @@ void renameGlobalIndexesMetadata(OperationContext* opCtx, [&]() { boost::optional toUuid; WriteUnitOfWork wunit(opCtx); - AutoGetCollection collsColl( - opCtx, NamespaceString::kShardCollectionCatalogNamespace, MODE_IX); + AutoGetCollection fromToColl( + opCtx, fromNss, MODE_IX, AutoGetCollection::Options{}.secondaryNssOrUUIDs({toNss})); + AutoGetCollection collsColl(opCtx, + NamespaceString::kShardCollectionCatalogNamespace, + MODE_IX, + AutoGetCollection::Options{}.secondaryNssOrUUIDs( + {NamespaceString::kShardIndexCatalogNamespace})); { // First get the document to check the index version if the document already exists const auto queryTo = BSON(CollectionType::kNssFieldName << toNss.ns()); @@ -158,8 +163,12 @@ void addGlobalIndexCatalogEntryToCollection(OperationContext* opCtx, writeConflictRetry( opCtx, "AddIndexCatalogEntry", NamespaceString::kShardIndexCatalogNamespace.ns(), [&]() { WriteUnitOfWork wunit(opCtx); - AutoGetCollection collsColl( - opCtx, NamespaceString::kShardCollectionCatalogNamespace, MODE_IX); + AutoGetCollection userColl(opCtx, userCollectionNss, MODE_IX); + AutoGetCollection collsColl(opCtx, + NamespaceString::kShardCollectionCatalogNamespace, + MODE_IX, + AutoGetCollection::Options{}.secondaryNssOrUUIDs( + {NamespaceString::kShardIndexCatalogNamespace})); { // First get the document to check the index version if the document already exists @@ -229,9 +238,12 @@ void removeGlobalIndexCatalogEntryFromCollection(OperationContext* opCtx, writeConflictRetry( opCtx, "RemoveIndexCatalogEntry", NamespaceString::kShardIndexCatalogNamespace.ns(), [&]() { WriteUnitOfWork wunit(opCtx); - AutoGetCollection collsColl( - opCtx, NamespaceString::kShardCollectionCatalogNamespace, MODE_IX); - + AutoGetCollection userColl(opCtx, nss, MODE_IX); + AutoGetCollection collsColl(opCtx, + NamespaceString::kShardCollectionCatalogNamespace, + MODE_IX, + AutoGetCollection::Options{}.secondaryNssOrUUIDs( + {NamespaceString::kShardIndexCatalogNamespace})); { // First get the document to check the index version if the document already exists const auto query = BSON(CollectionType::kNssFieldName @@ -297,8 +309,12 @@ void replaceCollectionGlobalIndexes(OperationContext* opCtx, writeConflictRetry( opCtx, "ReplaceIndexCatalog", NamespaceString::kShardIndexCatalogNamespace.ns(), [&]() { WriteUnitOfWork wunit(opCtx); - AutoGetCollection collsColl( - opCtx, NamespaceString::kShardCollectionCatalogNamespace, MODE_IX); + AutoGetCollection userColl(opCtx, nss, MODE_IX); + AutoGetCollection collsColl(opCtx, + NamespaceString::kShardCollectionCatalogNamespace, + MODE_IX, + AutoGetCollection::Options{}.secondaryNssOrUUIDs( + {NamespaceString::kShardIndexCatalogNamespace})); { // Set final indexVersion const auto query = BSON(CollectionType::kNssFieldName @@ -357,8 +373,13 @@ void dropCollectionGlobalIndexesMetadata(OperationContext* opCtx, const Namespac opCtx, "DropIndexCatalogEntry", NamespaceString::kShardIndexCatalogNamespace.ns(), [&]() { boost::optional collectionUUID; WriteUnitOfWork wunit(opCtx); - AutoGetCollection collsColl( - opCtx, NamespaceString::kShardCollectionCatalogNamespace, MODE_IX); + Lock::DBLock dbLock(opCtx, nss.dbName(), MODE_IX); + Lock::CollectionLock collLock(opCtx, nss, MODE_IX); + AutoGetCollection collsColl(opCtx, + NamespaceString::kShardCollectionCatalogNamespace, + MODE_IX, + AutoGetCollection::Options{}.secondaryNssOrUUIDs( + {NamespaceString::kShardIndexCatalogNamespace})); { const auto query = BSON(CollectionType::kNssFieldName << nss.ns()); BSONObj collectionDoc; @@ -400,8 +421,12 @@ void clearCollectionGlobalIndexes(OperationContext* opCtx, writeConflictRetry( opCtx, "ClearIndexCatalogEntry", NamespaceString::kShardIndexCatalogNamespace.ns(), [&]() { WriteUnitOfWork wunit(opCtx); - AutoGetCollection collsColl( - opCtx, NamespaceString::kShardCollectionCatalogNamespace, MODE_IX); + AutoGetCollection userColl(opCtx, nss, MODE_IX); + AutoGetCollection collsColl(opCtx, + NamespaceString::kShardCollectionCatalogNamespace, + MODE_IX, + AutoGetCollection::Options{}.secondaryNssOrUUIDs( + {NamespaceString::kShardIndexCatalogNamespace})); { // First unset the index version. const auto query = BSON(CollectionType::kNssFieldName diff --git a/src/mongo/db/s/global_index_ddl_util.h b/src/mongo/db/s/global_index_ddl_util.h index 867367c812a..9874c1b6d75 100644 --- a/src/mongo/db/s/global_index_ddl_util.h +++ b/src/mongo/db/s/global_index_ddl_util.h @@ -88,8 +88,7 @@ void replaceCollectionGlobalIndexes(OperationContext* opCtx, * migrations and holding the critical section in all shards with data for userCollectionNss. This * function is not currently compatible with transactions. */ -void dropCollectionGlobalIndexesMetadata(OperationContext* opCtx, - const NamespaceString& userCollectionNss); +void dropCollectionGlobalIndexesMetadata(OperationContext* opCtx, const NamespaceString& nss); /** * Removes all the indexes and unset the current index version. This function should only be called diff --git a/src/mongo/db/s/shard_server_op_observer.cpp b/src/mongo/db/s/shard_server_op_observer.cpp index f8fc927d084..b3f7c68ea88 100644 --- a/src/mongo/db/s/shard_server_op_observer.cpp +++ b/src/mongo/db/s/shard_server_op_observer.cpp @@ -545,7 +545,6 @@ void ShardServerOpObserver::onModifyShardedCollectionGlobalIndexCatalogEntry( auto indexEntry = ShardingIndexCatalogInsertEntry::parse( IDLParserContext("OplogModifyCatalogEntryContext"), indexDoc); opCtx->recoveryUnit()->onCommit([opCtx, nss, indexEntry](auto _) { - AutoGetCollection autoColl(opCtx, nss, MODE_IX); auto scsr = CollectionShardingRuntime::assertCollectionLockedAndAcquireExclusive( opCtx, nss); scsr->addIndex( @@ -559,7 +558,6 @@ void ShardServerOpObserver::onModifyShardedCollectionGlobalIndexCatalogEntry( auto removeEntry = ShardingIndexCatalogRemoveEntry::parse( IDLParserContext("OplogModifyCatalogEntryContext"), indexDoc); opCtx->recoveryUnit()->onCommit([opCtx, nss, removeEntry](auto _) { - AutoGetCollection autoColl(opCtx, nss, MODE_IX); auto scsr = CollectionShardingRuntime::assertCollectionLockedAndAcquireExclusive( opCtx, nss); scsr->removeIndex(opCtx, @@ -572,7 +570,6 @@ void ShardServerOpObserver::onModifyShardedCollectionGlobalIndexCatalogEntry( auto replaceEntry = ShardingIndexCatalogReplaceEntry::parse( IDLParserContext("OplogModifyCatalogEntryContext"), indexDoc); opCtx->recoveryUnit()->onCommit([opCtx, nss, replaceEntry](auto _) { - AutoGetCollection autoColl(opCtx, nss, MODE_IX); auto scsr = CollectionShardingRuntime::assertCollectionLockedAndAcquireExclusive( opCtx, nss); scsr->replaceIndexes(opCtx, @@ -583,7 +580,6 @@ void ShardServerOpObserver::onModifyShardedCollectionGlobalIndexCatalogEntry( } case ShardingIndexCatalogOpEnumEnum::clear: opCtx->recoveryUnit()->onCommit([opCtx, nss](auto _) { - AutoGetCollection autoColl(opCtx, nss, MODE_IX); auto scsr = CollectionShardingRuntime::assertCollectionLockedAndAcquireExclusive( opCtx, nss); scsr->clearIndexes(opCtx); @@ -592,22 +588,17 @@ void ShardServerOpObserver::onModifyShardedCollectionGlobalIndexCatalogEntry( break; case ShardingIndexCatalogOpEnumEnum::drop: { opCtx->recoveryUnit()->onCommit([opCtx, nss](auto _) { - AutoGetCollection autoColl(opCtx, nss, MODE_IX); auto scsr = CollectionShardingRuntime::assertCollectionLockedAndAcquireExclusive( opCtx, nss); scsr->clearIndexes(opCtx); }); + break; } case ShardingIndexCatalogOpEnumEnum::rename: { auto renameEntry = ShardingIndexCatalogRenameEntry::parse( IDLParserContext("OplogModifyCatalogEntryContext"), indexDoc); opCtx->recoveryUnit()->onCommit([opCtx, renameEntry](auto _) { - AutoGetCollection autoCollFrom( - opCtx, - renameEntry.getFromNss(), - MODE_IX, - AutoGetCollection::Options{}.secondaryNssOrUUIDs({renameEntry.getToNss()})); std::vector fromIndexes; boost::optional uuid; { -- cgit v1.2.1