Skip to content

Commit b10f9f5

Browse files
jstewart148jyemin
authored andcommitted
Log retryable writes at DEBUG level
JAVA-2964
1 parent b867708 commit b10f9f5

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

driver-core/src/main/com/mongodb/operation/CommandOperationHelper.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,11 @@
5353
import static com.mongodb.operation.OperationHelper.CallableWithConnectionAndSource;
5454
import static com.mongodb.operation.OperationHelper.LOGGER;
5555
import static com.mongodb.operation.OperationHelper.canRetryWrite;
56+
import static com.mongodb.operation.OperationHelper.isRetryableWrite;
5657
import static com.mongodb.operation.OperationHelper.releasingCallback;
5758
import static com.mongodb.operation.OperationHelper.withConnection;
5859
import static com.mongodb.operation.OperationHelper.withReleasableConnection;
60+
import static java.lang.String.format;
5961
import static java.util.Arrays.asList;
6062

6163
final class CommandOperationHelper {
@@ -454,6 +456,9 @@ public R call(final ConnectionSource source, final Connection connection) {
454456
} catch (MongoException e) {
455457
exception = e;
456458
if (!shouldAttemptToRetry(command, e)) {
459+
if (isRetryWritesEnabled(command)) {
460+
logUnableToRetry(command.getFirstKey(), e);
461+
}
457462
throw exception;
458463
}
459464
} finally {
@@ -469,6 +474,7 @@ public R call(final ConnectionSource source, final Connection connection) {
469474
if (!canRetryWrite(source.getServerDescription(), connection.getDescription(), binding.getSessionContext())) {
470475
throw originalException;
471476
}
477+
logRetryExecute(originalCommand.getFirstKey(), originalException);
472478
return transformer.apply(connection.command(database, originalCommand, fieldNameValidator,
473479
readPreference, commandResultDecoder, binding.getSessionContext()),
474480
connection.getDescription().getServerAddress());
@@ -545,6 +551,9 @@ public void onResult(final T result, final Throwable originalError) {
545551

546552
private void checkRetryableException(final Throwable originalError, final SingleResultCallback<R> releasingCallback) {
547553
if (!shouldAttemptToRetry(command, originalError)) {
554+
if (isRetryWritesEnabled(command)) {
555+
logUnableToRetry(command.getFirstKey(), originalError);
556+
}
548557
releasingCallback.onResult(null, originalError);
549558
} else {
550559
oldConnection.release();
@@ -554,6 +563,7 @@ private void checkRetryableException(final Throwable originalError, final Single
554563
}
555564

556565
private void retryableCommand(final Throwable originalError) {
566+
logRetryExecute(command.getFirstKey(), originalError);
557567
withConnection(binding, new AsyncCallableWithConnectionAndSource() {
558568
@Override
559569
public void call(final AsyncConnectionSource source, final AsyncConnection connection, final Throwable t) {
@@ -702,16 +712,30 @@ public void onResult(final D response, final Throwable t) {
702712
}
703713

704714
private static boolean shouldAttemptToRetry(@Nullable final BsonDocument command, final Throwable exception) {
705-
return shouldAttemptToRetry(command != null
706-
&& (command.containsKey("txnNumber")
707-
|| command.getFirstKey().equals("commitTransaction") || command.getFirstKey().equals("abortTransaction")),
708-
exception);
715+
return isRetryWritesEnabled(command) && isRetryableException(exception);
716+
}
717+
718+
private static boolean isRetryWritesEnabled(@Nullable final BsonDocument command) {
719+
return (command != null && (command.containsKey("txnNumber")
720+
|| command.getFirstKey().equals("commitTransaction") || command.getFirstKey().equals("abortTransaction")));
709721
}
710722

711723
static boolean shouldAttemptToRetry(final boolean retryWritesEnabled, final Throwable exception) {
712724
return retryWritesEnabled && isRetryableException(exception);
713725
}
714726

727+
static void logRetryExecute(final String operation, final Throwable originalError) {
728+
if (LOGGER.isDebugEnabled()) {
729+
LOGGER.debug(format("Retrying operation %s due to an error \"%s\"", operation, originalError));
730+
}
731+
}
732+
733+
static void logUnableToRetry(final String operation, final Throwable originalError) {
734+
if (LOGGER.isDebugEnabled()) {
735+
LOGGER.debug(format("Unable to retry operation %s due to error \"%s\"", operation, originalError));
736+
}
737+
}
738+
715739
private CommandOperationHelper() {
716740
}
717741
}

driver-core/src/main/com/mongodb/operation/MixedBulkWriteOperation.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
import static com.mongodb.bulk.WriteRequest.Type.UPDATE;
4949
import static com.mongodb.internal.async.ErrorHandlingResultCallback.errorHandlingCallback;
5050
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsAtLeastVersionThreeDotSix;
51+
import static com.mongodb.operation.CommandOperationHelper.logRetryExecute;
52+
import static com.mongodb.operation.CommandOperationHelper.logUnableToRetry;
5153
import static com.mongodb.operation.CommandOperationHelper.shouldAttemptToRetry;
5254
import static com.mongodb.operation.OperationHelper.AsyncCallableWithConnection;
5355
import static com.mongodb.operation.OperationHelper.AsyncCallableWithConnectionAndSource;
@@ -274,9 +276,19 @@ private BulkWriteResult executeBulkWriteBatch(final WriteBinding binding, final
274276
}
275277

276278
if (exception == null) {
277-
return currentBatch.getResult();
279+
try {
280+
return currentBatch.getResult();
281+
} catch (MongoException e) {
282+
if (originalBatch.getRetryWrites()) {
283+
logUnableToRetry(originalBatch.getPayload().getPayloadType().toString(), e);
284+
}
285+
throw e;
286+
}
278287
} else if (!(exception instanceof MongoWriteConcernWithResponseException)
279288
&& !shouldAttemptToRetry(originalBatch.getRetryWrites(), exception)) {
289+
if (originalBatch.getRetryWrites()) {
290+
logUnableToRetry(originalBatch.getPayload().getPayloadType().toString(), exception);
291+
}
280292
throw exception;
281293
} else {
282294
return retryExecuteBatches(binding, currentBatch, exception);
@@ -285,6 +297,7 @@ private BulkWriteResult executeBulkWriteBatch(final WriteBinding binding, final
285297

286298
private BulkWriteResult retryExecuteBatches(final WriteBinding binding, final BulkWriteBatch retryBatch,
287299
final MongoException originalError) {
300+
logRetryExecute(retryBatch.getPayload().getPayloadType().toString(), originalError);
288301
return withReleasableConnection(binding, originalError, new CallableWithConnectionAndSource<BulkWriteResult>() {
289302
@Override
290303
public BulkWriteResult call(final ConnectionSource source, final Connection connection) {
@@ -338,6 +351,7 @@ private void executeBatchesAsync(final AsyncWriteBinding binding, final AsyncCon
338351

339352
private void retryExecuteBatchesAsync(final AsyncWriteBinding binding, final BulkWriteBatch retryBatch,
340353
final Throwable originalError, final SingleResultCallback<BulkWriteResult> callback) {
354+
logRetryExecute(retryBatch.getPayload().getPayloadType().toString(), originalError);
341355
withConnection(binding, new AsyncCallableWithConnectionAndSource() {
342356
@Override
343357
public void call(final AsyncConnectionSource source, final AsyncConnection connection, final Throwable t) {
@@ -446,6 +460,9 @@ private SingleResultCallback<BsonDocument> getCommandCallback(final AsyncWriteBi
446460
public void onResult(final BsonDocument result, final Throwable t) {
447461
if (t != null) {
448462
if (isSecondAttempt || !shouldAttemptToRetry(retryWrites, t)) {
463+
if (retryWrites && !isSecondAttempt) {
464+
logUnableToRetry(batch.getPayload().getPayloadType().toString(), t);
465+
}
449466
if (t instanceof MongoWriteConcernWithResponseException) {
450467
addBatchResult((BsonDocument) ((MongoWriteConcernWithResponseException) t).getResponse(), binding, connection,
451468
batch, retryWrites, callback);
@@ -481,6 +498,9 @@ private void addBatchResult(final BsonDocument result, final AsyncWriteBinding b
481498
executeBatchesAsync(binding, connection, nextBatch, retryWrites, callback);
482499
} else {
483500
if (batch.hasErrors()) {
501+
if (retryWrites) {
502+
logUnableToRetry(batch.getPayload().getPayloadType().toString(), batch.getError());
503+
}
484504
callback.onResult(null, batch.getError());
485505
} else {
486506
callback.onResult(batch.getResult(), null);

0 commit comments

Comments
 (0)