summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/sharding_ddl_coordinator.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/s/sharding_ddl_coordinator.h')
-rw-r--r--src/mongo/db/s/sharding_ddl_coordinator.h17
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);
}