2424
2525import java .util .Collections ;
2626
27+ import static com .mongodb .assertions .Assertions .assertFalse ;
2728import static com .mongodb .client .Fixture .getMongoClientSettingsBuilder ;
2829
2930public 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