summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcos José Grillo Ramirez <marcos.grillo@mongodb.com>2023-02-06 17:15:47 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-02-06 18:00:19 +0000
commit647bfee7a2e21b6589a01dd707a9a540d60c20fe (patch)
tree125c0444e6fb8170459676657ae548be22e9309d
parent3cfdd4e9895587c1333b12f4fb63e4b777b80ae3 (diff)
downloadmongo-647bfee7a2e21b6589a01dd707a9a540d60c20fe.tar.gz
SERVER-73212 Remove collection locks on sharding index catalog shard observer's onCommit handlers
-rw-r--r--src/mongo/db/s/global_index_ddl_util.cpp51
-rw-r--r--src/mongo/db/s/global_index_ddl_util.h3
-rw-r--r--src/mongo/db/s/shard_server_op_observer.cpp11
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<UUID> 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<UUID> 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<IndexCatalogType> fromIndexes;
boost::optional<UUID> uuid;
{