summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormathisbessamdb <mathis.bessa@mongodb.com>2021-11-02 03:36:59 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-11-02 04:27:25 +0000
commitf27e86632808bf295153a0b66e2719643a8c67e3 (patch)
tree31542697f07476827b115038da1536f51080d1da
parent6d1c15117ebf88cff368245aa54322fa4d478833 (diff)
downloadmongo-f27e86632808bf295153a0b66e2719643a8c67e3.tar.gz
SERVER-61153 findAndModify on mongos/mongoq handles TenantMigrationAborted by retrying
-rw-r--r--jstests/serverless/findAndModify_with_tenant_migration.js3
-rw-r--r--src/mongo/s/commands/cluster_find_and_modify_cmd.cpp4
-rw-r--r--src/mongo/s/commands/strategy.cpp12
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
});
}