summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/migration_coordinator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/s/migration_coordinator.cpp')
-rw-r--r--src/mongo/db/s/migration_coordinator.cpp41
1 files changed, 35 insertions, 6 deletions
diff --git a/src/mongo/db/s/migration_coordinator.cpp b/src/mongo/db/s/migration_coordinator.cpp
index 161fdabf407..1f66e046645 100644
--- a/src/mongo/db/s/migration_coordinator.cpp
+++ b/src/mongo/db/s/migration_coordinator.cpp
@@ -88,7 +88,7 @@ MigrationCoordinator::MigrationCoordinator(MigrationSessionId sessionId,
_waitForDelete(waitForDelete) {}
MigrationCoordinator::MigrationCoordinator(const MigrationCoordinatorDocument& doc)
- : _migrationInfo(doc) {}
+ : _migrationInfo(doc), _recoveringMigration(true) {}
MigrationCoordinator::~MigrationCoordinator() = default;
@@ -192,10 +192,26 @@ SemiFuture<void> MigrationCoordinator::_commitMigrationOnDonorAndRecipient(
"lsid"_attr = _migrationInfo.getLsid(),
"currentTxnNumber"_attr = _migrationInfo.getTxnNumber(),
"migrationId"_attr = _migrationInfo.getId());
- migrationutil::advanceTransactionOnRecipient(opCtx,
- _migrationInfo.getRecipientShardId(),
- _migrationInfo.getLsid(),
- _migrationInfo.getTxnNumber());
+ try {
+ migrationutil::advanceTransactionOnRecipient(opCtx,
+ _migrationInfo.getRecipientShardId(),
+ _migrationInfo.getLsid(),
+ _migrationInfo.getTxnNumber());
+ } catch (const ExceptionFor<ErrorCodes::TransactionTooOld>& ex) {
+ // TODO: SERVER-62316: No longer catch after 6.0 branches out
+ if (_recoveringMigration) {
+ LOGV2_WARNING(6224500,
+ "Transaction number on recipient shard was already advanced by a later "
+ "migration that started before this one finished recovery",
+ "namespace"_attr = _migrationInfo.getNss(),
+ "migrationId"_attr = _migrationInfo.getId(),
+ "lsid"_attr = _migrationInfo.getLsid(),
+ "currentTxnNumber"_attr = _migrationInfo.getTxnNumber(),
+ "error"_attr = redact(ex));
+ } else {
+ throw;
+ }
+ }
hangBeforeSendingCommitDecision.pauseWhileSet();
@@ -270,8 +286,21 @@ void MigrationCoordinator::_abortMigrationOnDonorAndRecipient(OperationContext*
"recipientShardId"_attr = _migrationInfo.getRecipientShardId(),
"currentTxnNumber"_attr = _migrationInfo.getTxnNumber(),
"error"_attr = exShardNotFound);
+ } catch (const ExceptionFor<ErrorCodes::TransactionTooOld>& ex) {
+ // TODO: SERVER-62316: No longer catch after 6.0 branches out
+ if (_recoveringMigration) {
+ LOGV2_WARNING(6224501,
+ "Transaction number on recipient shard was already advanced by a later "
+ "migration that started before this one finished recovery",
+ "namespace"_attr = _migrationInfo.getNss(),
+ "migrationId"_attr = _migrationInfo.getId(),
+ "lsid"_attr = _migrationInfo.getLsid(),
+ "currentTxnNumber"_attr = _migrationInfo.getTxnNumber(),
+ "error"_attr = redact(ex));
+ } else {
+ throw;
+ }
}
-
LOGV2_DEBUG(23902,
2,
"Marking range deletion task on recipient as ready for processing",