diff options
-rw-r--r-- | jstests/serverless/findAndModify_with_tenant_migration.js | 3 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_find_and_modify_cmd.cpp | 4 | ||||
-rw-r--r-- | src/mongo/s/commands/strategy.cpp | 12 |
3 files changed, 17 insertions, 2 deletions
diff --git a/jstests/serverless/findAndModify_with_tenant_migration.js b/jstests/serverless/findAndModify_with_tenant_migration.js index 8bcf014d964..7e30989159b 100644 --- a/jstests/serverless/findAndModify_with_tenant_migration.js +++ b/jstests/serverless/findAndModify_with_tenant_migration.js @@ -90,8 +90,7 @@ let adminDB = st.rs0.getPrimary().getDB('admin'); let findAndModifyThread = new Thread((mongosConnString, dbName, findAndModifyCmd) => { let mongos = new Mongo(mongosConnString); - assert.commandFailedWithCode(mongos.getDB(dbName).runCommand(findAndModifyCmd), - ErrorCodes.TenantMigrationAborted); + assert.commandWorked(mongos.getDB(dbName).runCommand(findAndModifyCmd)); }, st.s0.host, kDbName, findAndModifyCmd); findAndModifyThread.start(); diff --git a/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp b/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp index 532e3e12438..23672e2f418 100644 --- a/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp +++ b/src/mongo/s/commands/cluster_find_and_modify_cmd.cpp @@ -396,6 +396,10 @@ private: uassertStatusOK(responseStatus.withContext("findAndModify")); } + if (responseStatus.code() == ErrorCodes::TenantMigrationAborted) { + uassertStatusOK(responseStatus.withContext("findAndModify")); + } + if (responseStatus.code() == ErrorCodes::WouldChangeOwningShard) { if (isRetryableWrite) { RouterOperationContextSession routerSession(opCtx); diff --git a/src/mongo/s/commands/strategy.cpp b/src/mongo/s/commands/strategy.cpp index 595c90f49a4..ddd07ed28ce 100644 --- a/src/mongo/s/commands/strategy.cpp +++ b/src/mongo/s/commands/strategy.cpp @@ -472,6 +472,7 @@ private: void _onStaleDbVersion(Status& status); void _onSnapshotError(Status& status); void _onShardCannotRefreshDueToLocksHeldError(Status& status); + void _onTenantMigrationAborted(Status& status); ParseAndRunCommand* const _parc; @@ -1040,6 +1041,13 @@ void ParseAndRunCommand::RunAndRetry::_onShardCannotRefreshDueToLocksHeldError(S iassert(status); } +void ParseAndRunCommand::RunAndRetry::_onTenantMigrationAborted(Status& status) { + invariant(status.code() == ErrorCodes::TenantMigrationAborted); + + if (!_canRetry()) + iassert(status); +} + void ParseAndRunCommand::RunInvocation::_tapOnError(const Status& status) { auto opCtx = _parc->_rec->getOpCtx(); const auto command = _parc->_rec->getCommand(); @@ -1088,6 +1096,10 @@ Future<void> ParseAndRunCommand::RunAndRetry::run() { .onError<ErrorCodes::ShardCannotRefreshDueToLocksHeld>([this](Status status) { _onShardCannotRefreshDueToLocksHeldError(status); return run(); // Retry + }) + .onError<ErrorCodes::TenantMigrationAborted>([this](Status status) { + _onTenantMigrationAborted(status); + return run(); // Retry }); } |