Skip to content

Commit c8eb09f

Browse files
committed
Fail connection attempts earlier in tests (#43320)
Today the `DisruptibleMockTransport` always allows a connection to a node to be established, and then fails requests sent to that node such as the subsequent handshake. Since #42342, we log handshake failures on an open connection as a warning, and this makes the test logs rather noisy. This change fails the connection attempt first, avoiding these unrealistic warnings.
1 parent 5af9387 commit c8eb09f

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

server/src/test/java/org/elasticsearch/snapshots/SnapshotResiliencyTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -862,13 +862,14 @@ public void disconnectNode(TestClusterNode node) {
862862
}
863863

864864
public void clearNetworkDisruptions() {
865-
disruptedLinks.disconnected.forEach(nodeName -> {
865+
final Set<String> disconnectedNodes = new HashSet<>(disruptedLinks.disconnected);
866+
disruptedLinks.clear();
867+
disconnectedNodes.forEach(nodeName -> {
866868
if (testClusterNodes.nodes.containsKey(nodeName)) {
867869
final DiscoveryNode node = testClusterNodes.nodes.get(nodeName).node;
868870
testClusterNodes.nodes.values().forEach(n -> n.transportService.getConnectionManager().openConnection(node, null));
869871
}
870872
});
871-
disruptedLinks.clear();
872873
}
873874

874875
private NetworkDisruption.DisruptedLinks getDisruption() {

test/framework/src/main/java/org/elasticsearch/test/disruption/DisruptableMockTransport.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,14 @@ public TransportService createTransportService(Settings settings, ThreadPool thr
8787

8888
@Override
8989
public Releasable openConnection(DiscoveryNode node, ConnectionProfile profile, ActionListener<Connection> listener) {
90-
final Optional<DisruptableMockTransport> matchingTransport = getDisruptableMockTransport(node.getAddress());
91-
if (matchingTransport.isPresent()) {
90+
final Optional<DisruptableMockTransport> optionalMatchingTransport = getDisruptableMockTransport(node.getAddress());
91+
if (optionalMatchingTransport.isPresent()) {
92+
final DisruptableMockTransport matchingTransport = optionalMatchingTransport.get();
93+
final ConnectionStatus connectionStatus = getConnectionStatus(matchingTransport.getLocalNode());
94+
if (connectionStatus != ConnectionStatus.CONNECTED) {
95+
throw new ConnectTransportException(node, "node [" + node + "] is [" + connectionStatus + "] not [CONNECTED]");
96+
}
97+
9298
listener.onResponse(new CloseableConnection() {
9399
@Override
94100
public DiscoveryNode getNode() {
@@ -98,12 +104,12 @@ public DiscoveryNode getNode() {
98104
@Override
99105
public void sendRequest(long requestId, String action, TransportRequest request, TransportRequestOptions options)
100106
throws TransportException {
101-
onSendRequest(requestId, action, request, matchingTransport.get());
107+
onSendRequest(requestId, action, request, matchingTransport);
102108
}
103109
});
104110
return () -> {};
105111
} else {
106-
throw new ConnectTransportException(node, "node " + node + " does not exist");
112+
throw new ConnectTransportException(node, "node [" + node + "] does not exist");
107113
}
108114
}
109115

test/framework/src/test/java/org/elasticsearch/test/disruption/DisruptableMockTransportTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.test.ESTestCase;
3131
import org.elasticsearch.test.disruption.DisruptableMockTransport.ConnectionStatus;
3232
import org.elasticsearch.threadpool.ThreadPool;
33+
import org.elasticsearch.transport.ConnectTransportException;
3334
import org.elasticsearch.transport.TransportChannel;
3435
import org.elasticsearch.transport.TransportException;
3536
import org.elasticsearch.transport.TransportRequest;
@@ -53,6 +54,7 @@
5354

5455
import static org.elasticsearch.transport.TransportService.NOOP_TRANSPORT_INTERCEPTOR;
5556
import static org.hamcrest.Matchers.containsString;
57+
import static org.hamcrest.Matchers.endsWith;
5658

5759
public class DisruptableMockTransportTests extends ESTestCase {
5860

@@ -399,4 +401,27 @@ public void testUnavailableOnRequestOnlyReceivesExceptionalResponse() throws IOE
399401
deterministicTaskQueue.runAllRunnableTasks();
400402
assertTrue(responseHandlerCalled.get());
401403
}
404+
405+
public void testBrokenLinkFailsToConnect() {
406+
service1.disconnectFromNode(node2);
407+
408+
disconnectedLinks.add(Tuple.tuple(node1, node2));
409+
assertThat(expectThrows(ConnectTransportException.class, () -> service1.connectToNode(node2)).getMessage(),
410+
endsWith("is [DISCONNECTED] not [CONNECTED]"));
411+
disconnectedLinks.clear();
412+
413+
blackholedLinks.add(Tuple.tuple(node1, node2));
414+
assertThat(expectThrows(ConnectTransportException.class, () -> service1.connectToNode(node2)).getMessage(),
415+
endsWith("is [BLACK_HOLE] not [CONNECTED]"));
416+
blackholedLinks.clear();
417+
418+
blackholedRequestLinks.add(Tuple.tuple(node1, node2));
419+
assertThat(expectThrows(ConnectTransportException.class, () -> service1.connectToNode(node2)).getMessage(),
420+
endsWith("is [BLACK_HOLE_REQUESTS_ONLY] not [CONNECTED]"));
421+
blackholedRequestLinks.clear();
422+
423+
final DiscoveryNode node3 = new DiscoveryNode("node3", buildNewFakeTransportAddress(), Version.CURRENT);
424+
assertThat(expectThrows(ConnectTransportException.class, () -> service1.connectToNode(node3)).getMessage(),
425+
endsWith("does not exist"));
426+
}
402427
}

0 commit comments

Comments
 (0)