summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Mulrow <jack.mulrow@mongodb.com>2022-05-27 20:46:36 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-05-28 01:54:02 +0000
commit233249600339aed492927b8d252f856366a396dc (patch)
tree60e26edfaac9df63acbe01f4574798b3030893c5
parentcd8d0b4122f95ae4bb020c7391dffa9297938914 (diff)
downloadmongo-233249600339aed492927b8d252f856366a396dc.tar.gz
SERVER-66849 Error labels should account for cluster abort and commit commands
(cherry picked from commit 6670518c902d4cef237bb3539da85a75eaa69fe7)
-rw-r--r--src/mongo/db/error_labels.cpp11
-rw-r--r--src/mongo/db/error_labels_test.cpp25
2 files changed, 33 insertions, 3 deletions
diff --git a/src/mongo/db/error_labels.cpp b/src/mongo/db/error_labels.cpp
index 50c904ec07e..0e4e2177778 100644
--- a/src/mongo/db/error_labels.cpp
+++ b/src/mongo/db/error_labels.cpp
@@ -40,7 +40,13 @@ namespace {
MONGO_FAIL_POINT_DEFINE(errorLabelBuilderMockShutdown);
-}
+const StringMap<int> commitOrAbortCommands = {{"abortTransaction", 1},
+ {"clusterAbortTransaction", 1},
+ {"clusterCommitTransaction", 1},
+ {"commitTransaction", 1},
+ {"coordinateCommitTransaction", 1}};
+
+} // namespace
bool ErrorLabelBuilder::isTransientTransactionError() const {
// Note that we only apply the TransientTransactionError label if the "autocommit" field is
@@ -156,8 +162,7 @@ void ErrorLabelBuilder::build(BSONArrayBuilder& labels) const {
}
bool ErrorLabelBuilder::_isCommitOrAbort() const {
- return _commandName == "commitTransaction" || _commandName == "coordinateCommitTransaction" ||
- _commandName == "abortTransaction";
+ return commitOrAbortCommands.find(_commandName) != commitOrAbortCommands.cend();
}
BSONObj getErrorLabels(OperationContext* opCtx,
diff --git a/src/mongo/db/error_labels_test.cpp b/src/mongo/db/error_labels_test.cpp
index b3776be663b..f88c6d46b01 100644
--- a/src/mongo/db/error_labels_test.cpp
+++ b/src/mongo/db/error_labels_test.cpp
@@ -391,6 +391,18 @@ TEST_F(ErrorLabelBuilderTest, RetryableWriteErrorsOnCommitAbortHaveRetryableWrit
false /* isInternalClient */,
false /* isMongos */);
ASSERT_TRUE(commitBuilder.isRetryableWriteError());
+ ASSERT_FALSE(commitBuilder.isTransientTransactionError());
+
+ commandName = "clusterCommitTransaction";
+ ErrorLabelBuilder clusterCommitBuilder(opCtx(),
+ sessionInfo,
+ commandName,
+ ErrorCodes::NotWritablePrimary,
+ boost::none,
+ false /* isInternalClient */,
+ true /* isMongos */);
+ ASSERT_TRUE(commitBuilder.isRetryableWriteError());
+ ASSERT_FALSE(commitBuilder.isTransientTransactionError());
commandName = "coordinateCommitTransaction";
ErrorLabelBuilder coordinateCommitBuilder(opCtx(),
@@ -401,6 +413,7 @@ TEST_F(ErrorLabelBuilderTest, RetryableWriteErrorsOnCommitAbortHaveRetryableWrit
false /* isInternalClient */,
false /* isMongos */);
ASSERT_TRUE(coordinateCommitBuilder.isRetryableWriteError());
+ ASSERT_FALSE(commitBuilder.isTransientTransactionError());
commandName = "abortTransaction";
ErrorLabelBuilder abortBuilder(opCtx(),
@@ -411,6 +424,18 @@ TEST_F(ErrorLabelBuilderTest, RetryableWriteErrorsOnCommitAbortHaveRetryableWrit
false /* isInternalClient */,
false /* isMongos */);
ASSERT_TRUE(abortBuilder.isRetryableWriteError());
+ ASSERT_FALSE(commitBuilder.isTransientTransactionError());
+
+ commandName = "clusterAbortTransaction";
+ ErrorLabelBuilder clusterAbortBuilder(opCtx(),
+ sessionInfo,
+ commandName,
+ ErrorCodes::NotWritablePrimary,
+ boost::none,
+ false /* isInternalClient */,
+ true /* isMongos */);
+ ASSERT_TRUE(commitBuilder.isRetryableWriteError());
+ ASSERT_FALSE(commitBuilder.isTransientTransactionError());
}
TEST_F(ErrorLabelBuilderTest, NonResumableChangeStreamError) {