summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorEsha Maharishi <esha.maharishi@mongodb.com>2019-12-31 19:46:42 +0000
committerevergreen <evergreen@mongodb.com>2019-12-31 19:46:42 +0000
commitdfc7fff94015eceac518170585fce0fe112619ad (patch)
tree459333e1dc9f643b388c91ff4e13f5e058678077 /src/mongo/db
parent5915a6239f48ee8371802ff3c159d26f1804fc4b (diff)
downloadmongo-dfc7fff94015eceac518170585fce0fe112619ad.tar.gz
SERVER-45323 Make MigrationCoordinator persist the decision before sending the decision to itself and the recipient
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/s/migration_coordinator.cpp6
-rw-r--r--src/mongo/db/s/migration_coordinator_document.idl4
-rw-r--r--src/mongo/db/s/migration_util.cpp17
-rw-r--r--src/mongo/db/s/migration_util.h12
4 files changed, 39 insertions, 0 deletions
diff --git a/src/mongo/db/s/migration_coordinator.cpp b/src/mongo/db/s/migration_coordinator.cpp
index 8b59fea4366..0ce9e9a5b18 100644
--- a/src/mongo/db/s/migration_coordinator.cpp
+++ b/src/mongo/db/s/migration_coordinator.cpp
@@ -79,6 +79,9 @@ void MigrationCoordinator::startMigration(OperationContext* opCtx, bool waitForD
}
void MigrationCoordinator::commitMigrationOnDonorAndRecipient(OperationContext* opCtx) {
+ LOG(0) << _logPrefix() << "Making commit decision durable";
+ migrationutil::persistCommitDecision(opCtx, _migrationInfo.getId());
+
LOG(0) << _logPrefix() << "Deleting range deletion task on recipient";
migrationutil::deleteRangeDeletionTaskOnRecipient(opCtx,
_migrationInfo.getRecipientShardId(),
@@ -91,6 +94,9 @@ void MigrationCoordinator::commitMigrationOnDonorAndRecipient(OperationContext*
}
void MigrationCoordinator::abortMigrationOnDonorAndRecipient(OperationContext* opCtx) {
+ LOG(0) << _logPrefix() << "Making abort decision durable";
+ migrationutil::persistAbortDecision(opCtx, _migrationInfo.getId());
+
LOG(0) << _logPrefix() << "Deleting range deletion task on donor";
migrationutil::deleteRangeDeletionTaskLocally(opCtx, _migrationInfo.getId());
diff --git a/src/mongo/db/s/migration_coordinator_document.idl b/src/mongo/db/s/migration_coordinator_document.idl
index e5e4f1a5ab1..74814abda01 100644
--- a/src/mongo/db/s/migration_coordinator_document.idl
+++ b/src/mongo/db/s/migration_coordinator_document.idl
@@ -73,3 +73,7 @@ structs:
preMigrationChunkVersion:
type: ChunkVersion
description: "The version, at the start of the migration, of the chunk being moved."
+ decision:
+ type: string
+ description: "Whether the migration committed or aborted."
+ optional: true
diff --git a/src/mongo/db/s/migration_util.cpp b/src/mongo/db/s/migration_util.cpp
index e9628544bfd..c6bee0d5377 100644
--- a/src/mongo/db/s/migration_util.cpp
+++ b/src/mongo/db/s/migration_util.cpp
@@ -331,6 +331,23 @@ void persistRangeDeletionTaskLocally(OperationContext* opCtx,
}
}
+void persistCommitDecision(OperationContext* opCtx, const UUID& migrationId) {
+ PersistentTaskStore<MigrationCoordinatorDocument> store(
+ opCtx, NamespaceString::kMigrationCoordinatorsNamespace);
+ store.update(
+ opCtx,
+ QUERY(MigrationCoordinatorDocument::kIdFieldName << migrationId),
+ BSON("$set" << BSON(MigrationCoordinatorDocument::kDecisionFieldName << "committed")));
+}
+
+void persistAbortDecision(OperationContext* opCtx, const UUID& migrationId) {
+ PersistentTaskStore<MigrationCoordinatorDocument> store(
+ opCtx, NamespaceString::kMigrationCoordinatorsNamespace);
+ store.update(
+ opCtx,
+ QUERY(MigrationCoordinatorDocument::kIdFieldName << migrationId),
+ BSON("$set" << BSON(MigrationCoordinatorDocument::kDecisionFieldName << "aborted")));
+}
void deleteRangeDeletionTaskOnRecipient(OperationContext* opCtx,
const ShardId& recipientId,
const UUID& migrationId,
diff --git a/src/mongo/db/s/migration_util.h b/src/mongo/db/s/migration_util.h
index 92daa285d31..8f99930f601 100644
--- a/src/mongo/db/s/migration_util.h
+++ b/src/mongo/db/s/migration_util.h
@@ -116,6 +116,18 @@ void persistRangeDeletionTaskLocally(OperationContext* opCtx,
const RangeDeletionTask& deletionTask);
/**
+ * Updates the migration coordinator document to set the decision field to "committed" and waits for
+ * majority writeConcern.
+ */
+void persistCommitDecision(OperationContext* opCtx, const UUID& migrationId);
+
+/**
+ * Updates the migration coordinator document to set the decision field to "aborted" and waits for
+ * majority writeConcern.
+ */
+void persistAbortDecision(OperationContext* opCtx, const UUID& migrationId);
+
+/**
* Deletes the range deletion task document with the specified id from config.rangeDeletions and
* waits for majority write concern.
*/