|
19 | 19 |
|
20 | 20 | package org.elasticsearch.cluster; |
21 | 21 |
|
| 22 | +import org.apache.logging.log4j.Level; |
| 23 | +import org.apache.logging.log4j.LogManager; |
22 | 24 | import org.elasticsearch.ElasticsearchTimeoutException; |
23 | 25 | import org.elasticsearch.Version; |
24 | 26 | import org.elasticsearch.action.ActionListener; |
|
31 | 33 | import org.elasticsearch.common.UUIDs; |
32 | 34 | import org.elasticsearch.common.component.Lifecycle; |
33 | 35 | import org.elasticsearch.common.component.LifecycleListener; |
| 36 | +import org.elasticsearch.common.logging.Loggers; |
34 | 37 | import org.elasticsearch.common.settings.Settings; |
35 | 38 | import org.elasticsearch.common.transport.BoundTransportAddress; |
36 | 39 | import org.elasticsearch.common.transport.TransportAddress; |
37 | 40 | import org.elasticsearch.test.ESTestCase; |
| 41 | +import org.elasticsearch.test.MockLogAppender; |
| 42 | +import org.elasticsearch.test.junit.annotations.TestLogging; |
38 | 43 | import org.elasticsearch.threadpool.TestThreadPool; |
39 | 44 | import org.elasticsearch.threadpool.ThreadPool; |
40 | 45 | import org.elasticsearch.transport.ConnectTransportException; |
|
72 | 77 | public class NodeConnectionsServiceTests extends ESTestCase { |
73 | 78 |
|
74 | 79 | private ThreadPool threadPool; |
75 | | - private MockTransport transport; |
76 | 80 | private TransportService transportService; |
77 | 81 | private Map<DiscoveryNode, CheckedRunnable<Exception>> nodeConnectionBlocks; |
78 | 82 |
|
@@ -301,6 +305,116 @@ public void testOnlyBlocksOnConnectionsToNewNodes() throws Exception { |
301 | 305 | } |
302 | 306 | } |
303 | 307 |
|
| 308 | + @TestLogging(reason="testing that DEBUG-level logging is reasonable", value="org.elasticsearch.cluster.NodeConnectionsService:DEBUG") |
| 309 | + public void testDebugLogging() throws IllegalAccessException { |
| 310 | + final DeterministicTaskQueue deterministicTaskQueue |
| 311 | + = new DeterministicTaskQueue(builder().put(NODE_NAME_SETTING.getKey(), "node").build(), random()); |
| 312 | + |
| 313 | + MockTransport transport = new MockTransport(deterministicTaskQueue.getThreadPool()); |
| 314 | + TestTransportService transportService = new TestTransportService(transport, deterministicTaskQueue.getThreadPool()); |
| 315 | + transportService.start(); |
| 316 | + transportService.acceptIncomingRequests(); |
| 317 | + |
| 318 | + final NodeConnectionsService service |
| 319 | + = new NodeConnectionsService(Settings.EMPTY, deterministicTaskQueue.getThreadPool(), transportService); |
| 320 | + service.start(); |
| 321 | + |
| 322 | + final List<DiscoveryNode> allNodes = generateNodes(); |
| 323 | + final DiscoveryNodes targetNodes = discoveryNodesFromList(randomSubsetOf(allNodes)); |
| 324 | + service.connectToNodes(targetNodes, () -> {}); |
| 325 | + deterministicTaskQueue.runAllRunnableTasks(); |
| 326 | + |
| 327 | + // periodic reconnections to unexpectedly-disconnected nodes are logged |
| 328 | + final Set<DiscoveryNode> disconnectedNodes = new HashSet<>(randomSubsetOf(allNodes)); |
| 329 | + for (DiscoveryNode disconnectedNode : disconnectedNodes) { |
| 330 | + transportService.disconnectFromNode(disconnectedNode); |
| 331 | + } |
| 332 | + MockLogAppender appender = new MockLogAppender(); |
| 333 | + try { |
| 334 | + appender.start(); |
| 335 | + Loggers.addAppender(LogManager.getLogger("org.elasticsearch.cluster.NodeConnectionsService"), appender); |
| 336 | + for (DiscoveryNode targetNode : targetNodes) { |
| 337 | + if (disconnectedNodes.contains(targetNode)) { |
| 338 | + appender.addExpectation(new MockLogAppender.SeenEventExpectation("connecting to " + targetNode, |
| 339 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 340 | + "connecting to " + targetNode)); |
| 341 | + appender.addExpectation(new MockLogAppender.SeenEventExpectation("connected to " + targetNode, |
| 342 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 343 | + "connected to " + targetNode)); |
| 344 | + } else { |
| 345 | + appender.addExpectation(new MockLogAppender.UnseenEventExpectation("connecting to " + targetNode, |
| 346 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 347 | + "connecting to " + targetNode)); |
| 348 | + appender.addExpectation(new MockLogAppender.UnseenEventExpectation("connected to " + targetNode, |
| 349 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 350 | + "connected to " + targetNode)); |
| 351 | + } |
| 352 | + } |
| 353 | + |
| 354 | + runTasksUntil(deterministicTaskQueue, CLUSTER_NODE_RECONNECT_INTERVAL_SETTING.get(Settings.EMPTY).millis()); |
| 355 | + appender.assertAllExpectationsMatched(); |
| 356 | + } finally { |
| 357 | + Loggers.removeAppender(LogManager.getLogger("org.elasticsearch.cluster.NodeConnectionsService"), appender); |
| 358 | + appender.stop(); |
| 359 | + } for (DiscoveryNode disconnectedNode : disconnectedNodes) { |
| 360 | + transportService.disconnectFromNode(disconnectedNode); |
| 361 | + } |
| 362 | + |
| 363 | + // changes to the expected set of nodes are logged, including reconnections to any unexpectedly-disconnected nodes |
| 364 | + final DiscoveryNodes newTargetNodes = discoveryNodesFromList(randomSubsetOf(allNodes)); |
| 365 | + for (DiscoveryNode disconnectedNode : disconnectedNodes) { |
| 366 | + transportService.disconnectFromNode(disconnectedNode); |
| 367 | + } |
| 368 | + appender = new MockLogAppender(); |
| 369 | + try { |
| 370 | + appender.start(); |
| 371 | + Loggers.addAppender(LogManager.getLogger("org.elasticsearch.cluster.NodeConnectionsService"), appender); |
| 372 | + for (DiscoveryNode targetNode : targetNodes) { |
| 373 | + if (disconnectedNodes.contains(targetNode) && newTargetNodes.get(targetNode.getId()) != null) { |
| 374 | + appender.addExpectation(new MockLogAppender.SeenEventExpectation("connecting to " + targetNode, |
| 375 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 376 | + "connecting to " + targetNode)); |
| 377 | + appender.addExpectation(new MockLogAppender.SeenEventExpectation("connected to " + targetNode, |
| 378 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 379 | + "connected to " + targetNode)); |
| 380 | + } else { |
| 381 | + appender.addExpectation(new MockLogAppender.UnseenEventExpectation("connecting to " + targetNode, |
| 382 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 383 | + "connecting to " + targetNode)); |
| 384 | + appender.addExpectation(new MockLogAppender.UnseenEventExpectation("connected to " + targetNode, |
| 385 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 386 | + "connected to " + targetNode)); |
| 387 | + } |
| 388 | + if (newTargetNodes.get(targetNode.getId()) == null) { |
| 389 | + appender.addExpectation(new MockLogAppender.SeenEventExpectation("disconnected from " + targetNode, |
| 390 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 391 | + "disconnected from " + targetNode)); |
| 392 | + } |
| 393 | + } |
| 394 | + for (DiscoveryNode targetNode : newTargetNodes) { |
| 395 | + appender.addExpectation(new MockLogAppender.UnseenEventExpectation("disconnected from " + targetNode, |
| 396 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 397 | + "disconnected from " + targetNode)); |
| 398 | + if (targetNodes.get(targetNode.getId()) == null) { |
| 399 | + appender.addExpectation(new MockLogAppender.SeenEventExpectation("connecting to " + targetNode, |
| 400 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 401 | + "connecting to " + targetNode)); |
| 402 | + appender.addExpectation(new MockLogAppender.SeenEventExpectation("connected to " + targetNode, |
| 403 | + "org.elasticsearch.cluster.NodeConnectionsService", Level.DEBUG, |
| 404 | + "connected to " + targetNode)); |
| 405 | + } |
| 406 | + } |
| 407 | + |
| 408 | + service.disconnectFromNodesExcept(newTargetNodes); |
| 409 | + service.connectToNodes(newTargetNodes, () -> {}); |
| 410 | + deterministicTaskQueue.runAllRunnableTasks(); |
| 411 | + appender.assertAllExpectationsMatched(); |
| 412 | + } finally { |
| 413 | + Loggers.removeAppender(LogManager.getLogger("org.elasticsearch.cluster.NodeConnectionsService"), appender); |
| 414 | + appender.stop(); |
| 415 | + } |
| 416 | + } |
| 417 | + |
304 | 418 | private void runTasksUntil(DeterministicTaskQueue deterministicTaskQueue, long endTimeMillis) { |
305 | 419 | while (deterministicTaskQueue.getCurrentTimeMillis() < endTimeMillis) { |
306 | 420 | if (deterministicTaskQueue.hasRunnableTasks() && randomBoolean()) { |
@@ -339,9 +453,8 @@ public void setUp() throws Exception { |
339 | 453 | super.setUp(); |
340 | 454 | ThreadPool threadPool = new TestThreadPool(getClass().getName()); |
341 | 455 | this.threadPool = threadPool; |
342 | | - this.transport = new MockTransport(threadPool); |
343 | 456 | nodeConnectionBlocks = newConcurrentMap(); |
344 | | - transportService = new TestTransportService(transport, threadPool); |
| 457 | + transportService = new TestTransportService(new MockTransport(threadPool), threadPool); |
345 | 458 | transportService.start(); |
346 | 459 | transportService.acceptIncomingRequests(); |
347 | 460 | } |
|
0 commit comments