Skip to content

Commit 20d6928

Browse files
committed
Simplify FailPoint.enable
1 parent 5ff9347 commit 20d6928

1 file changed

Lines changed: 37 additions & 20 deletions

File tree

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

Lines changed: 37 additions & 20 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,29 +49,12 @@ public static FailPoint enable(final BsonDocument configureFailPointDoc, final S
4849
.hosts(Collections.singletonList(serverAddress)))
4950
.build();
5051
MongoClient client = MongoClients.create(clientSettings);
51-
Throwable enableException = null;
52-
try {
53-
return enable(configureFailPointDoc, client);
54-
} catch (Throwable e) {
55-
enableException = e;
56-
throw e;
57-
} finally {
58-
if (enableException != null) {
59-
try {
60-
disableAndClose(configureFailPointDoc, client);
61-
} catch (Throwable closeException) {
62-
enableException.addSuppressed(closeException);
63-
}
64-
}
52+
try (Guard guard = new Guard(configureFailPointDoc, client)) {
53+
client.getDatabase("admin").runCommand(configureFailPointDoc);
54+
return guard.intoFailPoint();
6555
}
6656
}
6757

68-
private static FailPoint enable(final BsonDocument configureFailPointDoc, final MongoClient client) {
69-
FailPoint result = new FailPoint(configureFailPointDoc, client);
70-
client.getDatabase("admin").runCommand(configureFailPointDoc);
71-
return result;
72-
}
73-
7458
@Override
7559
public void close() {
7660
disableAndClose(failPointDocument, client);
@@ -85,4 +69,37 @@ private static void disableAndClose(final BsonDocument failPointDocument, final
8569
client.close();
8670
}
8771
}
72+
73+
private static final class Guard implements AutoCloseable {
74+
private final BsonDocument failPointDocument;
75+
private final MongoClient client;
76+
private boolean consumed;
77+
78+
Guard(final BsonDocument failPointDocument, final MongoClient client) {
79+
this.failPointDocument = failPointDocument;
80+
this.client = client;
81+
consumed = false;
82+
}
83+
84+
/**
85+
* May be invoked at most once.
86+
*
87+
* @see #close()
88+
*/
89+
FailPoint intoFailPoint() {
90+
assertFalse(consumed);
91+
consumed = true;
92+
return new FailPoint(failPointDocument, client);
93+
}
94+
95+
/**
96+
* Invokes {@link #disableAndClose(BsonDocument, MongoClient)} unless {@link #intoFailPoint()} was invoked.
97+
*/
98+
@Override
99+
public void close() {
100+
if (!consumed) {
101+
disableAndClose(failPointDocument, client);
102+
}
103+
}
104+
}
88105
}

0 commit comments

Comments
 (0)