-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Add MongoException.SYSTEM_OVERLOADED_ERROR_LABEL/RETRYABLE_ERROR_LABEL
#1926
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -39,6 +39,7 @@ public class MongoException extends RuntimeException { | |
| * | ||
| * @see #hasErrorLabel(String) | ||
| * @since 3.8 | ||
| * @mongodb.driver.manual core/transactions-in-applications/#std-label-transient-transaction-error | ||
| */ | ||
| public static final String TRANSIENT_TRANSACTION_ERROR_LABEL = "TransientTransactionError"; | ||
|
|
||
|
|
@@ -47,9 +48,32 @@ public class MongoException extends RuntimeException { | |
| * | ||
| * @see #hasErrorLabel(String) | ||
| * @since 3.8 | ||
| * @mongodb.driver.manual core/transactions-in-applications/#std-label-unknown-transaction-commit-result | ||
| */ | ||
| public static final String UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL = "UnknownTransactionCommitResult"; | ||
|
|
||
| /** | ||
| * Server is overloaded and shedding load. | ||
| * If you retry, use exponential backoff because the server has indicated overload. | ||
| * This label on its own does not mean that the operation can be safely retried. | ||
| * | ||
| * @see #hasErrorLabel(String) | ||
| * @since 5.7 | ||
| * @mongodb.server.release 8.3 | ||
| */ | ||
| // TODO-BACKPRESSURE Valentin Add a @mongodb.driver.manual link or something similar, see `content/atlas/source/overload-errors.txt` in https://github.com/10gen/docs-mongodb-internal/pull/17281 | ||
|
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
| public static final String SYSTEM_OVERLOADED_ERROR_LABEL = "SystemOverloadedError"; | ||
|
|
||
| /** | ||
| * The operation was not executed and is safe to retry. | ||
| * | ||
| * @see #hasErrorLabel(String) | ||
| * @since 5.7 | ||
| * @mongodb.server.release 8.3 | ||
| */ | ||
| // TODO-BACKPRESSURE Valentin Add a @mongodb.driver.manual link or something similar, see `content/atlas/source/overload-errors.txt` in https://github.com/10gen/docs-mongodb-internal/pull/17281 | ||
| public static final String RETRYABLE_ERROR_LABEL = "RetryableError"; | ||
|
|
||
| private static final long serialVersionUID = -4415279469780082174L; | ||
|
|
||
| private final int code; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -77,7 +77,8 @@ private void runTransactionWithRetry(final Runnable transactional) { | |
| System.out.println("Transaction aborted. Caught exception during transaction."); | ||
|
|
||
| if (e.hasErrorLabel(MongoException.TRANSIENT_TRANSACTION_ERROR_LABEL)) { | ||
| System.out.println("TransientTransactionError, aborting transaction and retrying ..."); | ||
| System.out.printf("%s, aborting transaction and retrying ...%n", | ||
| MongoException.TRANSIENT_TRANSACTION_ERROR_LABEL); | ||
|
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here and in some other places I am just making sure we use the constants for the labels. |
||
| } else { | ||
| throw e; | ||
| } | ||
|
|
@@ -94,7 +95,8 @@ private void commitWithRetry(final ClientSession clientSession) { | |
| } catch (MongoException e) { | ||
| // can retry commit | ||
| if (e.hasErrorLabel(MongoException.UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)) { | ||
| System.out.println("UnknownTransactionCommitResult, retrying commit operation ..."); | ||
| System.out.printf("%s, retrying commit operation ...%n", | ||
| MongoException.UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL); | ||
| } else { | ||
| System.out.println("Exception during commit ..."); | ||
| throw e; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -37,7 +37,9 @@ | |
| import static org.junit.jupiter.api.Assertions.fail; | ||
| import static org.junit.jupiter.api.Assumptions.assumeTrue; | ||
|
|
||
| // See https://github.com/mongodb/specifications/blob/master/source/transactions-convenient-api/tests/README.md#prose-tests | ||
| /** | ||
| * <a href="https://github.com/mongodb/specifications/blob/master/source/transactions-convenient-api/tests/README.md#prose-tests">Prose Tests</a>. | ||
| */ | ||
| public class WithTransactionProseTest extends DatabaseTestCase { | ||
| private static final long START_TIME_MS = 1L; | ||
| private static final long ERROR_GENERATING_INTERVAL = 121000L; | ||
|
|
@@ -52,11 +54,10 @@ public void setUp() { | |
| collection.insertOne(Document.parse("{ _id : 0 }")); | ||
| } | ||
|
|
||
| // | ||
| // Test that the callback raises a custom exception or error that does not include either UnknownTransactionCommitResult or | ||
| // TransientTransactionError error labels. The callback will execute using withTransaction and assert that the callback's error | ||
| // bypasses any retry logic within withTransaction and is propagated to the caller of withTransaction. | ||
| // | ||
| /** | ||
| * <a href="https://github.com/mongodb/specifications/blob/master/source/transactions-convenient-api/tests/README.md#callback-raises-a-custom-error"> | ||
| * Callback Raises a Custom Error</a>. | ||
| */ | ||
| @Test | ||
| public void testCallbackRaisesCustomError() { | ||
| final String exceptionMessage = "NotTransientOrUnknownError"; | ||
|
|
@@ -71,10 +72,10 @@ public void testCallbackRaisesCustomError() { | |
| } | ||
| } | ||
|
|
||
| // | ||
| // Test that the callback that returns a custom value (e.g. boolean, string, object). Execute this callback using withTransaction | ||
| // and assert that the callback's return value is propagated to the caller of withTransaction. | ||
| // | ||
| /** | ||
| * <a href="https://github.com/mongodb/specifications/blob/master/source/transactions-convenient-api/tests/README.md#callback-returns-a-value"> | ||
| * Callback Returns a Value</a>. | ||
| */ | ||
|
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This non-documentation-style description of the method was effectively duplicating the text of the linked prose test. Instead of duplicating the test descriptions, we should link to them. The same applies to other changes in this file. |
||
| @Test | ||
| public void testCallbackReturnsValue() { | ||
| try (ClientSession session = client.startSession()) { | ||
|
|
@@ -87,10 +88,10 @@ public void testCallbackReturnsValue() { | |
| } | ||
| } | ||
|
|
||
| // | ||
| // If the callback raises an error with the TransientTransactionError label and the retry timeout has been exceeded, withTransaction | ||
| // should propagate the error to its caller. | ||
| // | ||
| /** | ||
| * <a href="https://github.com/mongodb/specifications/blob/master/source/transactions-convenient-api/tests/README.md#retry-timeout-is-enforced"> | ||
| * Retry Timeout is Enforced</a>, first scenario on the list. | ||
| */ | ||
| @Test | ||
| public void testRetryTimeoutEnforcedTransientTransactionError() { | ||
| final String errorMessage = "transient transaction error"; | ||
|
|
@@ -110,10 +111,10 @@ public void testRetryTimeoutEnforcedTransientTransactionError() { | |
| } | ||
| } | ||
|
|
||
| // | ||
| // If committing raises an error with the UnknownTransactionCommitResult label, the error is not a write concern timeout, and the | ||
| // retry timeout has been exceeded, withTransaction should propagate the error to its caller. | ||
| // | ||
| /** | ||
| * <a href="https://github.com/mongodb/specifications/blob/master/source/transactions-convenient-api/tests/README.md#retry-timeout-is-enforced"> | ||
| * Retry Timeout is Enforced</a>, second scenario on the list. | ||
| */ | ||
| @Test | ||
| public void testRetryTimeoutEnforcedUnknownTransactionCommit() { | ||
| MongoDatabase failPointAdminDb = client.getDatabase("admin"); | ||
|
|
@@ -137,11 +138,10 @@ public void testRetryTimeoutEnforcedUnknownTransactionCommit() { | |
| } | ||
| } | ||
|
|
||
| // | ||
| // If committing raises an error with the TransientTransactionError label and the retry timeout has been exceeded, withTransaction | ||
| // should propagate the error to its caller. This case may occur if the commit was internally retried against a new primary after | ||
| // a failover and the second primary returned a NoSuchTransaction error response. | ||
| // | ||
| /** | ||
| * <a href="https://github.com/mongodb/specifications/blob/master/source/transactions-convenient-api/tests/README.md#retry-timeout-is-enforced"> | ||
| * Retry Timeout is Enforced</a>, third scenario on the list. | ||
| */ | ||
| @Test | ||
| public void testRetryTimeoutEnforcedTransientTransactionErrorOnCommit() { | ||
| MongoDatabase failPointAdminDb = client.getDatabase("admin"); | ||
|
|
@@ -166,9 +166,9 @@ public void testRetryTimeoutEnforcedTransientTransactionErrorOnCommit() { | |
| } | ||
| } | ||
|
|
||
| // | ||
| // Ensure cannot override timeout in transaction | ||
| // | ||
| /** | ||
| * Ensure cannot override timeout in transaction. | ||
| */ | ||
| @Test | ||
| public void testTimeoutMS() { | ||
| try (ClientSession session = client.startSession(ClientSessionOptions.builder() | ||
|
|
@@ -182,9 +182,9 @@ public void testTimeoutMS() { | |
| } | ||
| } | ||
|
|
||
| // | ||
| // Ensure legacy settings don't cause issues in sessions | ||
| // | ||
| /** | ||
| * Ensure legacy settings don't cause issues in sessions. | ||
| */ | ||
| @Test | ||
| public void testTimeoutMSAndLegacySettings() { | ||
| try (ClientSession session = client.startSession(ClientSessionOptions.builder() | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The 8.3 version here and below was chosen to be documented based on https://mongodb.slack.com/archives/C09HD2C42N5/p1774376899374599 and https://mongodb.slack.com/archives/GCKKT44RM/p1774320729754479.