Skip to content

Commit 27438d6

Browse files
committed
Addressed next set of review feedback:
- expose only DisconnectionHistory instead of ConnectionTarget as protected - Nullable annotation on ConnectionTarget's DisconnectionHistory field - log seconds and milliseconds since last connect, as #s/#ms - in test, re-use thread pool, narrowed try-block for log checking, used default reconnection period, and updated logs to test for time formatting
1 parent 81cbcdc commit 27438d6

File tree

2 files changed

+44
-38
lines changed

2 files changed

+44
-38
lines changed

server/src/main/java/org/elasticsearch/cluster/NodeConnectionsService.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,14 @@ public void reconnectToNodes(DiscoveryNodes discoveryNodes, Runnable onCompletio
215215
}
216216

217217
// exposed for testing
218-
protected ConnectionTarget connectionTargetForNode(DiscoveryNode node) {
218+
protected DisconnectionHistory disconnectionHistoryForNode(DiscoveryNode node) {
219219
synchronized (mutex) {
220-
return targetsByNode.get(node);
220+
ConnectionTarget connectionTarget = targetsByNode.get(node);
221+
if (connectionTarget != null) {
222+
return connectionTarget.disconnectionHistory;
223+
}
221224
}
225+
return null;
222226
}
223227

224228
/**
@@ -235,14 +239,15 @@ public Exception getDisconnectCause() {
235239
}
236240
}
237241

238-
protected class ConnectionTarget {
242+
private class ConnectionTarget {
239243
private final DiscoveryNode discoveryNode;
240244

241245
private final AtomicInteger consecutiveFailureCount = new AtomicInteger();
242246
private final AtomicReference<Releasable> connectionRef = new AtomicReference<>();
243247

244248
// access is synchronized by the service mutex
245-
protected DisconnectionHistory disconnectionHistory = null;
249+
@Nullable // null when node is connected or initialized; non-null in between disconnects and connects
250+
private DisconnectionHistory disconnectionHistory = null;
246251

247252
// all access to these fields is synchronized
248253
private List<Releasable> pendingRefs;
@@ -397,15 +402,17 @@ public void onNodeConnected(DiscoveryNode node, Transport.Connection connection)
397402

398403
if (disconnectionHistory != null) {
399404
long millisSinceDisconnect = threadPool.absoluteTimeInMillis() - disconnectionHistory.disconnectTimeMillis;
405+
long secondsSinceDisconnect = millisSinceDisconnect / 1000;
400406
if (disconnectionHistory.disconnectCause != null) {
401407
logger.warn(
402408
() -> format(
403409
"""
404410
reopened transport connection to node [%s] \
405-
which disconnected exceptionally [%dms] ago but did not \
411+
which disconnected exceptionally [%ds/%dms] ago but did not \
406412
restart, so the disconnection is unexpected; \
407413
see [%s] for troubleshooting guidance""",
408414
node.descriptionWithoutAttributes(),
415+
secondsSinceDisconnect,
409416
millisSinceDisconnect,
410417
ReferenceDocs.NETWORK_DISCONNECT_TROUBLESHOOTING
411418
),
@@ -415,10 +422,11 @@ public void onNodeConnected(DiscoveryNode node, Transport.Connection connection)
415422
logger.warn(
416423
"""
417424
reopened transport connection to node [{}] \
418-
which disconnected gracefully [{}ms] ago but did not \
425+
which disconnected gracefully [{}s/{}ms] ago but did not \
419426
restart, so the disconnection is unexpected; \
420427
see [{}] for troubleshooting guidance""",
421428
node.descriptionWithoutAttributes(),
429+
secondsSinceDisconnect,
422430
millisSinceDisconnect,
423431
ReferenceDocs.NETWORK_DISCONNECT_TROUBLESHOOTING
424432
);

server/src/test/java/org/elasticsearch/cluster/NodeConnectionsServiceTests.java

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.elasticsearch.action.ActionRunnable;
1818
import org.elasticsearch.action.support.PlainActionFuture;
1919
import org.elasticsearch.action.support.SubscribableListener;
20-
import org.elasticsearch.cluster.NodeConnectionsService.ConnectionTarget;
20+
import org.elasticsearch.cluster.NodeConnectionsService.DisconnectionHistory;
2121
import org.elasticsearch.cluster.node.DiscoveryNode;
2222
import org.elasticsearch.cluster.node.DiscoveryNodeRole;
2323
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
@@ -250,18 +250,17 @@ public String toString() {
250250
}
251251

252252
public void testDisconnectionHistory() {
253-
final Settings.Builder settings = Settings.builder();
254-
settings.put(CLUSTER_NODE_RECONNECT_INTERVAL_SETTING.getKey(), "100ms");
255-
256253
final DeterministicTaskQueue deterministicTaskQueue = new DeterministicTaskQueue();
257254
final ThreadPool threadPool = deterministicTaskQueue.getThreadPool();
255+
final long reconnectIntervalMillis = CLUSTER_NODE_RECONNECT_INTERVAL_SETTING.get(Settings.EMPTY).millis();
256+
final long reconnectIntervalSeconds = reconnectIntervalMillis / 1000;
258257

259-
MockTransport transport = new MockTransport(deterministicTaskQueue.getThreadPool());
260-
TestTransportService transportService = new TestTransportService(transport, deterministicTaskQueue.getThreadPool());
258+
MockTransport transport = new MockTransport(threadPool);
259+
TestTransportService transportService = new TestTransportService(transport, threadPool);
261260
transportService.start();
262261
transportService.acceptIncomingRequests();
263262

264-
final NodeConnectionsService service = new NodeConnectionsService(settings.build(), threadPool, transportService);
263+
final NodeConnectionsService service = new NodeConnectionsService(Settings.EMPTY, threadPool, transportService);
265264
service.start();
266265

267266
final DiscoveryNode noClose = DiscoveryNodeUtils.create("noClose");
@@ -281,6 +280,14 @@ public void testDisconnectionHistory() {
281280
assertNullDisconnectionHistory(service, gracefulClose);
282281
assertNullDisconnectionHistory(service, exceptionalClose);
283282

283+
transportService.disconnectFromNode(gracefulClose);
284+
transportService.disconnectFromNode(exceptionalClose);
285+
286+
// check disconnection history set after close
287+
assertNullDisconnectionHistory(service, noClose);
288+
assertDisconnectionHistoryDetails(service, threadPool, gracefulClose, null);
289+
assertDisconnectionHistoryDetails(service, threadPool, exceptionalClose, RuntimeException.class);
290+
284291
try (var mockLog = MockLog.capture(NodeConnectionsService.class)) {
285292
mockLog.addExpectation(
286293
new MockLog.SeenEventExpectation(
@@ -289,7 +296,7 @@ public void testDisconnectionHistory() {
289296
Level.WARN,
290297
"reopened transport connection to node ["
291298
+ gracefulClose.descriptionWithoutAttributes()
292-
+ "] which disconnected gracefully [*ms] ago "
299+
+ "] which disconnected gracefully [" + reconnectIntervalSeconds + "s/" + reconnectIntervalMillis + "ms] ago "
293300
+ "but did not restart, so the disconnection is unexpected; "
294301
+ "see [https://www.elastic.co/docs/*] for troubleshooting guidance"
295302
)
@@ -301,33 +308,24 @@ public void testDisconnectionHistory() {
301308
Level.WARN,
302309
"reopened transport connection to node ["
303310
+ exceptionalClose.descriptionWithoutAttributes()
304-
+ "] which disconnected exceptionally [*ms] ago "
311+
+ "] which disconnected exceptionally [" + reconnectIntervalSeconds + "s/" + reconnectIntervalMillis + "ms] ago "
305312
+ "but did not restart, so the disconnection is unexpected; "
306313
+ "see [https://www.elastic.co/docs/*] for troubleshooting guidance"
307314
)
308315
);
309-
transportService.disconnectFromNode(gracefulClose);
310-
transportService.disconnectFromNode(exceptionalClose);
311-
312-
// check disconnection history set after close
313-
assertNullDisconnectionHistory(service, noClose);
314-
assertDisconnectionHistoryDetails(service, threadPool, gracefulClose, null);
315-
assertDisconnectionHistoryDetails(service, threadPool, exceptionalClose, RuntimeException.class);
316-
317-
runTasksUntil(deterministicTaskQueue, 200);
318-
319-
// check on reconnect -- disconnection history is reset
320-
assertNullDisconnectionHistory(service, noClose);
321-
assertNullDisconnectionHistory(service, gracefulClose);
322-
assertNullDisconnectionHistory(service, exceptionalClose);
323-
316+
runTasksUntil(deterministicTaskQueue, deterministicTaskQueue.getCurrentTimeMillis() + reconnectIntervalMillis);
324317
mockLog.assertAllExpectationsMatched();
325318
}
319+
320+
// check on reconnect -- disconnection history is reset
321+
assertNullDisconnectionHistory(service, noClose);
322+
assertNullDisconnectionHistory(service, gracefulClose);
323+
assertNullDisconnectionHistory(service, exceptionalClose);
326324
}
327325

328326
private void assertNullDisconnectionHistory(NodeConnectionsService service, DiscoveryNode node) {
329-
ConnectionTarget nodeTarget = service.connectionTargetForNode(node);
330-
assertNull(nodeTarget.disconnectionHistory);
327+
DisconnectionHistory disconnectionHistory = service.disconnectionHistoryForNode(node);
328+
assertNull(disconnectionHistory);
331329
}
332330

333331
private void assertDisconnectionHistoryDetails(
@@ -336,14 +334,14 @@ private void assertDisconnectionHistoryDetails(
336334
DiscoveryNode node,
337335
@Nullable Class<?> disconnectCauseClass
338336
) {
339-
ConnectionTarget nodeTarget = service.connectionTargetForNode(node);
340-
assertNotNull(nodeTarget.disconnectionHistory);
341-
assertTrue(threadPool.absoluteTimeInMillis() - nodeTarget.disconnectionHistory.getDisconnectTimeMillis() >= 0);
342-
assertTrue(threadPool.absoluteTimeInMillis() - nodeTarget.disconnectionHistory.getDisconnectTimeMillis() <= 200);
337+
DisconnectionHistory disconnectionHistory = service.disconnectionHistoryForNode(node);
338+
assertNotNull(disconnectionHistory);
339+
assertTrue(threadPool.absoluteTimeInMillis() - disconnectionHistory.getDisconnectTimeMillis() >= 0);
340+
assertTrue(threadPool.absoluteTimeInMillis() - disconnectionHistory.getDisconnectTimeMillis() <= 200);
343341
if (disconnectCauseClass != null) {
344-
assertThat(nodeTarget.disconnectionHistory.getDisconnectCause(), Matchers.isA(disconnectCauseClass));
342+
assertThat(disconnectionHistory.getDisconnectCause(), Matchers.isA(disconnectCauseClass));
345343
} else {
346-
assertNull(nodeTarget.disconnectionHistory.getDisconnectCause());
344+
assertNull(disconnectionHistory.getDisconnectCause());
347345
}
348346
}
349347

0 commit comments

Comments
 (0)