Skip to content

Commit 78f357e

Browse files
committed
Change CSOT exception hierarchy
- Make MongoOperationTimeoutException extend MongoClientException instead of MongoTimeoutException to avoid breaking the semantic guarantee that MongoTimeoutException implies the operation was not executed - Handle MongoOperationTimeoutException explicitly in instanceof MongoTimeoutException checks to preserve existing behavior for transaction labeling, connection pool events, and logging JAVA-5438
1 parent 8731b19 commit 78f357e

7 files changed

Lines changed: 19 additions & 10 deletions

File tree

driver-core/src/main/com/mongodb/MongoOperationTimeoutException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
* @since 5.2
4141
*/
4242
@Alpha(Reason.CLIENT)
43-
public final class MongoOperationTimeoutException extends MongoTimeoutException {
43+
public final class MongoOperationTimeoutException extends MongoClientException {
4444
private static final long serialVersionUID = 1L;
4545

4646
/**

driver-core/src/main/com/mongodb/internal/connection/BaseCluster.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ private void logAndThrowTimeoutException(
427427
"Timed out while waiting for a server that matches %s. Client view of cluster state is %s",
428428
serverSelector, clusterDescription.getShortDescription());
429429

430-
MongoTimeoutException exception = operationContext.getTimeoutContext().hasTimeoutMS()
430+
MongoClientException exception = operationContext.getTimeoutContext().hasTimeoutMS()
431431
? new MongoOperationTimeoutException(message) : new MongoTimeoutException(message);
432432

433433
logServerSelectionFailed(operationContext, clusterId, exception, serverSelector, clusterDescription);
@@ -590,7 +590,7 @@ private static void logServerSelectionFailed(
590590
final ServerSelector serverSelector,
591591
final ClusterDescription clusterDescription) {
592592
if (STRUCTURED_LOGGER.isRequired(DEBUG, clusterId)) {
593-
String failureDescription = failure instanceof MongoTimeoutException
593+
String failureDescription = failure instanceof MongoTimeoutException || failure instanceof MongoOperationTimeoutException
594594
// This hardcoded message guarantees that the `FAILURE` entry for `MongoTimeoutException` does not include
595595
// any information that is specified via other entries, e.g., `SELECTOR` and `TOPOLOGY_DESCRIPTION`.
596596
// The logging spec requires us to avoid such duplication of information.

driver-core/src/main/com/mongodb/internal/connection/DefaultConnectionPool.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616

1717
package com.mongodb.internal.connection;
1818

19+
import com.mongodb.MongoClientException;
1920
import com.mongodb.MongoConnectionPoolClearedException;
2021
import com.mongodb.MongoException;
2122
import com.mongodb.MongoInterruptedException;
23+
import com.mongodb.MongoOperationTimeoutException;
2224
import com.mongodb.MongoServerUnavailableException;
2325
import com.mongodb.MongoTimeoutException;
2426
import com.mongodb.annotations.NotThreadSafe;
@@ -256,7 +258,7 @@ public void getAsync(final OperationContext operationContext, final SingleResult
256258
private Throwable checkOutFailed(final Throwable t, final OperationContext operationContext, final StartTime checkoutStart) {
257259
Throwable result = t;
258260
Reason reason;
259-
if (t instanceof MongoTimeoutException) {
261+
if (t instanceof MongoTimeoutException || t instanceof MongoOperationTimeoutException) {
260262
reason = Reason.TIMEOUT;
261263
} else if (t instanceof MongoOpenConnectionInternalException) {
262264
reason = Reason.CONNECTION_ERROR;
@@ -334,7 +336,7 @@ public int getGeneration() {
334336

335337
private PooledConnection getPooledConnection(final Timeout maxWaitTimeout,
336338
final StartTime startTime,
337-
final TimeoutContext timeoutContext) throws MongoTimeoutException {
339+
final TimeoutContext timeoutContext) throws MongoClientException {
338340
try {
339341
UsageTrackingInternalConnection internalConnection = maxWaitTimeout.call(NANOSECONDS,
340342
() -> pool.get(-1L, NANOSECONDS),
@@ -363,9 +365,9 @@ private PooledConnection getPooledConnectionImmediate() {
363365
return internalConnection == null ? null : new PooledConnection(internalConnection);
364366
}
365367

366-
private MongoTimeoutException createTimeoutException(final StartTime startTime,
367-
@Nullable final MongoTimeoutException cause,
368-
final TimeoutContext timeoutContext) {
368+
private MongoClientException createTimeoutException(final StartTime startTime,
369+
@Nullable final MongoTimeoutException cause,
370+
final TimeoutContext timeoutContext) {
369371
long elapsedMs = startTime.elapsed().toMillis();
370372
int numPinnedToCursor = pinnedStatsManager.getNumPinnedToCursor();
371373
int numPinnedToTransaction = pinnedStatsManager.getNumPinnedToTransaction();
@@ -425,6 +427,7 @@ ConcurrentPool<UsageTrackingInternalConnection> getPool() {
425427
void doMaintenance() {
426428
Predicate<Exception> silentlyComplete = e ->
427429
e instanceof MongoInterruptedException || e instanceof MongoTimeoutException
430+
|| e instanceof MongoOperationTimeoutException
428431
|| e instanceof MongoConnectionPoolClearedException || ConcurrentPool.isPoolClosedException(e);
429432
try {
430433
pool.prune();

driver-core/src/main/com/mongodb/internal/connection/LoadBalancedCluster.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ private MongoClientException createResolvedToMultipleHostsException() {
322322
+ "to multiple hosts");
323323
}
324324

325-
private MongoTimeoutException createTimeoutException(final TimeoutContext timeoutContext) {
325+
private MongoClientException createTimeoutException(final TimeoutContext timeoutContext) {
326326
MongoException localSrvResolutionException = srvResolutionException;
327327
String message;
328328
if (localSrvResolutionException == null) {
@@ -334,7 +334,7 @@ private MongoTimeoutException createTimeoutException(final TimeoutContext timeou
334334
return createTimeoutException(timeoutContext, message);
335335
}
336336

337-
private static MongoTimeoutException createTimeoutException(final TimeoutContext timeoutContext, final String message) {
337+
private static MongoClientException createTimeoutException(final TimeoutContext timeoutContext, final String message) {
338338
return timeoutContext.hasTimeoutMS() ? new MongoOperationTimeoutException(message) : new MongoTimeoutException(message);
339339
}
340340

driver-core/src/main/com/mongodb/internal/operation/CommitTransactionOperation.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.mongodb.MongoExecutionTimeoutException;
2222
import com.mongodb.MongoNamespace;
2323
import com.mongodb.MongoNodeIsRecoveringException;
24+
import com.mongodb.MongoOperationTimeoutException;
2425
import com.mongodb.MongoNotPrimaryException;
2526
import com.mongodb.MongoSocketException;
2627
import com.mongodb.MongoTimeoutException;
@@ -103,6 +104,7 @@ private void addErrorLabels(final MongoException e) {
103104
private static boolean shouldAddUnknownTransactionCommitResultLabel(final MongoException e) {
104105

105106
if (e instanceof MongoSocketException || e instanceof MongoTimeoutException
107+
|| e instanceof MongoOperationTimeoutException
106108
|| e instanceof MongoNotPrimaryException || e instanceof MongoNodeIsRecoveringException
107109
|| e instanceof MongoExecutionTimeoutException) {
108110
return true;

driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/OperationExecutorImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.mongodb.MongoClientException;
1919
import com.mongodb.MongoException;
2020
import com.mongodb.MongoInternalException;
21+
import com.mongodb.MongoOperationTimeoutException;
2122
import com.mongodb.MongoQueryException;
2223
import com.mongodb.MongoSocketException;
2324
import com.mongodb.MongoTimeoutException;
@@ -203,6 +204,7 @@ private <T> RequestContext getContext(final Subscriber<T> subscriber) {
203204
private void labelException(@Nullable final ClientSession session, @Nullable final Throwable t) {
204205
if (session != null && session.hasActiveTransaction()
205206
&& (t instanceof MongoSocketException || t instanceof MongoTimeoutException
207+
|| t instanceof MongoOperationTimeoutException
206208
|| (t instanceof MongoQueryException && ((MongoQueryException) t).getErrorCode() == 91))
207209
&& !((MongoException) t).hasErrorLabel(UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)) {
208210
((MongoException) t).addLabel(TRANSIENT_TRANSACTION_ERROR_LABEL);

driver-sync/src/main/com/mongodb/client/internal/MongoClusterImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.mongodb.MongoClientException;
2323
import com.mongodb.MongoException;
2424
import com.mongodb.MongoInternalException;
25+
import com.mongodb.MongoOperationTimeoutException;
2526
import com.mongodb.MongoQueryException;
2627
import com.mongodb.MongoSocketException;
2728
import com.mongodb.MongoTimeoutException;
@@ -535,6 +536,7 @@ private RequestContext getRequestContext() {
535536

536537
private void labelException(final ClientSession session, final MongoException e) {
537538
if (session.hasActiveTransaction() && (e instanceof MongoSocketException || e instanceof MongoTimeoutException
539+
|| e instanceof MongoOperationTimeoutException
538540
|| e instanceof MongoQueryException && e.getCode() == 91)
539541
&& !e.hasErrorLabel(UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)) {
540542
e.addLabel(TRANSIENT_TRANSACTION_ERROR_LABEL);

0 commit comments

Comments
 (0)