diff options
Diffstat (limited to 'src/mongo/db/s/sharding_ddl_coordinator.h')
-rw-r--r-- | src/mongo/db/s/sharding_ddl_coordinator.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/mongo/db/s/sharding_ddl_coordinator.h b/src/mongo/db/s/sharding_ddl_coordinator.h index c9e15c6fdf2..c41eb6f6cec 100644 --- a/src/mongo/db/s/sharding_ddl_coordinator.h +++ b/src/mongo/db/s/sharding_ddl_coordinator.h @@ -33,6 +33,8 @@ #include "mongo/db/namespace_string.h" #include "mongo/db/operation_context.h" #include "mongo/db/persistent_task_store.h" +#include "mongo/db/repl/replication_coordinator.h" +#include "mongo/db/repl/wait_for_majority_service.h" #include "mongo/db/s/dist_lock_manager.h" #include "mongo/db/s/forwardable_operation_metadata.h" #include "mongo/db/s/sharding_ddl_coordinator_gen.h" @@ -114,7 +116,18 @@ protected: auto opCtx = cc().makeOperationContext(); PersistentTaskStore<StateDoc> store(NamespaceString::kShardingDDLCoordinatorsNamespace); - store.add(opCtx.get(), newDoc, WriteConcerns::kMajorityWriteConcernShardingTimeout); + try { + store.add(opCtx.get(), newDoc, WriteConcerns::kMajorityWriteConcernNoTimeout); + } catch (const ExceptionFor<ErrorCodes::DuplicateKey>&) { + // A series of step-up and step-down events can cause a node to try and insert the + // document when it has already been persisted locally, but we must still wait for + // majority commit. + const auto replCoord = repl::ReplicationCoordinator::get(opCtx.get()); + const auto lastLocalOpTime = replCoord->getMyLastAppliedOpTime(); + WaitForMajorityService::get(opCtx->getServiceContext()) + .waitUntilMajority(lastLocalOpTime, opCtx.get()->getCancellationToken()) + .get(opCtx.get()); + } return std::move(newDoc); } @@ -126,7 +139,7 @@ protected: store.update(opCtx, BSON(StateDoc::kIdFieldName << newDoc.getId().toBSON()), newDoc.toBSON(), - WriteConcerns::kMajorityWriteConcernShardingTimeout); + WriteConcerns::kMajorityWriteConcernNoTimeout); return std::move(newDoc); } |