Skip to content

Commit fc65ad9

Browse files
stIncMalevbabanin
andauthored
Implement Java sync improved bulk write API and unified spec tests (#1486)
JAVA-5528, JAVA-5609 --------- Co-authored-by: Viacheslav Babanin <[email protected]>
1 parent ce34eee commit fc65ad9

37 files changed

+9041
-140
lines changed

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

+17-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import java.util.Optional;
2626

2727
import static com.mongodb.assertions.Assertions.isTrueArgument;
28+
import static com.mongodb.assertions.Assertions.notNull;
29+
import static com.mongodb.internal.operation.ClientBulkWriteOperation.Exceptions.serverAddressFromException;
2830
import static java.util.Collections.emptyList;
2931
import static java.util.Collections.emptyMap;
3032
import static java.util.Collections.unmodifiableList;
@@ -58,14 +60,20 @@ public final class ClientBulkWriteException extends MongoServerException {
5860
* @param writeErrors The {@linkplain #getWriteErrors() write errors}.
5961
* @param partialResult The {@linkplain #getPartialResult() partial result}.
6062
* @param serverAddress The {@linkplain MongoServerException#getServerAddress() server address}.
63+
* If {@code error} is a {@link MongoServerException} or a {@link MongoSocketException}, then {@code serverAddress}
64+
* must be equal to the {@link ServerAddress} they bear.
6165
*/
6266
public ClientBulkWriteException(
6367
@Nullable final MongoException error,
6468
@Nullable final List<WriteConcernError> writeConcernErrors,
6569
@Nullable final Map<Integer, WriteError> writeErrors,
6670
@Nullable final ClientBulkWriteResult partialResult,
6771
final ServerAddress serverAddress) {
68-
super(message(error, writeConcernErrors, writeErrors, partialResult, serverAddress), serverAddress);
72+
super(
73+
message(
74+
error, writeConcernErrors, writeErrors, partialResult,
75+
notNull("serverAddress", serverAddress)),
76+
validateServerAddress(error, serverAddress));
6977
isTrueArgument("At least one of `writeConcernErrors`, `writeErrors`, `partialResult` must be non-null or non-empty",
7078
!(writeConcernErrors == null || writeConcernErrors.isEmpty())
7179
|| !(writeErrors == null || writeErrors.isEmpty())
@@ -89,6 +97,14 @@ private static String message(
8997
+ (partialResult == null ? "" : " Partial result: " + partialResult + ".");
9098
}
9199

100+
private static ServerAddress validateServerAddress(@Nullable final MongoException error, final ServerAddress serverAddress) {
101+
serverAddressFromException(error).ifPresent(serverAddressFromError ->
102+
isTrueArgument("`serverAddress` must be equal to that of the `error`", serverAddressFromError.equals(serverAddress)));
103+
return error instanceof MongoServerException
104+
? ((MongoServerException) error).getServerAddress()
105+
: serverAddress;
106+
}
107+
92108
/**
93109
* The top-level error. That is an error that is neither a {@linkplain #getWriteConcernErrors() write concern error},
94110
* nor is an {@linkplain #getWriteErrors() error of an individual write operation}.

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ static <R> AsyncCallbackSupplier<R> decorateReadWithRetriesAsync(final RetryStat
322322
static <R> AsyncCallbackSupplier<R> decorateWriteWithRetriesAsync(final RetryState retryState, final OperationContext operationContext,
323323
final AsyncCallbackSupplier<R> asyncWriteFunction) {
324324
return new RetryingAsyncCallbackSupplier<>(retryState, onRetryableWriteAttemptFailure(operationContext),
325-
CommandOperationHelper::shouldAttemptToRetryWrite, callback -> {
325+
CommandOperationHelper::loggingShouldAttemptToRetryWriteAndAddRetryableLabel, callback -> {
326326
logRetryExecute(retryState, operationContext);
327327
asyncWriteFunction.get(callback);
328328
});

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
import static com.mongodb.internal.bulk.WriteRequest.Type.REPLACE;
6565
import static com.mongodb.internal.bulk.WriteRequest.Type.UPDATE;
6666
import static com.mongodb.internal.operation.DocumentHelper.putIfNotNull;
67-
import static com.mongodb.internal.operation.MixedBulkWriteOperation.commandWriteConcern;
67+
import static com.mongodb.internal.operation.CommandOperationHelper.commandWriteConcern;
6868
import static com.mongodb.internal.operation.OperationHelper.LOGGER;
6969
import static com.mongodb.internal.operation.OperationHelper.isRetryableWrite;
7070
import static com.mongodb.internal.operation.WriteConcernHelper.createWriteConcernError;
@@ -111,7 +111,7 @@ static BulkWriteBatch createBulkWriteBatch(final MongoNamespace namespace,
111111
}
112112
if (canRetryWrites && !writeRequestsAreRetryable) {
113113
canRetryWrites = false;
114-
LOGGER.debug("retryWrites set but one or more writeRequests do not support retryable writes");
114+
logWriteModelDoesNotSupportRetries();
115115
}
116116
return new BulkWriteBatch(namespace, connectionDescription, ordered, writeConcern, bypassDocumentValidation,
117117
canRetryWrites, new BulkWriteBatchCombiner(connectionDescription.getServerAddress(), ordered, writeConcern),
@@ -385,4 +385,8 @@ private static boolean isRetryable(final WriteRequest writeRequest) {
385385
}
386386
return true;
387387
}
388+
389+
static void logWriteModelDoesNotSupportRetries() {
390+
LOGGER.debug("retryWrites set but one or more writeRequests do not support retryable writes");
391+
}
388392
}

0 commit comments

Comments
 (0)