Skip to content

Commit a5e8347

Browse files
committed
Raise error when hint option is provided on unacknowledged
writes against any server version JAVA-3705
1 parent 590ba1c commit a5e8347

27 files changed

+43
-1676
lines changed

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package com.mongodb.internal.operation;
1818

19-
import com.mongodb.MongoClientException;
2019
import com.mongodb.MongoNamespace;
2120
import com.mongodb.WriteConcern;
2221
import com.mongodb.client.model.Collation;
@@ -39,7 +38,7 @@
3938
import static com.mongodb.internal.operation.DocumentHelper.putIfNotNull;
4039
import static com.mongodb.internal.operation.DocumentHelper.putIfNotZero;
4140
import static com.mongodb.internal.operation.OperationHelper.validateCollation;
42-
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsLessThanVersionFourDotTwo;
41+
import static com.mongodb.internal.operation.OperationHelper.validateHint;
4342
import static java.util.concurrent.TimeUnit.MILLISECONDS;
4443

4544
/**
@@ -278,9 +277,7 @@ private BsonDocument createCommand(final SessionContext sessionContext, final Se
278277
commandDocument.put("collation", collation.asDocument());
279278
}
280279
if (hint != null || hintString != null) {
281-
if (serverIsLessThanVersionFourDotTwo(connectionDescription)) {
282-
throw new MongoClientException("Specifying a value for the hint option requires a minimum MongoDB version of 4.2");
283-
}
280+
validateHint(connectionDescription, getWriteConcern());
284281
if (hint != null) {
285282
commandDocument.put("hint", hint.toBsonDocument(BsonDocument.class, null));
286283
} else {

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package com.mongodb.internal.operation;
1818

19-
import com.mongodb.MongoClientException;
2019
import com.mongodb.MongoNamespace;
2120
import com.mongodb.WriteConcern;
2221
import com.mongodb.client.model.Collation;
@@ -44,8 +43,8 @@
4443
import static com.mongodb.internal.operation.DocumentHelper.putIfNotZero;
4544
import static com.mongodb.internal.operation.DocumentHelper.putIfTrue;
4645
import static com.mongodb.internal.operation.OperationHelper.validateCollation;
46+
import static com.mongodb.internal.operation.OperationHelper.validateHint;
4747
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsAtLeastVersionThreeDotTwo;
48-
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsLessThanVersionFourDotTwo;
4948
import static java.util.concurrent.TimeUnit.MILLISECONDS;
5049

5150
/**
@@ -379,9 +378,7 @@ private BsonDocument createCommand(final SessionContext sessionContext, final Se
379378
commandDocument.put("collation", collation.asDocument());
380379
}
381380
if (hint != null || hintString != null) {
382-
if (serverIsLessThanVersionFourDotTwo(connectionDescription)) {
383-
throw new MongoClientException("Specifying a value for the hint option requires a minimum MongoDB version of 4.2");
384-
}
381+
validateHint(connectionDescription, getWriteConcern());
385382
if (hint != null) {
386383
commandDocument.put("hint", hint.toBsonDocument(BsonDocument.class, null));
387384
} else {

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package com.mongodb.internal.operation;
1818

19-
import com.mongodb.MongoClientException;
2019
import com.mongodb.MongoNamespace;
2120
import com.mongodb.WriteConcern;
2221
import com.mongodb.client.model.Collation;
@@ -46,8 +45,8 @@
4645
import static com.mongodb.internal.operation.DocumentHelper.putIfNotZero;
4746
import static com.mongodb.internal.operation.DocumentHelper.putIfTrue;
4847
import static com.mongodb.internal.operation.OperationHelper.validateCollation;
48+
import static com.mongodb.internal.operation.OperationHelper.validateHint;
4949
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsAtLeastVersionThreeDotTwo;
50-
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsLessThanVersionFourDotTwo;
5150
import static java.util.concurrent.TimeUnit.MILLISECONDS;
5251

5352
/**
@@ -453,9 +452,7 @@ private BsonDocument createCommand(final SessionContext sessionContext, final Se
453452
commandDocument.put("arrayFilters", new BsonArray(arrayFilters));
454453
}
455454
if (hint != null || hintString != null) {
456-
if (serverIsLessThanVersionFourDotTwo(connectionDescription)) {
457-
throw new MongoClientException("Specifying a value for the hint option requires a minimum MongoDB version of 4.2");
458-
}
455+
validateHint(connectionDescription, getWriteConcern());
459456
if (hint != null) {
460457
commandDocument.put("hint", hint.toBsonDocument(BsonDocument.class, null));
461458
} else {

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import static com.mongodb.internal.async.ErrorHandlingResultCallback.errorHandlingCallback;
5858
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsAtLeastVersionThreeDotFour;
5959
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsAtLeastVersionThreeDotTwo;
60-
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsLessThanVersionFourDotFour;
6160
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsLessThanVersionFourDotTwo;
6261
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsLessThanVersionThreeDotFour;
6362
import static com.mongodb.internal.operation.ServerVersionHelper.serverIsLessThanVersionThreeDotSix;
@@ -153,21 +152,22 @@ private static void validateArrayFilters(final ConnectionDescription connectionD
153152
}
154153
}
155154

156-
private static void validateHint(final ConnectionDescription connectionDescription, final WriteConcern writeConcern,
157-
final WriteRequest request) {
155+
private static void validateWriteRequestHint(final ConnectionDescription connectionDescription, final WriteConcern writeConcern,
156+
final WriteRequest request) {
158157
if (serverIsLessThanVersionThreeDotFour(connectionDescription)) {
159158
throw new IllegalArgumentException(format("Hint not supported by wire version: %s",
160159
connectionDescription.getMaxWireVersion()));
160+
} else if ((request instanceof DeleteRequest || request instanceof UpdateRequest) && !writeConcern.isAcknowledged()) {
161+
throw new MongoClientException("Specifying hints with an unacknowledged WriteConcern is not supported");
162+
}
163+
}
164+
165+
static void validateHint(final ConnectionDescription connectionDescription, final WriteConcern writeConcern) {
166+
if (serverIsLessThanVersionFourDotTwo(connectionDescription)) {
167+
throw new IllegalArgumentException(format("Hint not supported by wire version: %s",
168+
connectionDescription.getMaxWireVersion()));
161169
} else if (!writeConcern.isAcknowledged()) {
162-
if (serverIsLessThanVersionFourDotTwo(connectionDescription)) {
163-
throw new MongoClientException(
164-
format("Specifying hints with an unacknowledged WriteConcern is not supported by wire version: %s",
165-
connectionDescription.getMaxWireVersion()));
166-
} else if (request instanceof DeleteRequest && serverIsLessThanVersionFourDotFour(connectionDescription)) {
167-
throw new MongoClientException(
168-
format("Specifying hints with an unacknowledged WriteConcern in a delete request is not supported by wire version: %s",
169-
connectionDescription.getMaxWireVersion()));
170-
}
170+
throw new MongoClientException("Specifying hints with an unacknowledged WriteConcern is not supported");
171171
}
172172
}
173173

@@ -234,7 +234,7 @@ static void validateWriteRequestHints(final ConnectionDescription connectionDesc
234234
hintString = ((DeleteRequest) request).getHintString();
235235
}
236236
if (hint != null || hintString != null) {
237-
validateHint(connectionDescription, writeConcern, request);
237+
validateWriteRequestHint(connectionDescription, writeConcern, request);
238238
break;
239239
}
240240
}

driver-core/src/test/resources/crud/v2/bulkWrite-delete-hint.json

Lines changed: 0 additions & 204 deletions
This file was deleted.

driver-core/src/test/resources/crud/v2/findOneAndReplace-hint-serverError.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"runOn": [
33
{
44
"minServerVersion": "4.2.0",
5-
"maxServerVersion": "4.2.99"
5+
"maxServerVersion": "4.3.0"
66
}
77
],
88
"data": [

driver-core/src/test/resources/crud/v2/findOneAndUpdate-hint-serverError.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"runOn": [
33
{
44
"minServerVersion": "4.2.0",
5-
"maxServerVersion": "4.2.99"
5+
"maxServerVersion": "4.3.0"
66
}
77
],
88
"data": [

driver-core/src/test/resources/crud/v2/unacknowledged-bulkWrite-delete-hint-clientError.json

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
11
{
2-
"runOn": [
3-
{
4-
"maxServerVersion": "4.3.3"
5-
}
6-
],
72
"data": [
83
{
94
"_id": 1,
@@ -25,7 +20,7 @@
2520
"collection_name": "BulkWrite_delete_hint",
2621
"tests": [
2722
{
28-
"description": "Unacknowledged bulkWrite deleteOne with hints fails with client-side error on server < 4.4",
23+
"description": "Unacknowledged bulkWrite deleteOne with hints fails with client-side error",
2924
"operations": [
3025
{
3126
"name": "bulkWrite",
@@ -89,7 +84,7 @@
8984
}
9085
},
9186
{
92-
"description": "Unacknowledged bulkWrite deleteMany with hints fails with client-side error on server < 4.4",
87+
"description": "Unacknowledged bulkWrite deleteMany with hints fails with client-side error",
9388
"operations": [
9489
{
9590
"name": "bulkWrite",

0 commit comments

Comments
 (0)