@@ -345,7 +345,7 @@ private PooledConnection getPooledConnection(final Timeout waitQueueTimeout, fin
345
345
}
346
346
return new PooledConnection (internalConnection );
347
347
} catch (MongoTimeoutException e ) {
348
- throw createTimeoutException (startTime );
348
+ throw createTimeoutException (startTime , e );
349
349
}
350
350
}
351
351
@@ -359,13 +359,14 @@ private PooledConnection getPooledConnectionImmediate() {
359
359
return internalConnection == null ? null : new PooledConnection (internalConnection );
360
360
}
361
361
362
- private MongoTimeoutException createTimeoutException (final StartTime startTime ) {
362
+ private MongoTimeoutException createTimeoutException (final StartTime startTime , @ Nullable final MongoTimeoutException cause ) {
363
363
long elapsedMs = startTime .elapsed ().toMillis ();
364
364
int numPinnedToCursor = pinnedStatsManager .getNumPinnedToCursor ();
365
365
int numPinnedToTransaction = pinnedStatsManager .getNumPinnedToTransaction ();
366
366
if (numPinnedToCursor == 0 && numPinnedToTransaction == 0 ) {
367
367
return new MongoTimeoutException (format ("Timed out after %d ms while waiting for a connection to server %s." ,
368
- elapsedMs , serverId .getAddress ()));
368
+ elapsedMs , serverId .getAddress ()),
369
+ cause );
369
370
} else {
370
371
int maxSize = pool .getMaxSize ();
371
372
int numInUse = pool .getInUseCount ();
@@ -375,7 +376,7 @@ private MongoTimeoutException createTimeoutException(final StartTime startTime)
375
376
* - numInUse > 0
376
377
* we consider at least one of `numPinnedToCursor`, `numPinnedToTransaction` to be positive,
377
378
* so if we observe `numInUse` to be 0, we have to estimate it based on `numPinnedToCursor` and `numPinnedToTransaction`;
378
- * - numInUse < maxSize
379
+ * - numInUse <= maxSize
379
380
* `numInUse` must not exceed the limit in situations when we estimate `numInUse`;
380
381
* - numPinnedToCursor + numPinnedToTransaction <= numInUse
381
382
* otherwise the numbers do not make sense.
@@ -399,7 +400,8 @@ private MongoTimeoutException createTimeoutException(final StartTime startTime)
399
400
+ "connections in use by other operations: %d" ,
400
401
elapsedMs , serverId .getAddress (),
401
402
sizeToString (maxSize ), numPinnedToCursor , numPinnedToTransaction ,
402
- numOtherInUse ));
403
+ numOtherInUse ),
404
+ cause );
403
405
}
404
406
}
405
407
@@ -1067,7 +1069,7 @@ private PooledConnection acquirePermitOrGetAvailableOpenedConnection(final boole
1067
1069
& (availableConnection = tryGetAvailable ? tryGetAvailableConnection () : null ) == null ) {
1068
1070
1069
1071
Timeout .onExistsAndExpired (waitQueueTimeout , () -> {
1070
- throw createTimeoutException (startTime );
1072
+ throw createTimeoutException (startTime , null );
1071
1073
});
1072
1074
waitQueueTimeout .awaitOn (permitAvailableOrHandedOverOrClosedOrPausedCondition ,
1073
1075
() -> "acquiring permit or getting available opened connection" );
@@ -1406,7 +1408,7 @@ void failAsClosed() {
1406
1408
}
1407
1409
1408
1410
void failAsTimedOut () {
1409
- doComplete (() -> createTimeoutException (startTime ));
1411
+ doComplete (() -> createTimeoutException (startTime , null ));
1410
1412
}
1411
1413
1412
1414
private void doComplete (final Supplier <RuntimeException > failureSupplier ) {
0 commit comments