diff options
author | Tommaso Tocci <tommaso.tocci@mongodb.com> | 2022-03-21 20:20:46 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-03-21 22:26:07 +0000 |
commit | dd3239281d72d42aa48c268794446f5a18730e37 (patch) | |
tree | f5e8aecc089ad91af2e3b7308034b5462ee910ff /src/mongo/db/s/shardsvr_create_collection_command.cpp | |
parent | 3c6cae457889f39aee38555022ad62db76d0dd34 (diff) | |
download | mongo-dd3239281d72d42aa48c268794446f5a18730e37.tar.gz |
SERVER-64721 Drain incompatible createCollectionCoordinator on FCV downgrade
Diffstat (limited to 'src/mongo/db/s/shardsvr_create_collection_command.cpp')
-rw-r--r-- | src/mongo/db/s/shardsvr_create_collection_command.cpp | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/src/mongo/db/s/shardsvr_create_collection_command.cpp b/src/mongo/db/s/shardsvr_create_collection_command.cpp index d1312c7b3db..1bcff6e6dbc 100644 --- a/src/mongo/db/s/shardsvr_create_collection_command.cpp +++ b/src/mongo/db/s/shardsvr_create_collection_command.cpp @@ -32,6 +32,7 @@ #include "mongo/db/auth/authorization_session.h" #include "mongo/db/catalog/collection_catalog.h" #include "mongo/db/commands.h" +#include "mongo/db/commands/feature_compatibility_version.h" #include "mongo/db/s/create_collection_coordinator.h" #include "mongo/db/s/sharding_ddl_coordinator_service.h" #include "mongo/db/s/sharding_state.h" @@ -137,13 +138,32 @@ public: *createCmdRequest.getTimeseries(), *createCmdRequest.getShardKey()))); } - auto coordinatorDoc = CreateCollectionCoordinatorDocument(); - coordinatorDoc.setShardingDDLCoordinatorMetadata( - {{std::move(nss), DDLCoordinatorTypeEnum::kCreateCollection}}); - coordinatorDoc.setCreateCollectionRequest(std::move(createCmdRequest)); - auto service = ShardingDDLCoordinatorService::getService(opCtx); - auto createCollectionCoordinator = checked_pointer_cast<CreateCollectionCoordinator>( - service->getOrCreateInstance(opCtx, coordinatorDoc.toBSON())); + const auto createCollectionCoordinator = [&] { + FixedFCVRegion fixedFcvRegion(opCtx); + + auto coordinatorDoc = [&] { + if (serverGlobalParams.featureCompatibility.isLessThan( + multiversion::FeatureCompatibilityVersion::kVersion_6_0)) { + auto doc = CreateCollectionCoordinatorDocumentPre60Compatible(); + doc.setShardingDDLCoordinatorMetadata( + {{std::move(nss), + DDLCoordinatorTypeEnum::kCreateCollectionPre60Compatible}}); + doc.setCreateCollectionRequest(std::move(createCmdRequest)); + return doc.toBSON(); + } else { + auto doc = CreateCollectionCoordinatorDocument(); + doc.setShardingDDLCoordinatorMetadata( + {{std::move(nss), DDLCoordinatorTypeEnum::kCreateCollection}}); + doc.setCreateCollectionRequest(std::move(createCmdRequest)); + return doc.toBSON(); + } + }(); + + auto service = ShardingDDLCoordinatorService::getService(opCtx); + return checked_pointer_cast<CreateCollectionCoordinator>( + service->getOrCreateInstance(opCtx, std::move(coordinatorDoc))); + }(); + return createCollectionCoordinator->getResult(opCtx); } |