From f3d4df67b4e11ee8a576a68cba79fa1e81b4531d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Bruguera=20Mic=C3=B3=20=28at=20MongoDB=29?= Date: Tue, 19 May 2026 10:51:11 +0000 Subject: [PATCH] SERVER-125546 Consolidate authoritative shards feature flags into two unified flags (part 2: DDL coordinators) (#53950) GitOrigin-RevId: a4fe9d2277d1bf05199c451b85b3e2c1d1fa1cc5 --- .../ddl/collmod_coordinator.cpp | 17 ++++----- .../ddl/configsvr_create_database_command.cpp | 6 ---- .../ddl/convert_to_capped_coordinator.cpp | 29 ++++++--------- .../ddl/create_collection_coordinator.cpp | 36 +++++++++++-------- .../create_database_coordinator_document.idl | 4 --- .../ddl/drop_collection_coordinator.cpp | 16 ++++----- .../ddl/drop_database_coordinator.cpp | 16 ++++----- .../drop_database_coordinator_document.idl | 4 --- .../ddl/move_primary_coordinator_document.idl | 4 --- ...efine_collection_shard_key_coordinator.cpp | 21 +++++------ .../ddl/sharding_coordinator.idl | 4 +++ .../ddl/sharding_coordinator_service.cpp | 4 +++ .../db/global_catalog/ddl/sharding_ddl_util.h | 2 +- .../ddl/shardsvr_drop_database_command.cpp | 7 ---- .../ddl/shardsvr_merge_chunks_command.cpp | 7 ++-- .../ddl/shardsvr_move_primary_command.cpp | 5 --- .../ddl/shardsvr_split_chunk_command.cpp | 7 ++-- .../sharding_feature_flags.idl | 8 ----- 18 files changed, 75 insertions(+), 122 deletions(-) diff --git a/src/mongo/db/global_catalog/ddl/collmod_coordinator.cpp b/src/mongo/db/global_catalog/ddl/collmod_coordinator.cpp index 3c0925f3bb5..330e08d9fe0 100644 --- a/src/mongo/db/global_catalog/ddl/collmod_coordinator.cpp +++ b/src/mongo/db/global_catalog/ddl/collmod_coordinator.cpp @@ -57,7 +57,6 @@ #include "mongo/db/shard_role/shard_catalog/participant_block_gen.h" #include "mongo/db/sharding_environment/client/shard.h" #include "mongo/db/sharding_environment/grid.h" -#include "mongo/db/sharding_environment/sharding_feature_flags_gen.h" #include "mongo/db/timeseries/catalog_helper.h" #include "mongo/db/timeseries/timeseries_collmod.h" #include "mongo/db/timeseries/timeseries_options.h" @@ -142,6 +141,7 @@ void commitToGlobalCatalog(OperationContext* opCtx, template void commitToShardCatalog(OperationContext* opCtx, + AuthoritativeMetadataAccessLevelEnum metadataAccessLevel, const NamespaceString& nss, const std::vector& participantsOwningChunks, const ShardId& primaryShard, @@ -149,9 +149,7 @@ void commitToShardCatalog(OperationContext* opCtx, GetSessionFn&& getSession, const std::shared_ptr& executor, const CancellationToken& token) { - if (!feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (metadataAccessLevel == AuthoritativeMetadataAccessLevelEnum::kNone) { return; } @@ -394,9 +392,8 @@ ExecutorFuture CollModCoordinator::_runImpl( // for updating the shard catalog with current information. This flag is // evaluated at insertion time because on secondaries, metadata is cleared // during the onDelete of the critical section document. - if (feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (_doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed) { blockCRUDOperationsRequest.setClearCollMetadata(false); } @@ -426,6 +423,7 @@ ExecutorFuture CollModCoordinator::_runImpl( commitToShardCatalog( opCtx, + _doc.getAuthoritativeMetadataAccessLevel(), _collInfo->nsForTargeting, _shardingInfo->participantsOwningChunks, _shardingInfo->primaryShard, @@ -491,9 +489,8 @@ ExecutorFuture CollModCoordinator::_runImpl( request.setNeedsUnblock(needsUnblock); if (needsUnblock) { const bool isDDLAuthoritative = - feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot()); + _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed; request.setClearCollMetadata(!isDDLAuthoritative); } diff --git a/src/mongo/db/global_catalog/ddl/configsvr_create_database_command.cpp b/src/mongo/db/global_catalog/ddl/configsvr_create_database_command.cpp index 11405d6f074..b1bfa91e80d 100644 --- a/src/mongo/db/global_catalog/ddl/configsvr_create_database_command.cpp +++ b/src/mongo/db/global_catalog/ddl/configsvr_create_database_command.cpp @@ -40,7 +40,6 @@ #include "mongo/db/global_catalog/ddl/create_database_util.h" #include "mongo/db/global_catalog/ddl/sharded_ddl_commands_gen.h" #include "mongo/db/global_catalog/ddl/sharding_catalog_manager.h" -#include "mongo/db/global_catalog/ddl/sharding_ddl_util.h" #include "mongo/db/global_catalog/type_database_gen.h" #include "mongo/db/namespace_string.h" #include "mongo/db/operation_context.h" @@ -138,9 +137,6 @@ public: const auto createDatabaseDDLCoordinatorFeatureFlagEnabled = feature_flags::gCreateDatabaseDDLCoordinator.isEnabled( VersionContext::getDecoration(opCtx), fcvSnapshot); - const auto authoritativeMetadataAccessLevel = - sharding_ddl_util::getGrantedAuthoritativeMetadataAccessLevel( - VersionContext::getDecoration(opCtx), fcvSnapshot); if (!createDatabaseDDLCoordinatorFeatureFlagEnabled) { // (Ignore FCV check): The use isEnabledAndIgnoreFCVUnsafe is intentional, we @@ -166,8 +162,6 @@ public: {{NamespaceString(dbName), CoordinatorTypeEnum::kCreateDatabase}}); coordinatorDoc.setPrimaryShard(optResolvedPrimaryShard); coordinatorDoc.setUserSelectedPrimary(optResolvedPrimaryShard.is_initialized()); - coordinatorDoc.setAuthoritativeMetadataAccessLevel( - authoritativeMetadataAccessLevel); auto createDatabaseCoordinator = checked_pointer_cast( ShardingCoordinatorService::getService(opCtx)->getOrCreateInstance( diff --git a/src/mongo/db/global_catalog/ddl/convert_to_capped_coordinator.cpp b/src/mongo/db/global_catalog/ddl/convert_to_capped_coordinator.cpp index ffef1a2e723..31ae5735bfe 100644 --- a/src/mongo/db/global_catalog/ddl/convert_to_capped_coordinator.cpp +++ b/src/mongo/db/global_catalog/ddl/convert_to_capped_coordinator.cpp @@ -45,7 +45,6 @@ #include "mongo/db/shard_role/shard_catalog/shard_filtering_metadata_refresh.h" #include "mongo/db/shard_role/shard_role.h" #include "mongo/db/sharding_environment/grid.h" -#include "mongo/db/sharding_environment/sharding_feature_flags_gen.h" #include "mongo/db/sharding_environment/sharding_logging.h" #include "mongo/db/topology/sharding_state.h" #include "mongo/db/topology/vector_clock/vector_clock_mutable.h" @@ -361,10 +360,8 @@ ExecutorFuture ConvertToCappedCoordinator::_runImpl( }(); if (_doc.getOriginalCollection().has_value()) { - const bool isAuthoritative = - feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot()); + const bool isAuthoritative = _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed; { const auto session = getNewSession(opCtx); @@ -470,10 +467,8 @@ ExecutorFuture ConvertToCappedCoordinator::_runImpl( // When the original collection was not tracked, there is no need to clear the // filtering metadata upon releasing the critical section because no changes to the // global / shard catalog were made. - const bool isAuthoritative = - feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot()); + const bool isAuthoritative = _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed; std::unique_ptr actionPtr; if (isAuthoritative) { @@ -569,10 +564,8 @@ ExecutorFuture ConvertToCappedCoordinator::_cleanupOnAbort( _exitCriticalSectionOnDataShard(opCtx, executor, token); } - const bool isAuthoritative = - feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot()); + const bool isAuthoritative = _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed; std::unique_ptr actionPtr; if (isAuthoritative) { @@ -606,9 +599,8 @@ void ConvertToCappedCoordinator::_enterCriticalSectionOnDataShard( // releasing the critical section; the commit phase is responsible for updating the shard // catalog with current information. This flag is evaluated at insertion time because on // secondaries, metadata is cleared during the onDelete of the critical section document. - if (feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (_doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed) { blockCRUDOperationsRequest.setClearCollMetadata(false); } @@ -632,9 +624,8 @@ void ConvertToCappedCoordinator::_exitCriticalSectionOnDataShard( // releasing the critical section; the commit phase is responsible for updating the shard // catalog (both durable and in-memory) with current information on both primary and secondary // nodes. - if (feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (_doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed) { unblockCRUDOperationsRequest.setClearCollMetadata(false); } diff --git a/src/mongo/db/global_catalog/ddl/create_collection_coordinator.cpp b/src/mongo/db/global_catalog/ddl/create_collection_coordinator.cpp index 6b1ac93009b..25f5fa477d2 100644 --- a/src/mongo/db/global_catalog/ddl/create_collection_coordinator.cpp +++ b/src/mongo/db/global_catalog/ddl/create_collection_coordinator.cpp @@ -1139,6 +1139,7 @@ void enterCriticalSectionsOnCoordinator(OperationContext* opCtx, } void exitCriticalSectionsOnCoordinator(OperationContext* opCtx, + AuthoritativeMetadataAccessLevelEnum metadataAccessLevel, bool throwIfReasonDiffers, const BSONObj& critSecReason, const NamespaceString& originalNss) { @@ -1147,9 +1148,8 @@ void exitCriticalSectionsOnCoordinator(OperationContext* opCtx, ? originalNss.getTimeseriesViewNamespace() : originalNss; - const bool clearFilteringMetadata = !feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot()); + const bool clearFilteringMetadata = + metadataAccessLevel == AuthoritativeMetadataAccessLevelEnum::kNone; std::unique_ptr actionPtr; if (clearFilteringMetadata) { @@ -1529,9 +1529,8 @@ void CreateCollectionCoordinator::_exitCriticalSectionOnShards( // releasing the critical section; the commit phase is responsible for updating the shard // catalog (both durable and in-memory) with current information on both primary and secondary // nodes. - bool isDDLAuthoritative = feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot()); + bool isDDLAuthoritative = _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed; if (isDDLAuthoritative) { unblockCRUDOperationsRequest.setClearCollMetadata(false); } @@ -1576,8 +1575,11 @@ ExecutorFuture CreateCollectionCoordinator::_runImpl( LOGV2(8119050, "Found that collection already exists with matching option after taking " "the collection critical section"); - exitCriticalSectionsOnCoordinator( - opCtx, _firstExecution, _critSecReason, originalNss()); + exitCriticalSectionsOnCoordinator(opCtx, + _doc.getAuthoritativeMetadataAccessLevel(), + _firstExecution, + _critSecReason, + originalNss()); throw ex; } })) @@ -2380,9 +2382,7 @@ void CreateCollectionCoordinator::_commitOnShardCatalog( OperationContext* opCtx, const std::shared_ptr& executor, const CancellationToken& token) { - if (!feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (_doc.getAuthoritativeMetadataAccessLevel() == AuthoritativeMetadataAccessLevelEnum::kNone) { return; } @@ -2508,8 +2508,11 @@ void CreateCollectionCoordinator::_exitCriticalSection( // If the coordinator successfully committed the collection during a previous execution, the // critical section may have already been released. In such case, it is safe to skip the release // if the reason does not match because a migration may have already re-acquired it. - exitCriticalSectionsOnCoordinator( - opCtx, _firstExecution /* throwIfReasonDiffers */, _critSecReason, originalNss()); + exitCriticalSectionsOnCoordinator(opCtx, + _doc.getAuthoritativeMetadataAccessLevel(), + _firstExecution /* throwIfReasonDiffers */, + _critSecReason, + originalNss()); } ExecutorFuture CreateCollectionCoordinator::_cleanupOnAbort( @@ -2563,8 +2566,11 @@ ExecutorFuture CreateCollectionCoordinator::_cleanupOnAbort( // Exit both critical sections on the coordinator - exitCriticalSectionsOnCoordinator( - opCtx, true /* throwIfReasonDiffers */, _critSecReason, originalNss()); + exitCriticalSectionsOnCoordinator(opCtx, + _doc.getAuthoritativeMetadataAccessLevel(), + true /* throwIfReasonDiffers */, + _critSecReason, + originalNss()); }) .onError([this, anchor = shared_from_this()](const Status& status) { const auto opCtxHolder = makeOperationContext(); diff --git a/src/mongo/db/global_catalog/ddl/create_database_coordinator_document.idl b/src/mongo/db/global_catalog/ddl/create_database_coordinator_document.idl index d3bc8aaf009..514ea724b3b 100644 --- a/src/mongo/db/global_catalog/ddl/create_database_coordinator_document.idl +++ b/src/mongo/db/global_catalog/ddl/create_database_coordinator_document.idl @@ -66,7 +66,3 @@ structs: userSelectedPrimary: type: bool description: "If the primary shard was specified by the user." - authoritativeMetadataAccessLevel: - type: AuthoritativeMetadataAccessLevel - description: "The access level to authoritative metadata granted by the FCV state at the creation of this document." - default: kNone diff --git a/src/mongo/db/global_catalog/ddl/drop_collection_coordinator.cpp b/src/mongo/db/global_catalog/ddl/drop_collection_coordinator.cpp index f9b6cec6152..41bddf07d0d 100644 --- a/src/mongo/db/global_catalog/ddl/drop_collection_coordinator.cpp +++ b/src/mongo/db/global_catalog/ddl/drop_collection_coordinator.cpp @@ -49,7 +49,6 @@ #include "mongo/db/shard_role/shard_catalog/participant_block_gen.h" #include "mongo/db/shard_role/shard_catalog/shard_filtering_metadata_refresh.h" #include "mongo/db/sharding_environment/grid.h" -#include "mongo/db/sharding_environment/sharding_feature_flags_gen.h" #include "mongo/db/sharding_environment/sharding_logging.h" #include "mongo/db/topology/sharding_state.h" #include "mongo/db/topology/vector_clock/vector_clock_mutable.h" @@ -297,9 +296,8 @@ void DropCollectionCoordinator::_enterCriticalSection( // catalog with current information. This flag is evaluated at insertion time because on // secondaries, metadata is cleared during the onDelete of the critical section document. if (collIsTracked && - feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed) { blockCRUDOperationsRequest.setClearCollMetadata(false); } @@ -372,9 +370,8 @@ void DropCollectionCoordinator::_commitDropCollection( sharding_ddl_util::removeQueryAnalyzerMetadata(opCtx, nss(), session); } - bool isAuthoritative = feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot()); + bool isAuthoritative = _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed; if (collIsTracked) { tassert(10644514, @@ -494,9 +491,8 @@ void DropCollectionCoordinator::_exitCriticalSection( // catalog (both durable and in-memory) with current information on both primary and secondary // nodes. if (collIsTracked && - feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed) { unblockCRUDOperationsRequest.setClearCollMetadata(false); } diff --git a/src/mongo/db/global_catalog/ddl/drop_database_coordinator.cpp b/src/mongo/db/global_catalog/ddl/drop_database_coordinator.cpp index 0263b0351fe..377e392f1f2 100644 --- a/src/mongo/db/global_catalog/ddl/drop_database_coordinator.cpp +++ b/src/mongo/db/global_catalog/ddl/drop_database_coordinator.cpp @@ -62,7 +62,6 @@ #include "mongo/db/shard_role/shard_catalog/participant_block_gen.h" #include "mongo/db/sharding_environment/grid.h" #include "mongo/db/sharding_environment/shard_id.h" -#include "mongo/db/sharding_environment/sharding_feature_flags_gen.h" #include "mongo/db/sharding_environment/sharding_logging.h" #include "mongo/db/tenant_id.h" #include "mongo/db/topology/shard_registry.h" @@ -308,9 +307,8 @@ void DropDatabaseCoordinator::_dropTrackedCollection( // releasing the critical section; the commit phase is responsible for updating the shard // catalog with current information. This flag is evaluated at insertion time because on // secondaries, metadata is cleared during the onDelete of the critical section document. - if (feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (_doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed) { blockCRUDOperationsRequest.setClearCollMetadata(false); } @@ -338,9 +336,8 @@ void DropDatabaseCoordinator::_dropTrackedCollection( sharding_ddl_util::removeTagsMetadataFromConfig(opCtx, nss, session); } - bool isAuthoritative = feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot()); + bool isAuthoritative = _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed; if (isAuthoritative) { const auto session = getNewSession(opCtx); @@ -426,9 +423,8 @@ void DropDatabaseCoordinator::_dropTrackedCollection( // releasing the critical section; the commit phase is responsible for updating the shard // catalog (both durable and in-memory) with current information on both primary and // secondary nodes. - if (feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (_doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed) { unblockCRUDOperationsRequest.setClearCollMetadata(false); } diff --git a/src/mongo/db/global_catalog/ddl/drop_database_coordinator_document.idl b/src/mongo/db/global_catalog/ddl/drop_database_coordinator_document.idl index e3fd2254cb0..51b4634d366 100644 --- a/src/mongo/db/global_catalog/ddl/drop_database_coordinator_document.idl +++ b/src/mongo/db/global_catalog/ddl/drop_database_coordinator_document.idl @@ -77,7 +77,3 @@ structs: "The identity of the Shard that will generate the op log entries about the sharded/unsplittable collection being dropped (which drive the behavior of change stream readers V2)." optional: true - authoritativeMetadataAccessLevel: - type: AuthoritativeMetadataAccessLevel - description: "The access level to authoritative metadata granted by the FCV state at the creation of this document." - default: kNone diff --git a/src/mongo/db/global_catalog/ddl/move_primary_coordinator_document.idl b/src/mongo/db/global_catalog/ddl/move_primary_coordinator_document.idl index adcc79a05ee..8d4ee3f7f8c 100644 --- a/src/mongo/db/global_catalog/ddl/move_primary_coordinator_document.idl +++ b/src/mongo/db/global_catalog/ddl/move_primary_coordinator_document.idl @@ -70,7 +70,3 @@ structs: type: array description: "List of collections to be cloned by the destination shard." optional: true - authoritativeMetadataAccessLevel: - type: AuthoritativeMetadataAccessLevel - description: "The access level to authoritative metadata granted by the FCV state at the creation of this document." - default: kNone diff --git a/src/mongo/db/global_catalog/ddl/refine_collection_shard_key_coordinator.cpp b/src/mongo/db/global_catalog/ddl/refine_collection_shard_key_coordinator.cpp index bdfd8593c56..da524312f17 100644 --- a/src/mongo/db/global_catalog/ddl/refine_collection_shard_key_coordinator.cpp +++ b/src/mongo/db/global_catalog/ddl/refine_collection_shard_key_coordinator.cpp @@ -57,7 +57,6 @@ #include "mongo/db/shard_role/shard_catalog/shard_filtering_metadata_refresh.h" #include "mongo/db/sharding_environment/client/shard.h" #include "mongo/db/sharding_environment/grid.h" -#include "mongo/db/sharding_environment/sharding_feature_flags_gen.h" #include "mongo/db/sharding_environment/sharding_logging.h" #include "mongo/db/topology/shard_registry.h" #include "mongo/db/topology/sharding_state.h" @@ -281,9 +280,8 @@ ExecutorFuture RefineCollectionShardKeyCoordinator::_runImpl( // the shard catalog with current information. This flag is evaluated at insertion // time because on secondaries, metadata is cleared during the onDelete of the // critical section document. - if (feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (_doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed) { blockCRUDOperationsRequest.setClearCollMetadata(false); } @@ -342,9 +340,8 @@ ExecutorFuture RefineCollectionShardKeyCoordinator::_runImpl( uassertStatusOK(Shard::CommandResponse::getEffectiveStatus(commitResponse)); - if (feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (_doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed) { const auto involvedShards = getShardsWithDataForCollection(opCtx, nss()); const auto session = getNewSession(opCtx); sharding_ddl_util::commitRefineCollectionShardKeyToShardCatalog( @@ -393,9 +390,8 @@ ExecutorFuture RefineCollectionShardKeyCoordinator::_runImpl( auto opCtxHolder = makeOperationContext(); auto* opCtx = opCtxHolder.get(); - if (!feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot())) { + if (_doc.getAuthoritativeMetadataAccessLevel() == + AuthoritativeMetadataAccessLevelEnum::kNone) { // Refresh all shards so cache is warmed up for queries. sharding_util::tellShardsToRefreshCollection( opCtx, getShardsWithDataForCollection(opCtx, nss()), nss(), **executor); @@ -467,9 +463,8 @@ void RefineCollectionShardKeyCoordinator::_exitCriticalSection( // releasing the critical section; the commit phase is responsible for updating the shard // catalog (both durable and in-memory) with current information on both primary and secondary // nodes. - bool isDDLAuthoritative = feature_flags::gShardAuthoritativeCollMetadata.isEnabled( - VersionContext::getDecoration(opCtx), - serverGlobalParams.featureCompatibility.acquireFCVSnapshot()); + bool isDDLAuthoritative = _doc.getAuthoritativeMetadataAccessLevel() >= + AuthoritativeMetadataAccessLevelEnum::kWritesAllowed; if (isDDLAuthoritative) { unblockCRUDOperationsRequest.setClearCollMetadata(false); } diff --git a/src/mongo/db/global_catalog/ddl/sharding_coordinator.idl b/src/mongo/db/global_catalog/ddl/sharding_coordinator.idl index c61eb8e8943..0b56f6c4d27 100644 --- a/src/mongo/db/global_catalog/ddl/sharding_coordinator.idl +++ b/src/mongo/db/global_catalog/ddl/sharding_coordinator.idl @@ -143,3 +143,7 @@ structs: description: "Error triggering the cleanup pipeline" type: error_status optional: true + authoritativeMetadataAccessLevel: + type: AuthoritativeMetadataAccessLevel + description: "The access level to authoritative metadata granted by the FCV state at the creation of this document." + default: kNone diff --git a/src/mongo/db/global_catalog/ddl/sharding_coordinator_service.cpp b/src/mongo/db/global_catalog/ddl/sharding_coordinator_service.cpp index 2a20ba06b51..805279b3fa3 100644 --- a/src/mongo/db/global_catalog/ddl/sharding_coordinator_service.cpp +++ b/src/mongo/db/global_catalog/ddl/sharding_coordinator_service.cpp @@ -56,6 +56,7 @@ #include "mongo/db/global_catalog/ddl/rename_collection_coordinator.h" #include "mongo/db/global_catalog/ddl/set_allow_migrations_coordinator.h" #include "mongo/db/global_catalog/ddl/sharding_coordinator.h" +#include "mongo/db/global_catalog/ddl/sharding_ddl_util.h" #include "mongo/db/global_catalog/ddl/split_chunk_coordinator.h" #include "mongo/db/global_catalog/ddl/timeseries_upgrade_downgrade_coordinator.h" #include "mongo/db/global_catalog/ddl/untrack_unsplittable_collection_coordinator.h" @@ -432,6 +433,9 @@ ShardingCoordinatorService::getOrCreateInstance(OperationContext* opCtx, coorMetadata.setDatabaseVersion( OperationShardingState::get(opCtx).getDbVersion(coorMetadata.getId().getNss().dbName())); coorMetadata.setForwardableOpMetadata(forwardableOpMetadata); + coorMetadata.setAuthoritativeMetadataAccessLevel( + sharding_ddl_util::getGrantedAuthoritativeMetadataAccessLevel( + VersionContext::getDecoration(opCtx), fcvRegion->acquireFCVSnapshot())); const auto patchedCoorDoc = coorDoc.addFields(coorMetadata.toBSON()); auto [coordinator, created] = [&] { diff --git a/src/mongo/db/global_catalog/ddl/sharding_ddl_util.h b/src/mongo/db/global_catalog/ddl/sharding_ddl_util.h index da95351ed37..c3407e24f86 100644 --- a/src/mongo/db/global_catalog/ddl/sharding_ddl_util.h +++ b/src/mongo/db/global_catalog/ddl/sharding_ddl_util.h @@ -431,7 +431,7 @@ MONGO_MOD_PRIVATE void commitCreateCollectionMetadataToShardCatalog( /** * Based on the FCV, get the where the DDL needs to act accordingly to the database - * authoritativeness. + * or collection metadata authoritativeness. */ MONGO_MOD_NEEDS_REPLACEMENT AuthoritativeMetadataAccessLevelEnum getGrantedAuthoritativeMetadataAccessLevel(const VersionContext& vCtx, diff --git a/src/mongo/db/global_catalog/ddl/shardsvr_drop_database_command.cpp b/src/mongo/db/global_catalog/ddl/shardsvr_drop_database_command.cpp index 178c02cdac1..9c01a9f8242 100644 --- a/src/mongo/db/global_catalog/ddl/shardsvr_drop_database_command.cpp +++ b/src/mongo/db/global_catalog/ddl/shardsvr_drop_database_command.cpp @@ -38,7 +38,6 @@ #include "mongo/db/global_catalog/ddl/sharded_ddl_commands_gen.h" #include "mongo/db/global_catalog/ddl/sharding_coordinator_gen.h" #include "mongo/db/global_catalog/ddl/sharding_coordinator_service.h" -#include "mongo/db/global_catalog/ddl/sharding_ddl_util.h" #include "mongo/db/namespace_string.h" #include "mongo/db/operation_context.h" #include "mongo/db/profile_settings.h" @@ -114,16 +113,10 @@ public: // which cannot be nested. Therefore, the VersionContext shouldn't have // an OFCV yet. invariant(!VersionContext::getDecoration(opCtx).hasOperationFCV()); - const auto authoritativeMetadataAccessLevel = - sharding_ddl_util::getGrantedAuthoritativeMetadataAccessLevel( - VersionContext::getDecoration(opCtx), - fcvRegion->acquireFCVSnapshot()); DropDatabaseCoordinatorDocument coordinatorDoc; coordinatorDoc.setShardingCoordinatorMetadata( {{ns(), CoordinatorTypeEnum::kDropDatabase}}); - coordinatorDoc.setAuthoritativeMetadataAccessLevel( - authoritativeMetadataAccessLevel); dropDatabaseCoordinator = checked_pointer_cast( service->getOrCreateInstance( diff --git a/src/mongo/db/global_catalog/ddl/shardsvr_merge_chunks_command.cpp b/src/mongo/db/global_catalog/ddl/shardsvr_merge_chunks_command.cpp index aa43302abe4..626233be474 100644 --- a/src/mongo/db/global_catalog/ddl/shardsvr_merge_chunks_command.cpp +++ b/src/mongo/db/global_catalog/ddl/shardsvr_merge_chunks_command.cpp @@ -41,6 +41,7 @@ #include "mongo/db/global_catalog/ddl/merge_chunk_request_gen.h" #include "mongo/db/global_catalog/ddl/merge_chunks_coordinator.h" #include "mongo/db/global_catalog/ddl/sharding_catalog_manager.h" +#include "mongo/db/global_catalog/ddl/sharding_ddl_util.h" #include "mongo/db/namespace_string.h" #include "mongo/db/operation_context.h" #include "mongo/db/repl/read_concern_args.h" @@ -52,7 +53,6 @@ #include "mongo/db/shard_role/shard_catalog/collection_sharding_runtime.h" #include "mongo/db/shard_role/shard_catalog/shard_filtering_metadata_refresh.h" #include "mongo/db/sharding_environment/grid.h" -#include "mongo/db/sharding_environment/sharding_feature_flags_gen.h" #include "mongo/db/sharding_environment/sharding_runtime_d_params_gen.h" #include "mongo/db/topology/cluster_role.h" #include "mongo/db/topology/sharding_state.h" @@ -92,9 +92,10 @@ bool tryRunMergeChunksCoordinator(OperationContext* opCtx, for (int retries = 0; retries < maxConflictRetries; ++retries) { boost::optional optFixedFcvRegion{boost::in_place_init, opCtx}; - if (!feature_flags::gShardAuthoritativeCollMetadata.isEnabled( + if (sharding_ddl_util::getGrantedAuthoritativeMetadataAccessLevel( VersionContext::getDecoration(opCtx), - optFixedFcvRegion.get()->acquireFCVSnapshot())) { + optFixedFcvRegion.get()->acquireFCVSnapshot()) == + AuthoritativeMetadataAccessLevelEnum::kNone) { return false; } diff --git a/src/mongo/db/global_catalog/ddl/shardsvr_move_primary_command.cpp b/src/mongo/db/global_catalog/ddl/shardsvr_move_primary_command.cpp index d6f33cdae16..1655fe1a164 100644 --- a/src/mongo/db/global_catalog/ddl/shardsvr_move_primary_command.cpp +++ b/src/mongo/db/global_catalog/ddl/shardsvr_move_primary_command.cpp @@ -49,7 +49,6 @@ #include "mongo/db/sharding_environment/client/shard.h" #include "mongo/db/sharding_environment/grid.h" #include "mongo/db/sharding_environment/shard_id.h" -#include "mongo/db/sharding_environment/sharding_feature_flags_gen.h" #include "mongo/db/topology/shard_registry.h" #include "mongo/db/topology/sharding_state.h" #include "mongo/util/assert_util.h" @@ -102,9 +101,6 @@ public: // The Operation FCV is currently propagated only for DDL operations, // which cannot be nested. Therefore, the VersionContext shouldn't have an OFCV yet. invariant(!VersionContext::getDecoration(opCtx).hasOperationFCV()); - const auto authoritativeMetadataAccessLevel = - sharding_ddl_util::getGrantedAuthoritativeMetadataAccessLevel( - VersionContext::getDecoration(opCtx), fcvRegion->acquireFCVSnapshot()); auto shardRegistry = Grid::get(opCtx)->shardRegistry(); // Ensure that the shard information is up-to-date as possible to catch the case @@ -120,7 +116,6 @@ public: doc.setShardingCoordinatorMetadata( {{dbNss, CoordinatorTypeEnum::kMovePrimary}}); doc.setToShardId(toShard->getId()); - doc.setAuthoritativeMetadataAccessLevel(authoritativeMetadataAccessLevel); return doc.toBSON(); }(); diff --git a/src/mongo/db/global_catalog/ddl/shardsvr_split_chunk_command.cpp b/src/mongo/db/global_catalog/ddl/shardsvr_split_chunk_command.cpp index 8327d595aa5..58875146f8b 100644 --- a/src/mongo/db/global_catalog/ddl/shardsvr_split_chunk_command.cpp +++ b/src/mongo/db/global_catalog/ddl/shardsvr_split_chunk_command.cpp @@ -33,6 +33,7 @@ #include "mongo/db/commands.h" #include "mongo/db/commands/feature_compatibility_version.h" #include "mongo/db/global_catalog/ddl/sharded_ddl_commands_gen.h" +#include "mongo/db/global_catalog/ddl/sharding_ddl_util.h" #include "mongo/db/global_catalog/ddl/split_chunk.h" #include "mongo/db/global_catalog/ddl/split_chunk_coordinator.h" #include "mongo/db/global_catalog/type_chunk.h" @@ -40,7 +41,6 @@ #include "mongo/db/s/chunk_operation_precondition_checks.h" #include "mongo/db/service_context.h" #include "mongo/db/shard_role/shard_catalog/shard_filtering_metadata_refresh.h" -#include "mongo/db/sharding_environment/sharding_feature_flags_gen.h" #include "mongo/db/sharding_environment/sharding_runtime_d_params_gen.h" #include "mongo/db/topology/sharding_state.h" #include "mongo/db/version_context.h" @@ -76,9 +76,10 @@ bool tryRunSplitChunkCoordinator(OperationContext* opCtx, for (int retries = 0; retries < maxConflictRetries; ++retries) { boost::optional optFixedFcvRegion{boost::in_place_init, opCtx}; - if (!feature_flags::gShardAuthoritativeCollMetadata.isEnabled( + if (sharding_ddl_util::getGrantedAuthoritativeMetadataAccessLevel( VersionContext::getDecoration(opCtx), - optFixedFcvRegion.get()->acquireFCVSnapshot())) { + optFixedFcvRegion.get()->acquireFCVSnapshot()) == + AuthoritativeMetadataAccessLevelEnum::kNone) { return false; } diff --git a/src/mongo/db/sharding_environment/sharding_feature_flags.idl b/src/mongo/db/sharding_environment/sharding_feature_flags.idl index 2bafa4293ec..363c90959d3 100644 --- a/src/mongo/db/sharding_environment/sharding_feature_flags.idl +++ b/src/mongo/db/sharding_environment/sharding_feature_flags.idl @@ -146,14 +146,6 @@ feature_flags: default: false fcv_gated: true enable_on_transitional_fcv_UNSAFE: true - # TODO (SERVER-89169): remove once 9.0 becomes last LTS. - featureFlagShardAuthoritativeCollMetadata: - description: - "Feature flag to enable the authoritative model for storing shard-local information - for collections and chunks metadata." - cpp_varname: feature_flags::gShardAuthoritativeCollMetadata - default: false - fcv_gated: true # TODO (SERVER-100309): remove once 9.0 becomes last LTS. featureFlagSessionsCollectionCoordinatorOnConfigServer: description: