|
@@ -56,29 +56,32 @@ import static org.hamcrest.Matchers.containsString;
|
|
|
|
|
|
public class DisruptableMockTransportTests extends ESTestCase {
|
|
|
|
|
|
- DiscoveryNode node1;
|
|
|
- DiscoveryNode node2;
|
|
|
+ private DiscoveryNode node1;
|
|
|
+ private DiscoveryNode node2;
|
|
|
|
|
|
- DisruptableMockTransport transport1;
|
|
|
- DisruptableMockTransport transport2;
|
|
|
+ private TransportService service1;
|
|
|
+ private TransportService service2;
|
|
|
|
|
|
- TransportService service1;
|
|
|
- TransportService service2;
|
|
|
+ private DeterministicTaskQueue deterministicTaskQueue;
|
|
|
|
|
|
- DeterministicTaskQueue deterministicTaskQueue;
|
|
|
+ private Set<Tuple<DiscoveryNode, DiscoveryNode>> disconnectedLinks;
|
|
|
+ private Set<Tuple<DiscoveryNode, DiscoveryNode>> blackholedLinks;
|
|
|
+ private Set<Tuple<DiscoveryNode, DiscoveryNode>> blackholedRequestLinks;
|
|
|
|
|
|
- Set<Tuple<DiscoveryNode, DiscoveryNode>> disconnectedLinks;
|
|
|
- Set<Tuple<DiscoveryNode, DiscoveryNode>> blackholedLinks;
|
|
|
-
|
|
|
- ConnectionStatus getConnectionStatus(DiscoveryNode sender, DiscoveryNode destination) {
|
|
|
+ private ConnectionStatus getConnectionStatus(DiscoveryNode sender, DiscoveryNode destination) {
|
|
|
Tuple<DiscoveryNode, DiscoveryNode> link = Tuple.tuple(sender, destination);
|
|
|
if (disconnectedLinks.contains(link)) {
|
|
|
assert blackholedLinks.contains(link) == false;
|
|
|
+ assert blackholedRequestLinks.contains(link) == false;
|
|
|
return ConnectionStatus.DISCONNECTED;
|
|
|
}
|
|
|
if (blackholedLinks.contains(link)) {
|
|
|
+ assert blackholedRequestLinks.contains(link) == false;
|
|
|
return ConnectionStatus.BLACK_HOLE;
|
|
|
}
|
|
|
+ if (blackholedRequestLinks.contains(link)) {
|
|
|
+ return ConnectionStatus.BLACK_HOLE_REQUESTS_ONLY;
|
|
|
+ }
|
|
|
return ConnectionStatus.CONNECTED;
|
|
|
}
|
|
|
|
|
@@ -89,13 +92,14 @@ public class DisruptableMockTransportTests extends ESTestCase {
|
|
|
|
|
|
disconnectedLinks = new HashSet<>();
|
|
|
blackholedLinks = new HashSet<>();
|
|
|
+ blackholedRequestLinks = new HashSet<>();
|
|
|
|
|
|
List<DisruptableMockTransport> transports = new ArrayList<>();
|
|
|
|
|
|
deterministicTaskQueue = new DeterministicTaskQueue(
|
|
|
Settings.builder().put(Node.NODE_NAME_SETTING.getKey(), "dummy").build(), random());
|
|
|
|
|
|
- transport1 = new DisruptableMockTransport(node1, logger) {
|
|
|
+ final DisruptableMockTransport transport1 = new DisruptableMockTransport(node1, logger) {
|
|
|
@Override
|
|
|
protected ConnectionStatus getConnectionStatus(DiscoveryNode destination) {
|
|
|
return DisruptableMockTransportTests.this.getConnectionStatus(getLocalNode(), destination);
|
|
@@ -112,7 +116,7 @@ public class DisruptableMockTransportTests extends ESTestCase {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- transport2 = new DisruptableMockTransport(node2, logger) {
|
|
|
+ final DisruptableMockTransport transport2 = new DisruptableMockTransport(node2, logger) {
|
|
|
@Override
|
|
|
protected ConnectionStatus getConnectionStatus(DiscoveryNode destination) {
|
|
|
return DisruptableMockTransportTests.this.getConnectionStatus(getLocalNode(), destination);
|
|
@@ -144,7 +148,6 @@ public class DisruptableMockTransportTests extends ESTestCase {
|
|
|
service2.connectToNode(node1);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
private TransportRequestHandler<TransportRequest.Empty> requestHandlerShouldNotBeCalled() {
|
|
|
return (request, channel, task) -> {
|
|
|
throw new AssertionError("should not be called");
|
|
@@ -293,15 +296,21 @@ public class DisruptableMockTransportTests extends ESTestCase {
|
|
|
deterministicTaskQueue.runAllRunnableTasks();
|
|
|
}
|
|
|
|
|
|
+ public void testUnavailableOnRequestOnly() {
|
|
|
+ registerRequestHandler(service1, requestHandlerShouldNotBeCalled());
|
|
|
+ registerRequestHandler(service2, requestHandlerShouldNotBeCalled());
|
|
|
+ blackholedRequestLinks.add(Tuple.tuple(node1, node2));
|
|
|
+ send(service1, node2, responseHandlerShouldNotBeCalled());
|
|
|
+ deterministicTaskQueue.runAllRunnableTasks();
|
|
|
+ }
|
|
|
+
|
|
|
public void testDisconnectedOnSuccessfulResponse() throws IOException {
|
|
|
registerRequestHandler(service1, requestHandlerShouldNotBeCalled());
|
|
|
AtomicReference<TransportChannel> responseHandlerChannel = new AtomicReference<>();
|
|
|
registerRequestHandler(service2, requestHandlerCaptures(responseHandlerChannel::set));
|
|
|
|
|
|
- AtomicReference<TransportException> responseHandlerException = new AtomicReference<>();
|
|
|
send(service1, node2, responseHandlerShouldNotBeCalled());
|
|
|
deterministicTaskQueue.runAllRunnableTasks();
|
|
|
- assertNull(responseHandlerException.get());
|
|
|
assertNotNull(responseHandlerChannel.get());
|
|
|
|
|
|
disconnectedLinks.add(Tuple.tuple(node2, node1));
|
|
@@ -314,10 +323,8 @@ public class DisruptableMockTransportTests extends ESTestCase {
|
|
|
AtomicReference<TransportChannel> responseHandlerChannel = new AtomicReference<>();
|
|
|
registerRequestHandler(service2, requestHandlerCaptures(responseHandlerChannel::set));
|
|
|
|
|
|
- AtomicReference<TransportException> responseHandlerException = new AtomicReference<>();
|
|
|
send(service1, node2, responseHandlerShouldNotBeCalled());
|
|
|
deterministicTaskQueue.runAllRunnableTasks();
|
|
|
- assertNull(responseHandlerException.get());
|
|
|
assertNotNull(responseHandlerChannel.get());
|
|
|
|
|
|
disconnectedLinks.add(Tuple.tuple(node2, node1));
|
|
@@ -330,10 +337,8 @@ public class DisruptableMockTransportTests extends ESTestCase {
|
|
|
AtomicReference<TransportChannel> responseHandlerChannel = new AtomicReference<>();
|
|
|
registerRequestHandler(service2, requestHandlerCaptures(responseHandlerChannel::set));
|
|
|
|
|
|
- AtomicReference<TransportException> responseHandlerException = new AtomicReference<>();
|
|
|
send(service1, node2, responseHandlerShouldNotBeCalled());
|
|
|
deterministicTaskQueue.runAllRunnableTasks();
|
|
|
- assertNull(responseHandlerException.get());
|
|
|
assertNotNull(responseHandlerChannel.get());
|
|
|
|
|
|
blackholedLinks.add(Tuple.tuple(node2, node1));
|
|
@@ -346,10 +351,8 @@ public class DisruptableMockTransportTests extends ESTestCase {
|
|
|
AtomicReference<TransportChannel> responseHandlerChannel = new AtomicReference<>();
|
|
|
registerRequestHandler(service2, requestHandlerCaptures(responseHandlerChannel::set));
|
|
|
|
|
|
- AtomicReference<TransportException> responseHandlerException = new AtomicReference<>();
|
|
|
send(service1, node2, responseHandlerShouldNotBeCalled());
|
|
|
deterministicTaskQueue.runAllRunnableTasks();
|
|
|
- assertNull(responseHandlerException.get());
|
|
|
assertNotNull(responseHandlerChannel.get());
|
|
|
|
|
|
blackholedLinks.add(Tuple.tuple(node2, node1));
|
|
@@ -357,4 +360,43 @@ public class DisruptableMockTransportTests extends ESTestCase {
|
|
|
deterministicTaskQueue.runAllRunnableTasks();
|
|
|
}
|
|
|
|
|
|
+ public void testUnavailableOnRequestOnlyReceivesSuccessfulResponse() throws IOException {
|
|
|
+ registerRequestHandler(service1, requestHandlerShouldNotBeCalled());
|
|
|
+ AtomicReference<TransportChannel> responseHandlerChannel = new AtomicReference<>();
|
|
|
+ registerRequestHandler(service2, requestHandlerCaptures(responseHandlerChannel::set));
|
|
|
+
|
|
|
+ AtomicBoolean responseHandlerCalled = new AtomicBoolean();
|
|
|
+ send(service1, node2, responseHandlerShouldBeCalledNormally(() -> responseHandlerCalled.set(true)));
|
|
|
+
|
|
|
+ deterministicTaskQueue.runAllTasks();
|
|
|
+ assertNotNull(responseHandlerChannel.get());
|
|
|
+ assertFalse(responseHandlerCalled.get());
|
|
|
+
|
|
|
+ blackholedRequestLinks.add(Tuple.tuple(node1, node2));
|
|
|
+ blackholedRequestLinks.add(Tuple.tuple(node2, node1));
|
|
|
+ responseHandlerChannel.get().sendResponse(TransportResponse.Empty.INSTANCE);
|
|
|
+
|
|
|
+ deterministicTaskQueue.runAllRunnableTasks();
|
|
|
+ assertTrue(responseHandlerCalled.get());
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testUnavailableOnRequestOnlyReceivesExceptionalResponse() throws IOException {
|
|
|
+ registerRequestHandler(service1, requestHandlerShouldNotBeCalled());
|
|
|
+ AtomicReference<TransportChannel> responseHandlerChannel = new AtomicReference<>();
|
|
|
+ registerRequestHandler(service2, requestHandlerCaptures(responseHandlerChannel::set));
|
|
|
+
|
|
|
+ AtomicBoolean responseHandlerCalled = new AtomicBoolean();
|
|
|
+ send(service1, node2, responseHandlerShouldBeCalledExceptionally(e -> responseHandlerCalled.set(true)));
|
|
|
+
|
|
|
+ deterministicTaskQueue.runAllTasks();
|
|
|
+ assertNotNull(responseHandlerChannel.get());
|
|
|
+ assertFalse(responseHandlerCalled.get());
|
|
|
+
|
|
|
+ blackholedRequestLinks.add(Tuple.tuple(node1, node2));
|
|
|
+ blackholedRequestLinks.add(Tuple.tuple(node2, node1));
|
|
|
+ responseHandlerChannel.get().sendResponse(new Exception());
|
|
|
+
|
|
|
+ deterministicTaskQueue.runAllRunnableTasks();
|
|
|
+ assertTrue(responseHandlerCalled.get());
|
|
|
+ }
|
|
|
}
|