32
32
33
33
package org .opensearch .cluster .coordination ;
34
34
35
+ import org .apache .logging .log4j .LogManager ;
36
+ import org .apache .logging .log4j .core .LogEvent ;
37
+ import org .apache .logging .log4j .core .LoggerContext ;
38
+ import org .apache .logging .log4j .core .appender .AbstractAppender ;
39
+ import org .apache .logging .log4j .core .config .Configuration ;
40
+ import org .apache .logging .log4j .core .config .LoggerConfig ;
41
+ import org .apache .logging .log4j .core .config .Property ;
42
+ import org .apache .logging .log4j .core .layout .PatternLayout ;
35
43
import org .opensearch .action .admin .cluster .health .ClusterHealthResponse ;
36
44
import org .opensearch .cluster .NodeConnectionsService ;
37
45
import org .opensearch .cluster .metadata .IndexMetadata ;
48
56
import org .opensearch .test .store .MockFSIndexStore ;
49
57
import org .opensearch .test .transport .MockTransportService ;
50
58
import org .opensearch .test .transport .StubbableTransport ;
59
+ import org .opensearch .transport .ClusterConnectionManager ;
51
60
import org .opensearch .transport .TransportChannel ;
52
61
import org .opensearch .transport .TransportRequest ;
53
62
import org .opensearch .transport .TransportRequestHandler ;
54
63
import org .opensearch .transport .TransportService ;
64
+ import org .junit .After ;
55
65
import org .junit .Before ;
56
66
67
+ import java .util .ArrayList ;
57
68
import java .util .Arrays ;
58
69
import java .util .Collection ;
70
+ import java .util .List ;
59
71
import java .util .concurrent .atomic .AtomicBoolean ;
72
+ import java .util .regex .Pattern ;
60
73
61
74
import static org .opensearch .cluster .coordination .FollowersChecker .FOLLOWER_CHECK_ACTION_NAME ;
62
75
import static org .hamcrest .Matchers .is ;
68
81
@ ClusterScope (scope = Scope .TEST , numDataNodes = 0 )
69
82
public class NodeJoinLeftIT extends OpenSearchIntegTestCase {
70
83
84
+ private TestAppender testAppender ;
71
85
private String clusterManager ;
72
86
private String redNodeName ;
87
+ private LoggerContext loggerContext ;
73
88
74
89
@ Override
75
90
protected Collection <Class <? extends Plugin >> nodePlugins () {
@@ -93,6 +108,13 @@ protected void beforeIndexDeletion() throws Exception {
93
108
@ Before
94
109
public void setUp () throws Exception {
95
110
super .setUp ();
111
+ testAppender = new TestAppender ();
112
+ loggerContext = (LoggerContext ) LogManager .getContext (false );
113
+ Configuration config = loggerContext .getConfiguration ();
114
+ LoggerConfig loggerConfig = config .getLoggerConfig (ClusterConnectionManager .class .getName ());
115
+ loggerConfig .addAppender (testAppender , null , null );
116
+ loggerContext .updateLoggers ();
117
+
96
118
String indexName = "test" ;
97
119
final Settings nodeSettings = Settings .builder ()
98
120
.put (RecoverySettings .INDICES_RECOVERY_RETRY_DELAY_NETWORK_SETTING .getKey (), "100ms" )
@@ -124,6 +146,16 @@ public void setUp() throws Exception {
124
146
.get ();
125
147
}
126
148
149
+ @ After
150
+ public void tearDown () throws Exception {
151
+ loggerContext = (LoggerContext ) LogManager .getContext (false );
152
+ Configuration config = loggerContext .getConfiguration ();
153
+ LoggerConfig loggerConfig = config .getLoggerConfig (ClusterConnectionManager .class .getName ());
154
+ loggerConfig .removeAppender (testAppender .getName ());
155
+ loggerContext .updateLoggers ();
156
+ super .tearDown ();
157
+ }
158
+
127
159
public void testClusterStabilityWhenJoinRequestHappensDuringNodeLeftTask () throws Exception {
128
160
129
161
ClusterService clusterManagerClsService = internalCluster ().getInstance (ClusterService .class , clusterManager );
@@ -181,6 +213,13 @@ public void testClusterStabilityWhenJoinRequestHappensDuringNodeLeftTask() throw
181
213
succeedFollowerChecker .set (true );
182
214
ClusterHealthResponse response = client ().admin ().cluster ().prepareHealth ().setWaitForNodes ("3" ).get ();
183
215
assertThat (response .isTimedOut (), is (false ));
216
+
217
+ // assert that the right exception message showed up in logs
218
+ assertTrue (
219
+ "Expected IllegalStateException was not logged" ,
220
+ testAppender .containsExceptionMessage ("IllegalStateException[cannot make a new connection as disconnect to node" )
221
+ );
222
+
184
223
}
185
224
186
225
public void testClusterStabilityWhenDisconnectDuringSlowNodeLeftTask () throws Exception {
@@ -251,6 +290,12 @@ public void testClusterStabilityWhenDisconnectDuringSlowNodeLeftTask() throws Ex
251
290
succeedFollowerChecker .set (true );
252
291
ClusterHealthResponse response = client ().admin ().cluster ().prepareHealth ().setWaitForNodes ("3" ).get ();
253
292
assertThat (response .isTimedOut (), is (false ));
293
+
294
+ // assert that the right exception message showed up in logs
295
+ assertTrue (
296
+ "Expected IllegalStateException was not logged" ,
297
+ testAppender .containsExceptionMessage ("IllegalStateException[cannot make a new connection as disconnect to node" )
298
+ );
254
299
}
255
300
256
301
public void testRestartDataNode () throws Exception {
@@ -301,4 +346,29 @@ public void messageReceived(
301
346
handler .messageReceived (request , channel , task );
302
347
}
303
348
}
349
+
350
+ private static class TestAppender extends AbstractAppender {
351
+ private final List <String > logs = new ArrayList <>();
352
+
353
+ TestAppender () {
354
+ super ("TestAppender" , null , PatternLayout .createDefaultLayout (), false , Property .EMPTY_ARRAY );
355
+ start ();
356
+ }
357
+
358
+ @ Override
359
+ public void append (LogEvent event ) {
360
+ logs .add (event .getMessage ().getFormattedMessage ());
361
+ if (event .getThrown () != null ) {
362
+ logs .add (event .getThrown ().toString ());
363
+ for (StackTraceElement element : event .getThrown ().getStackTrace ()) {
364
+ logs .add (element .toString ());
365
+ }
366
+ }
367
+ }
368
+
369
+ boolean containsExceptionMessage (String exceptionMessage ) {
370
+ Pattern pattern = Pattern .compile (Pattern .quote (exceptionMessage ), Pattern .CASE_INSENSITIVE );
371
+ return logs .stream ().anyMatch (log -> pattern .matcher (log ).find ());
372
+ }
373
+ }
304
374
}
0 commit comments