Skip to content

Commit a1b912f

Browse files
committed
allowDiskUse option for find should be documented as only
being supported in 4.4+ JAVA-3739
1 parent ec8ae67 commit a1b912f

File tree

10 files changed

+286
-34
lines changed

10 files changed

+286
-34
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
import static com.mongodb.internal.operation.OperationHelper.LOGGER;
6464
import static com.mongodb.internal.operation.OperationHelper.cursorDocumentToQueryResult;
6565
import static com.mongodb.internal.operation.OperationHelper.releasingCallback;
66-
import static com.mongodb.internal.operation.OperationHelper.validateReadConcernAndCollation;
66+
import static com.mongodb.internal.operation.OperationHelper.validateFindOptions;
6767
import static com.mongodb.internal.operation.OperationHelper.withAsyncReadConnection;
6868
import static com.mongodb.internal.operation.OperationHelper.withReadConnectionSource;
6969
import static com.mongodb.internal.operation.OperationReadConcernHelper.appendReadConcernToCommand;
@@ -661,7 +661,7 @@ public BatchCursor<T> call(final ConnectionSource source) {
661661
}
662662
} else {
663663
try {
664-
validateReadConcernAndCollation(connection, binding.getSessionContext().getReadConcern(), collation);
664+
validateFindOptions(connection, binding.getSessionContext().getReadConcern(), collation, allowDiskUse);
665665
QueryResult<T> queryResult = connection.query(namespace,
666666
asDocument(connection.getDescription(), binding.getReadPreference()),
667667
projection,
@@ -702,7 +702,8 @@ public void call(final AsyncConnectionSource source, final AsyncConnection conne
702702
} else {
703703
final SingleResultCallback<AsyncBatchCursor<T>> wrappedCallback =
704704
releasingCallback(errHandlingCallback, source, connection);
705-
validateReadConcernAndCollation(source, connection, binding.getSessionContext().getReadConcern(), collation,
705+
validateFindOptions(source, connection, binding.getSessionContext().getReadConcern(), collation,
706+
allowDiskUse,
706707
new AsyncCallableWithConnectionAndSource() {
707708
@Override
708709
public void call(final AsyncConnectionSource source, final AsyncConnection connection, final
@@ -882,7 +883,7 @@ private CommandCreator getCommandCreator(final SessionContext sessionContext) {
882883
return new CommandOperationHelper.CommandCreator() {
883884
@Override
884885
public BsonDocument create(final ServerDescription serverDescription, final ConnectionDescription connectionDescription) {
885-
validateReadConcernAndCollation(connectionDescription, sessionContext.getReadConcern(), collation);
886+
validateFindOptions(connectionDescription, sessionContext.getReadConcern(), collation, allowDiskUse);
886887
return getCommand(sessionContext, connectionDescription);
887888
}
888889
};

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

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252

5353
import java.util.Collections;
5454
import java.util.List;
55+
import java.util.Optional;
5556

5657
import static com.mongodb.assertions.Assertions.notNull;
5758
import static com.mongodb.internal.async.ErrorHandlingResultCallback.errorHandlingCallback;
@@ -171,6 +172,18 @@ static void validateHint(final ConnectionDescription connectionDescription, fina
171172
}
172173
}
173174

175+
static void validateAllowDiskUse(final Connection connection, final Boolean allowDiskUse) {
176+
validateAllowDiskUse(connection.getDescription(), allowDiskUse).ifPresent(throwable -> {
177+
throw new IllegalArgumentException(throwable.getMessage());
178+
});
179+
}
180+
181+
static void validateAllowDiskUse(final AsyncConnection connection, final Boolean allowDiskUse,
182+
final AsyncCallableWithConnection callable) {
183+
Optional<Throwable> throwable = validateAllowDiskUse(connection.getDescription(), allowDiskUse);
184+
callable.call(connection, throwable.isPresent() ? throwable.get() : null);
185+
}
186+
174187
static void validateCollation(final AsyncConnection connection, final Collation collation,
175188
final AsyncCallableWithConnection callable) {
176189
Throwable throwable = null;
@@ -287,6 +300,20 @@ public void call(final AsyncConnection connection, final Throwable t) {
287300
}
288301
}
289302

303+
static void validateFindOptions(final Connection connection, final ReadConcern readConcern, final Collation collation,
304+
final Boolean allowDiskUse) {
305+
validateReadConcernAndCollation(connection, readConcern, collation);
306+
validateAllowDiskUse(connection, allowDiskUse);
307+
}
308+
309+
static void validateFindOptions(final ConnectionDescription description, final ReadConcern readConcern,
310+
final Collation collation, final Boolean allowDiskUse) {
311+
validateReadConcernAndCollation(description, readConcern, collation);
312+
validateAllowDiskUse(description, allowDiskUse).ifPresent(throwable -> {
313+
throw new IllegalArgumentException(throwable.getMessage());
314+
});
315+
}
316+
290317
static void validateReadConcernAndCollation(final Connection connection, final ReadConcern readConcern,
291318
final Collation collation) {
292319
validateReadConcern(connection, readConcern);
@@ -299,10 +326,35 @@ static void validateReadConcernAndCollation(final ConnectionDescription descript
299326
validateCollation(description, collation);
300327
}
301328

329+
static void validateFindOptions(final AsyncConnection connection, final ReadConcern readConcern,
330+
final Collation collation, final Boolean allowDiskUse,
331+
final AsyncCallableWithConnection callable) {
332+
validateReadConcernAndCollation(connection, readConcern, collation, new AsyncCallableWithConnection() {
333+
@Override
334+
public void call(final AsyncConnection connection, final Throwable t) {
335+
if (t != null) {
336+
callable.call(connection, t);
337+
} else {
338+
validateAllowDiskUse(connection, allowDiskUse, callable);
339+
}
340+
}
341+
});
342+
}
343+
344+
static void validateFindOptions(final AsyncConnectionSource source, final AsyncConnection connection, final ReadConcern readConcern,
345+
final Collation collation, final Boolean allowDiskUse,
346+
final AsyncCallableWithConnectionAndSource callable) {
347+
validateFindOptions(connection, readConcern, collation, allowDiskUse, new AsyncCallableWithConnection() {
348+
@Override
349+
public void call(final AsyncConnection connection, final Throwable t) {
350+
callable.call(source, connection, t);
351+
}
352+
});
353+
}
354+
302355
static void validateReadConcernAndCollation(final AsyncConnection connection, final ReadConcern readConcern,
303-
final Collation collation,
304-
final AsyncCallableWithConnection callable) {
305-
validateReadConcern(connection, readConcern, new AsyncCallableWithConnection(){
356+
final Collation collation, final AsyncCallableWithConnection callable) {
357+
validateReadConcern(connection, readConcern, new AsyncCallableWithConnection() {
306358
@Override
307359
public void call(final AsyncConnection connection, final Throwable t) {
308360
if (t != null) {
@@ -700,6 +752,15 @@ public void onResult(final AsyncConnectionSource source, final Throwable t) {
700752
}
701753
}
702754

755+
private static Optional<Throwable> validateAllowDiskUse(final ConnectionDescription description, final Boolean allowDiskUse) {
756+
Optional<Throwable> throwable = Optional.empty();
757+
if (allowDiskUse != null && serverIsLessThanVersionThreeDotFour(description)) {
758+
throwable = Optional.of(new IllegalArgumentException(format("allowDiskUse not supported by wire version: %s",
759+
description.getMaxWireVersion())));
760+
}
761+
return throwable;
762+
}
763+
703764
private OperationHelper() {
704765
}
705766
}

driver-core/src/test/functional/com/mongodb/client/CommandMonitoringTestHelper.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,9 @@ private static CommandStartedEvent massageExpectedCommandStartedEvent(final Comm
318318
if (command.containsKey("writeConcern") && command.isNull("writeConcern")) {
319319
command.remove("writeConcern");
320320
}
321+
if (command.containsKey("allowDiskUse") && command.isNull("allowDiskUse")) {
322+
command.remove("allowDiskUse");
323+
}
321324
if (command.containsKey("readConcern")) {
322325
if (command.isNull("readConcern")) {
323326
command.remove("readConcern");

driver-core/src/test/functional/com/mongodb/internal/operation/FindOperationSpecification.groovy

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,6 @@ class FindOperationSpecification extends OperationFunctionalSpecification {
672672
def operation = new FindOperation<Document>(getNamespace(), new DocumentCodec())
673673
.projection(new BsonDocument('x', new BsonInt32(1)))
674674
.filter(new BsonDocument('z', new BsonString('val')))
675-
.allowDiskUse(true)
676675
def binding = Stub(ReadBinding) {
677676
getSessionContext() >> Stub(SessionContext) {
678677
getReadConcern() >> ReadConcern.DEFAULT
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
"runOn": [
3+
{
4+
"maxServerVersion": "3.0.99"
5+
}
6+
],
7+
"collection_name": "test_find_allowdiskuse_clienterror",
8+
"tests": [
9+
{
10+
"description": "Find fails when allowDiskUse true is specified against pre 3.2 server",
11+
"operations": [
12+
{
13+
"object": "collection",
14+
"name": "find",
15+
"arguments": {
16+
"filter": {},
17+
"allowDiskUse": true
18+
},
19+
"error": true
20+
}
21+
],
22+
"expectations": []
23+
},
24+
{
25+
"description": "Find fails when allowDiskUse false is specified against pre 3.2 server",
26+
"operations": [
27+
{
28+
"object": "collection",
29+
"name": "find",
30+
"arguments": {
31+
"filter": {},
32+
"allowDiskUse": false
33+
},
34+
"error": true
35+
}
36+
],
37+
"expectations": []
38+
}
39+
]
40+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
{
2+
"runOn": [
3+
{
4+
"minServerVersion": "3.4",
5+
"maxServerVersion": "4.3.0"
6+
}
7+
],
8+
"collection_name": "test_find_allowdiskuse_servererror",
9+
"tests": [
10+
{
11+
"description": "Find fails when allowDiskUse true is specified against pre 4.4 server (server-side error)",
12+
"operations": [
13+
{
14+
"object": "collection",
15+
"name": "find",
16+
"arguments": {
17+
"filter": {},
18+
"allowDiskUse": true
19+
},
20+
"error": true
21+
}
22+
],
23+
"expectations": [
24+
{
25+
"command_started_event": {
26+
"command": {
27+
"find": "test_find_allowdiskuse_servererror",
28+
"filter": {},
29+
"allowDiskUse": true
30+
}
31+
}
32+
}
33+
]
34+
},
35+
{
36+
"description": "Find fails when allowDiskUse false is specified against pre 4.4 server (server-side error)",
37+
"operations": [
38+
{
39+
"object": "collection",
40+
"name": "find",
41+
"arguments": {
42+
"filter": {},
43+
"allowDiskUse": false
44+
},
45+
"error": true
46+
}
47+
],
48+
"expectations": [
49+
{
50+
"command_started_event": {
51+
"command": {
52+
"find": "test_find_allowdiskuse_servererror",
53+
"filter": {},
54+
"allowDiskUse": false
55+
}
56+
}
57+
}
58+
]
59+
}
60+
]
61+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
{
2+
"runOn": [
3+
{
4+
"minServerVersion": "4.3.1"
5+
}
6+
],
7+
"collection_name": "test_find_allowdiskuse",
8+
"tests": [
9+
{
10+
"description": "Find does not send allowDiskuse when value is not specified",
11+
"operations": [
12+
{
13+
"object": "collection",
14+
"name": "find",
15+
"arguments": {
16+
"filter": {}
17+
}
18+
}
19+
],
20+
"expectations": [
21+
{
22+
"command_started_event": {
23+
"command": {
24+
"find": "test_find_allowdiskuse",
25+
"allowDiskUse": null
26+
}
27+
}
28+
}
29+
]
30+
},
31+
{
32+
"description": "Find sends allowDiskuse false when false is specified",
33+
"operations": [
34+
{
35+
"object": "collection",
36+
"name": "find",
37+
"arguments": {
38+
"filter": {},
39+
"allowDiskUse": false
40+
}
41+
}
42+
],
43+
"expectations": [
44+
{
45+
"command_started_event": {
46+
"command": {
47+
"find": "test_find_allowdiskuse",
48+
"allowDiskUse": false
49+
}
50+
}
51+
}
52+
]
53+
},
54+
{
55+
"description": "Find sends allowDiskUse true when true is specified",
56+
"operations": [
57+
{
58+
"object": "collection",
59+
"name": "find",
60+
"arguments": {
61+
"filter": {},
62+
"allowDiskUse": true
63+
}
64+
}
65+
],
66+
"expectations": [
67+
{
68+
"command_started_event": {
69+
"command": {
70+
"find": "test_find_allowdiskuse",
71+
"allowDiskUse": true
72+
}
73+
}
74+
}
75+
]
76+
}
77+
]
78+
}

0 commit comments

Comments
 (0)