summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRandolph Tan <randolph@10gen.com>2020-02-27 13:25:56 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-03-02 22:29:50 +0000
commit3a537be6918cff310e2a3041e7400918adeb9601 (patch)
treece440f607987b967147a1cedef668253c7b8d44b /src
parentfa5f8749a13d5af153b0259a445abb57bdfcc538 (diff)
downloadmongo-3a537be6918cff310e2a3041e7400918adeb9601.tar.gz
SERVER-46383 wrap remote call in advanceTransactionOnRecipient with retryIdempotentWorkUntilSuccess
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/s/migration_util.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/mongo/db/s/migration_util.cpp b/src/mongo/db/s/migration_util.cpp
index 97638def3e7..09ebea38a8f 100644
--- a/src/mongo/db/s/migration_util.cpp
+++ b/src/mongo/db/s/migration_util.cpp
@@ -87,6 +87,8 @@ MONGO_FAIL_POINT_DEFINE(hangInReadyRangeDeletionOnRecipientInterruptible);
MONGO_FAIL_POINT_DEFINE(hangInReadyRangeDeletionOnRecipientThenSimulateErrorUninterruptible);
MONGO_FAIL_POINT_DEFINE(hangInReadyRangeDeletionLocallyInterruptible);
MONGO_FAIL_POINT_DEFINE(hangInReadyRangeDeletionLocallyThenSimulateErrorUninterruptible);
+MONGO_FAIL_POINT_DEFINE(hangInAdvanceTxnNumInterruptible);
+MONGO_FAIL_POINT_DEFINE(hangInAdvanceTxnNumThenSimulateErrorUninterruptible);
const char kSourceShard[] = "source";
const char kDestinationShard[] = "destination";
@@ -622,7 +624,18 @@ void advanceTransactionOnRecipient(OperationContext* opCtx,
auto passthroughFields = BSON(WriteConcernOptions::kWriteConcernField
<< WriteConcernOptions::Majority << "lsid" << lsid.toBSON()
<< "txnNumber" << currentTxnNumber + 1);
- sendToRecipient(opCtx, recipientId, updateOp, passthroughFields);
+
+ retryIdempotentWorkUntilSuccess(
+ opCtx, "advance migration txn number", [&](OperationContext* newOpCtx) {
+ hangInAdvanceTxnNumInterruptible.pauseWhileSet(newOpCtx);
+ sendToRecipient(newOpCtx, recipientId, updateOp, passthroughFields);
+
+ if (hangInAdvanceTxnNumThenSimulateErrorUninterruptible.shouldFail()) {
+ hangInAdvanceTxnNumThenSimulateErrorUninterruptible.pauseWhileSet(newOpCtx);
+ uasserted(ErrorCodes::InternalError,
+ "simulate an error response when initiating range deletion locally");
+ }
+ });
}
void markAsReadyRangeDeletionTaskLocally(OperationContext* opCtx, const UUID& migrationId) {