diff options
author | Esha Maharishi <esha.maharishi@mongodb.com> | 2019-12-31 19:46:42 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-12-31 19:46:42 +0000 |
commit | dfc7fff94015eceac518170585fce0fe112619ad (patch) | |
tree | 459333e1dc9f643b388c91ff4e13f5e058678077 /src/mongo/db | |
parent | 5915a6239f48ee8371802ff3c159d26f1804fc4b (diff) | |
download | mongo-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.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/s/migration_coordinator_document.idl | 4 | ||||
-rw-r--r-- | src/mongo/db/s/migration_util.cpp | 17 | ||||
-rw-r--r-- | src/mongo/db/s/migration_util.h | 12 |
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. */ |