Skip to content

Commit f5e7383

Browse files
authored
Fix com.mongodb.client.FailPoint.enable (#1931)
Given the `FailPoint` API, when `enable` completes abruptly, it must not be case that the fail point is left enabled.
1 parent 6c4ab1b commit f5e7383

File tree

1 file changed

+44
-10
lines changed

1 file changed

+44
-10
lines changed

driver-sync/src/test/functional/com/mongodb/client/FailPoint.java

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import java.util.Collections;
2626

27+
import static com.mongodb.assertions.Assertions.assertFalse;
2728
import static com.mongodb.client.Fixture.getMongoClientSettingsBuilder;
2829

2930
public final class FailPoint implements AutoCloseable {
@@ -48,23 +49,56 @@ public static FailPoint enable(final BsonDocument configureFailPointDoc, final S
4849
.hosts(Collections.singletonList(serverAddress)))
4950
.build();
5051
MongoClient client = MongoClients.create(clientSettings);
51-
return enable(configureFailPointDoc, client);
52-
}
53-
54-
private static FailPoint enable(final BsonDocument configureFailPointDoc, final MongoClient client) {
55-
FailPoint result = new FailPoint(configureFailPointDoc, client);
56-
client.getDatabase("admin").runCommand(configureFailPointDoc);
57-
return result;
52+
try (Guard guard = new Guard(configureFailPointDoc, client)) {
53+
client.getDatabase("admin").runCommand(configureFailPointDoc);
54+
return guard.intoFailPoint();
55+
}
5856
}
5957

6058
@Override
6159
public void close() {
62-
try {
60+
disableAndClose(failPointDocument, client);
61+
}
62+
63+
private static void disableAndClose(final BsonDocument failPointDocument, final MongoClient client) {
64+
try (MongoClient ignored = client) {
6365
client.getDatabase("admin").runCommand(new BsonDocument()
6466
.append("configureFailPoint", failPointDocument.getString("configureFailPoint"))
6567
.append("mode", new BsonString("off")));
66-
} finally {
67-
client.close();
68+
}
69+
}
70+
71+
private static final class Guard implements AutoCloseable {
72+
private final BsonDocument failPointDocument;
73+
private final MongoClient client;
74+
private boolean consumed;
75+
76+
Guard(final BsonDocument failPointDocument, final MongoClient client) {
77+
this.failPointDocument = failPointDocument;
78+
this.client = client;
79+
consumed = false;
80+
}
81+
82+
/**
83+
* May be invoked at most once.
84+
*
85+
* @see #close()
86+
*/
87+
FailPoint intoFailPoint() {
88+
assertFalse(consumed);
89+
FailPoint result = new FailPoint(failPointDocument, client);
90+
consumed = true;
91+
return result;
92+
}
93+
94+
/**
95+
* Invokes {@link #disableAndClose(BsonDocument, MongoClient)} unless {@link #intoFailPoint()} was invoked.
96+
*/
97+
@Override
98+
public void close() {
99+
if (!consumed) {
100+
disableAndClose(failPointDocument, client);
101+
}
68102
}
69103
}
70104
}

0 commit comments

Comments
 (0)