diff --git a/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java b/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java index 0630f2a4d..41c7244f6 100644 --- a/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java +++ b/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java @@ -55,6 +55,7 @@ public Host get(final HostHandle hostHandle, AccessType accessType) { @Override public void success() { lastSuccess = current; + iterations = 0; } @Override diff --git a/src/main/java/com/arangodb/internal/net/RandomHostHandler.java b/src/main/java/com/arangodb/internal/net/RandomHostHandler.java index f1359abd2..3faee8d52 100644 --- a/src/main/java/com/arangodb/internal/net/RandomHostHandler.java +++ b/src/main/java/com/arangodb/internal/net/RandomHostHandler.java @@ -30,27 +30,26 @@ public class RandomHostHandler implements HostHandler { private final HostResolver resolver; private final HostHandler fallback; - private Host origin; private Host current; public RandomHostHandler(final HostResolver resolver, final HostHandler fallback) { super(); this.resolver = resolver; this.fallback = fallback; - origin = current = getRandomHost(true, false); + current = getRandomHost(true, false); } @Override public Host get(final HostHandle hostHandle, AccessType accessType) { if (current == null) { - origin = current = getRandomHost(false, true); + current = getRandomHost(false, true); } return current; } @Override public void success() { - current = origin; + fallback.success(); } @Override @@ -60,7 +59,6 @@ public void fail() { } private Host getRandomHost(final boolean initial, final boolean closeConnections) { - final ArrayList hosts = new ArrayList<>(resolver.resolve(initial, closeConnections).getHostsList()); Collections.shuffle(hosts); return hosts.get(0); diff --git a/src/main/java/com/arangodb/internal/velocystream/VstCommunication.java b/src/main/java/com/arangodb/internal/velocystream/VstCommunication.java index 720ac6f02..44aab992b 100644 --- a/src/main/java/com/arangodb/internal/velocystream/VstCommunication.java +++ b/src/main/java/com/arangodb/internal/velocystream/VstCommunication.java @@ -83,6 +83,7 @@ protected synchronized C connect(final HostHandle hostHandle, final AccessType a } final C connection = (C) host.connection(); if (connection.isOpen()) { + hostHandler.success(); return connection; } else { try { diff --git a/src/test/java/com/arangodb/internal/HostHandlerTest.java b/src/test/java/com/arangodb/internal/HostHandlerTest.java index 06352d8c4..077634ed8 100644 --- a/src/test/java/com/arangodb/internal/HostHandlerTest.java +++ b/src/test/java/com/arangodb/internal/HostHandlerTest.java @@ -117,12 +117,18 @@ public void randomHostHandlerSingleHost() { @Test public void randomHostHandlerMultipeHosts() { final HostHandler handler = new RandomHostHandler(MULTIPLE_HOSTS, new FallbackHostHandler(MULTIPLE_HOSTS)); + final Host pick0 = handler.get(null, null); assertThat(pick0, anyOf(is(HOST_0), is(HOST_1), is(HOST_2))); handler.fail(); - assertThat(handler.get(null, null), anyOf(is(HOST_0), is(HOST_1), is(HOST_2))); + + final Host pick1 = handler.get(null, null); + assertThat(pick1, anyOf(is(HOST_0), is(HOST_1), is(HOST_2))); handler.success(); - assertThat(handler.get(null, null), is(pick0)); + + final Host pick3 = handler.get(null, null); + assertThat(pick3, anyOf(is(HOST_0), is(HOST_1), is(HOST_2))); + assertThat(pick3, is(pick1)); } @Test