diff --git a/core/src/main/java/com/arangodb/ArangoDB.java b/core/src/main/java/com/arangodb/ArangoDB.java index 47535af5d..57552df9f 100644 --- a/core/src/main/java/com/arangodb/ArangoDB.java +++ b/core/src/main/java/com/arangodb/ArangoDB.java @@ -22,6 +22,7 @@ import com.arangodb.entity.*; import com.arangodb.internal.ArangoDBImpl; +import com.arangodb.internal.ArangoExecutorSync; import com.arangodb.internal.InternalArangoDBBuilder; import com.arangodb.internal.net.*; import com.arangodb.model.*; @@ -363,10 +364,13 @@ public ArangoDB build() { HostHandler hostHandler = createHostHandler(hostResolver); hostHandler.setJwt(config.getJwt()); + CommunicationProtocol protocol = protocolProvider.createProtocol(config, hostHandler); + ArangoExecutorSync executor = new ArangoExecutorSync(protocol, config); + hostResolver.init(executor, config.getInternalSerde()); + return new ArangoDBImpl( config, - hostResolver, - protocolProvider, + protocol, hostHandler ); } diff --git a/core/src/main/java/com/arangodb/ArangoDBException.java b/core/src/main/java/com/arangodb/ArangoDBException.java index 9bc9a47fe..54fed3496 100644 --- a/core/src/main/java/com/arangodb/ArangoDBException.java +++ b/core/src/main/java/com/arangodb/ArangoDBException.java @@ -39,7 +39,7 @@ public ArangoDBException(final ErrorEntity errorEntity) { super(String.format("Response: %s, Error: %s - %s", errorEntity.getCode(), errorEntity.getErrorNum(), errorEntity.getErrorMessage())); this.entity = errorEntity; - this.responseCode = null; + this.responseCode = errorEntity.getCode(); this.requestId = null; } @@ -117,6 +117,9 @@ public static ArangoDBException of(Throwable t, Long requestId) { private static ArangoDBException of(String message, Throwable t, Long requestId) { Objects.requireNonNull(t); + if (t instanceof CompletionException) { + return of(message, t.getCause(), requestId); + } Throwable cause = unwrapCause(t); String msg = message != null ? message : t.getMessage() != null ? t.getMessage() @@ -141,7 +144,7 @@ private static ArangoDBException of(String message, Throwable t, Long requestId) } private static Throwable unwrapCause(Throwable t) { - if (t instanceof ArangoDBException || t instanceof CompletionException) { + if (t instanceof ArangoDBException) { return unwrapCause(t.getCause()); } return t; diff --git a/core/src/main/java/com/arangodb/internal/ArangoDBImpl.java b/core/src/main/java/com/arangodb/internal/ArangoDBImpl.java index ad3321c24..7554c9919 100644 --- a/core/src/main/java/com/arangodb/internal/ArangoDBImpl.java +++ b/core/src/main/java/com/arangodb/internal/ArangoDBImpl.java @@ -23,9 +23,8 @@ import com.arangodb.*; import com.arangodb.entity.*; import com.arangodb.internal.config.ArangoConfig; +import com.arangodb.internal.net.CommunicationProtocol; import com.arangodb.internal.net.HostHandler; -import com.arangodb.internal.net.HostResolver; -import com.arangodb.internal.net.ProtocolProvider; import com.arangodb.internal.serde.SerdeUtils; import com.arangodb.model.*; import org.slf4j.Logger; @@ -44,11 +43,10 @@ public class ArangoDBImpl extends InternalArangoDB implements ArangoDB { private final HostHandler hostHandler; public ArangoDBImpl(final ArangoConfig config, - final HostResolver hostResolver, final ProtocolProvider protocolProvider, + final CommunicationProtocol protocol, final HostHandler hostHandler) { - super(protocolProvider.createProtocol(config, hostHandler), config, config.getInternalSerde()); + super(protocol, config); this.hostHandler = hostHandler; - hostResolver.init(executorSync(), getSerde()); LOGGER.debug("ArangoDB Client is ready to use"); } diff --git a/core/src/main/java/com/arangodb/internal/ArangoExecuteable.java b/core/src/main/java/com/arangodb/internal/ArangoExecuteable.java index 31e68e043..db67992e2 100644 --- a/core/src/main/java/com/arangodb/internal/ArangoExecuteable.java +++ b/core/src/main/java/com/arangodb/internal/ArangoExecuteable.java @@ -37,10 +37,8 @@ public abstract class ArangoExecuteable implements ArangoSerdeAccessor { private final ArangoExecutorAsync executorAsync; private final InternalSerde serde; - protected ArangoExecuteable(final CommunicationProtocol protocol, - final ArangoConfig config, - final InternalSerde serde) { - this(new ArangoExecutorSync(protocol, config), new ArangoExecutorAsync(protocol, config), serde); + protected ArangoExecuteable(final CommunicationProtocol protocol, final ArangoConfig config) { + this(new ArangoExecutorSync(protocol, config), new ArangoExecutorAsync(protocol, config), config.getInternalSerde()); } protected ArangoExecuteable(final ArangoExecuteable other) { diff --git a/core/src/main/java/com/arangodb/internal/InternalArangoDB.java b/core/src/main/java/com/arangodb/internal/InternalArangoDB.java index 65725511c..a8159c1f7 100644 --- a/core/src/main/java/com/arangodb/internal/InternalArangoDB.java +++ b/core/src/main/java/com/arangodb/internal/InternalArangoDB.java @@ -50,8 +50,8 @@ public abstract class InternalArangoDB extends ArangoExecuteable { private static final String PATH_API_USER = "/_api/user"; private static final String PATH_API_QUERY_RULES = "/_api/query/rules"; - protected InternalArangoDB(final CommunicationProtocol protocol, final ArangoConfig config, final InternalSerde util) { - super(protocol, config, util); + protected InternalArangoDB(final CommunicationProtocol protocol, final ArangoConfig config) { + super(protocol, config); } protected InternalArangoDB(final ArangoExecuteable other) { diff --git a/core/src/main/java/com/arangodb/internal/InternalArangoDBBuilder.java b/core/src/main/java/com/arangodb/internal/InternalArangoDBBuilder.java index c406e78d9..13b73bb99 100644 --- a/core/src/main/java/com/arangodb/internal/InternalArangoDBBuilder.java +++ b/core/src/main/java/com/arangodb/internal/InternalArangoDBBuilder.java @@ -337,10 +337,9 @@ protected HostResolver createHostResolver(final Collection hosts, final Co LOG.debug("Use SimpleHostResolver"); return new SimpleHostResolver(new ArrayList<>(hosts)); } - } - protected Collection createHostList(final ConnectionFactory connectionFactory) { + protected Collection createHostList(final ConnectionFactory connectionFactory) { final Collection hostList = new ArrayList<>(); for (final HostDescription host : config.getHosts()) { hostList.add(HostUtils.createHost(host, config, connectionFactory)); diff --git a/core/src/main/java/com/arangodb/internal/net/DirtyReadHostHandler.java b/core/src/main/java/com/arangodb/internal/net/DirtyReadHostHandler.java index 2fded0c99..3826e6de5 100644 --- a/core/src/main/java/com/arangodb/internal/net/DirtyReadHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/DirtyReadHostHandler.java @@ -72,27 +72,12 @@ public void reset() { determineHostHandler().reset(); } - @Override - public void confirm() { - determineHostHandler().confirm(); - } - @Override public void close() throws IOException { master.close(); follower.close(); } - @Override - public void closeCurrentOnError() { - determineHostHandler().closeCurrentOnError(); - } - - @Override - public void closeCurrentOnErrorIfNotMatch(HostDescription host) { - determineHostHandler().closeCurrentOnErrorIfNotMatch(host); - } - @Override public void setJwt(String jwt) { master.setJwt(jwt); diff --git a/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java b/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java index cb62be184..5f778349e 100644 --- a/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java @@ -33,6 +33,10 @@ import org.slf4j.LoggerFactory; import java.util.*; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; import static com.arangodb.internal.serde.SerdeUtils.constructParametricType; @@ -48,10 +52,10 @@ public class ExtendedHostResolver implements HostResolver { private final ArangoConfig config; private final ConnectionFactory connectionFactory; private final Integer acquireHostListInterval; - private long lastUpdate; + private final ScheduledExecutorService scheduler; private ArangoExecutorSync executor; private InternalSerde arangoSerialization; - + private ScheduledFuture schedule; public ExtendedHostResolver(final List hosts, final ArangoConfig config, final ConnectionFactory connectionFactory, Integer acquireHostListInterval) { @@ -61,22 +65,34 @@ public ExtendedHostResolver(final List hosts, final ArangoConfig config, this.config = config; this.connectionFactory = connectionFactory; - lastUpdate = 0; + scheduler = Executors.newSingleThreadScheduledExecutor(r -> { + Thread t = Executors.defaultThreadFactory().newThread(r); + t.setDaemon(true); + return t; + } + ); } @Override public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) { this.executor = executor; this.arangoSerialization = arangoSerialization; + resolve(); + schedule = scheduler.scheduleAtFixedRate(this::resolve, acquireHostListInterval, acquireHostListInterval, TimeUnit.MILLISECONDS); } @Override - public HostSet resolve(boolean initial, boolean closeConnections) { - - if (!initial && isExpired()) { + public void close() { + schedule.cancel(false); + scheduler.shutdown(); + } - lastUpdate = System.currentTimeMillis(); + @Override + public HostSet getHosts() { + return hosts; + } + private void resolve() { final Collection endpoints = resolveFromServer(); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Resolve {} Endpoints", endpoints.size()); @@ -110,17 +126,11 @@ public HostSet resolve(boolean initial, boolean closeConnections) { } } hosts.clearAllMarkedForDeletion(); - } - - return hosts; } private Collection resolveFromServer() { - Collection response; - try { - response = executor.execute( new InternalRequest(ArangoRequestParam.SYSTEM, RequestType.GET, "/_api/cluster/endpoints"), response1 -> { @@ -136,7 +146,6 @@ private Collection resolveFromServer() { }, null); } catch (final ArangoDBException e) { final Integer responseCode = e.getResponseCode(); - // responseCode == 403: single server < 3.7 // responseCode == 501: single server >= 3.7 if (responseCode != null && (responseCode == 403 || responseCode == 501)) { @@ -145,12 +154,6 @@ private Collection resolveFromServer() { throw e; } } - return response; } - - private boolean isExpired() { - return System.currentTimeMillis() > (lastUpdate + acquireHostListInterval); - } - } diff --git a/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java b/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java index 162adaf86..f0eefcd61 100644 --- a/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java @@ -37,16 +37,14 @@ public class FallbackHostHandler implements HostHandler { private Host current; private Host lastSuccess; private int iterations; - private boolean firstOpened; private HostSet hosts; public FallbackHostHandler(final HostResolver resolver) { this.resolver = resolver; lastFailExceptions = new ArrayList<>(); reset(); - hosts = resolver.resolve(true, false); + hosts = resolver.getHosts(); current = lastSuccess = hosts.getHostsList().get(0); - firstOpened = true; } @Override @@ -69,7 +67,7 @@ public void success() { @Override public void fail(Exception exception) { - hosts = resolver.resolve(false, false); + hosts = resolver.getHosts(); final List hostList = hosts.getHostsList(); final int index = hostList.indexOf(current) + 1; final boolean inBound = index < hostList.size(); @@ -93,30 +91,10 @@ public void reset() { lastFailExceptions.clear(); } - @Override - public void confirm() { - if (firstOpened) { - // after first successful established connection, update host list - hosts = resolver.resolve(false, false); - firstOpened = false; - } - } - @Override public void close() { hosts.close(); - } - - @Override - public void closeCurrentOnError() { - current.closeOnError(); - } - - @Override - public synchronized void closeCurrentOnErrorIfNotMatch(HostDescription host) { - if (!host.equals(current.getDescription())) { - closeCurrentOnError(); - } + resolver.close(); } @Override diff --git a/core/src/main/java/com/arangodb/internal/net/HostHandler.java b/core/src/main/java/com/arangodb/internal/net/HostHandler.java index 911a219b0..6337007d6 100644 --- a/core/src/main/java/com/arangodb/internal/net/HostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/HostHandler.java @@ -39,14 +39,8 @@ public interface HostHandler { void reset(); - void confirm(); - void close() throws IOException; - void closeCurrentOnError(); - - void closeCurrentOnErrorIfNotMatch(HostDescription host); - void setJwt(String jwt); } diff --git a/core/src/main/java/com/arangodb/internal/net/HostResolver.java b/core/src/main/java/com/arangodb/internal/net/HostResolver.java index 744ee9e87..d9bd4784a 100644 --- a/core/src/main/java/com/arangodb/internal/net/HostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/HostResolver.java @@ -28,8 +28,12 @@ */ public interface HostResolver { - void init(ArangoExecutorSync executorSync, InternalSerde arangoSerialization); + default void init(ArangoExecutorSync executorSync, InternalSerde arangoSerialization) { + } - HostSet resolve(boolean initial, boolean closeConnections); + default void close() { + } + + HostSet getHosts(); } diff --git a/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java b/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java index 4fd00e3b8..031ed380d 100644 --- a/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java @@ -39,13 +39,15 @@ public RandomHostHandler(final HostResolver resolver, final HostHandler fallback super(); this.resolver = resolver; this.fallback = fallback; - current = getRandomHost(true, false); + hosts = resolver.getHosts(); + current = getRandomHost(); } @Override public Host get(final HostHandle hostHandle, AccessType accessType) { if (current == null) { - current = getRandomHost(false, true); + hosts = resolver.getHosts(); + current = getRandomHost(); } return current; } @@ -68,8 +70,7 @@ public synchronized void failIfNotMatch(HostDescription host, Exception exceptio } } - private Host getRandomHost(final boolean initial, final boolean closeConnections) { - hosts = resolver.resolve(initial, closeConnections); + private Host getRandomHost() { final ArrayList hostList = new ArrayList<>(hosts.getHostsList()); Collections.shuffle(hostList); return hostList.get(0); @@ -80,25 +81,10 @@ public void reset() { fallback.reset(); } - @Override - public void confirm() { - } - @Override public void close() { hosts.close(); - } - - @Override - public void closeCurrentOnError() { - current.closeOnError(); - } - - @Override - public synchronized void closeCurrentOnErrorIfNotMatch(HostDescription host) { - if (!host.equals(current.getDescription())) { - closeCurrentOnError(); - } + resolver.close(); } @Override diff --git a/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java b/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java index 23f5be99c..45a0069dd 100644 --- a/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java @@ -43,14 +43,14 @@ public RoundRobinHostHandler(final HostResolver resolver) { super(); this.resolver = resolver; lastFailExceptions = new ArrayList<>(); - hosts = resolver.resolve(true, false); + hosts = resolver.getHosts(); current = 0L; reset(); } @Override public Host get(final HostHandle hostHandle, AccessType accessType) { - hosts = resolver.resolve(false, false); + hosts = resolver.getHosts(); final int size = hosts.getHostsList().size(); if (fails > size) { @@ -101,23 +101,10 @@ public void reset() { lastFailExceptions.clear(); } - @Override - public void confirm() { - } - @Override public void close() { hosts.close(); - } - - @Override - public void closeCurrentOnError() { - currentHost.closeOnError(); - } - - @Override - public void closeCurrentOnErrorIfNotMatch(HostDescription host) { - closeCurrentOnError(); + resolver.close(); } @Override diff --git a/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java b/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java index 1d1d8f8f5..f7d594f48 100644 --- a/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java @@ -20,9 +20,6 @@ package com.arangodb.internal.net; -import com.arangodb.internal.ArangoExecutorSync; -import com.arangodb.internal.serde.InternalSerde; - import java.util.List; /** @@ -38,12 +35,7 @@ public SimpleHostResolver(final List hosts) { } @Override - public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) { - - } - - @Override - public HostSet resolve(final boolean initial, final boolean closeConnections) { + public HostSet getHosts() { return new HostSet(hosts); } diff --git a/driver/src/test/java/com/arangodb/ArangoDBAsyncTest.java b/driver/src/test/java/com/arangodb/ArangoDBAsyncTest.java index 039a5f254..162f00e3b 100644 --- a/driver/src/test/java/com/arangodb/ArangoDBAsyncTest.java +++ b/driver/src/test/java/com/arangodb/ArangoDBAsyncTest.java @@ -34,6 +34,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; import java.util.*; @@ -350,10 +351,13 @@ void updateUserDefaultCollectionAccess(ArangoDBAsync arangoDB) { arangoDB.grantDefaultCollectionAccess(username, Permissions.RW); } - @Test - void authenticationFailPassword() { + @ParameterizedTest + @EnumSource(Protocol.class) + void authenticationFailPassword(Protocol protocol) { final ArangoDBAsync arangoDB = new ArangoDB.Builder() .loadProperties(config) + .protocol(protocol) + .acquireHostList(false) .password("no").jwt(null) .build() .async(); @@ -362,11 +366,13 @@ void authenticationFailPassword() { assertThat(((ArangoDBException) thrown).getResponseCode()).isEqualTo(401); } - @ParameterizedTest(name = "{index}") - @MethodSource("asyncArangos") - void authenticationFailUser() { + @ParameterizedTest + @EnumSource(Protocol.class) + void authenticationFailUser(Protocol protocol) { final ArangoDBAsync arangoDB = new ArangoDB.Builder() .loadProperties(config) + .protocol(protocol) + .acquireHostList(false) .user("no").jwt(null) .build() .async(); diff --git a/driver/src/test/java/com/arangodb/ArangoDBTest.java b/driver/src/test/java/com/arangodb/ArangoDBTest.java index b02a351f4..c67271c7c 100644 --- a/driver/src/test/java/com/arangodb/ArangoDBTest.java +++ b/driver/src/test/java/com/arangodb/ArangoDBTest.java @@ -35,6 +35,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; import java.util.*; @@ -352,21 +353,26 @@ void updateUserDefaultCollectionAccess(ArangoDB arangoDB) { arangoDB.grantDefaultCollectionAccess(username, Permissions.RW); } - @Test - void authenticationFailPassword() { + @ParameterizedTest + @EnumSource(Protocol.class) + void authenticationFailPassword(Protocol protocol) { final ArangoDB arangoDB = new ArangoDB.Builder() .loadProperties(config) + .protocol(protocol) + .acquireHostList(false) .password("no").jwt(null).build(); Throwable thrown = catchThrowable(arangoDB::getVersion); assertThat(thrown).isInstanceOf(ArangoDBException.class); assertThat(((ArangoDBException) thrown).getResponseCode()).isEqualTo(401); } - @ParameterizedTest(name = "{index}") - @MethodSource("arangos") - void authenticationFailUser() { + @ParameterizedTest + @EnumSource(Protocol.class) + void authenticationFailUser(Protocol protocol) { final ArangoDB arangoDB = new ArangoDB.Builder() .loadProperties(config) + .protocol(protocol) + .acquireHostList(false) .user("no").jwt(null).build(); Throwable thrown = catchThrowable(arangoDB::getVersion); assertThat(thrown).isInstanceOf(ArangoDBException.class); diff --git a/driver/src/test/java/com/arangodb/JwtAuthAsyncTest.java b/driver/src/test/java/com/arangodb/JwtAuthAsyncTest.java index cbeb68c9f..bff18088b 100644 --- a/driver/src/test/java/com/arangodb/JwtAuthAsyncTest.java +++ b/driver/src/test/java/com/arangodb/JwtAuthAsyncTest.java @@ -50,7 +50,7 @@ private static String getJwt(ArangoDB arangoDB) { @ParameterizedTest @EnumSource(Protocol.class) void notAuthenticated(Protocol protocol) { - ArangoDBAsync arangoDB = getBuilder(protocol).build().async(); + ArangoDBAsync arangoDB = getBuilder(protocol).acquireHostList(false).build().async(); Throwable thrown = catchThrowable(() -> arangoDB.getVersion().get()).getCause(); assertThat(thrown).isInstanceOf(ArangoDBException.class); ArangoDBException e = (ArangoDBException) thrown; diff --git a/driver/src/test/java/com/arangodb/JwtAuthTest.java b/driver/src/test/java/com/arangodb/JwtAuthTest.java index 2e4bedddc..137488d88 100644 --- a/driver/src/test/java/com/arangodb/JwtAuthTest.java +++ b/driver/src/test/java/com/arangodb/JwtAuthTest.java @@ -49,7 +49,7 @@ private static String getJwt(ArangoDB arangoDB) { @ParameterizedTest @EnumSource(Protocol.class) void notAuthenticated(Protocol protocol) { - ArangoDB arangoDB = getBuilder(protocol).build(); + ArangoDB arangoDB = getBuilder(protocol).acquireHostList(false).build(); Throwable thrown = catchThrowable(arangoDB::getVersion); assertThat(thrown).isInstanceOf(ArangoDBException.class); ArangoDBException e = (ArangoDBException) thrown; diff --git a/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java b/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java index 3803a3c4e..706d05e58 100644 --- a/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java +++ b/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java @@ -24,7 +24,6 @@ import com.arangodb.ArangoDBMultipleException; import com.arangodb.config.HostDescription; import com.arangodb.internal.net.*; -import com.arangodb.internal.serde.InternalSerde; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -61,41 +60,19 @@ public void close() { }; private static final Host HOST_0 = new HostImpl(mockCP, new HostDescription("127.0.0.1", 8529)); - private static final HostResolver SINGLE_HOST = new HostResolver() { - - @Override - public HostSet resolve(final boolean initial, final boolean closeConnections) { - - HostSet set = new HostSet(Collections.emptyList()); - set.addHost(HOST_0); - return set; - } - - @Override - public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) { - - } - + private static final HostResolver SINGLE_HOST = () -> { + HostSet set = new HostSet(Collections.emptyList()); + set.addHost(HOST_0); + return set; }; private static final Host HOST_1 = new HostImpl(mockCP, new HostDescription("127.0.0.2", 8529)); private static final Host HOST_2 = new HostImpl(mockCP, new HostDescription("127.0.0.3", 8529)); - private static final HostResolver MULTIPLE_HOSTS = new HostResolver() { - - @Override - public HostSet resolve(final boolean initial, final boolean closeConnections) { - - HostSet set = new HostSet(Collections.emptyList()); - set.addHost(HOST_0); - set.addHost(HOST_1); - set.addHost(HOST_2); - return set; - } - - @Override - public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) { - - } - + private static final HostResolver MULTIPLE_HOSTS = () -> { + HostSet set = new HostSet(Collections.emptyList()); + set.addHost(HOST_0); + set.addHost(HOST_1); + set.addHost(HOST_2); + return set; }; @Test diff --git a/driver/src/test/resources/arangodb-with-prefix.properties b/driver/src/test/resources/arangodb-with-prefix.properties index 79ce26e82..36fb2d0a5 100644 --- a/driver/src/test/resources/arangodb-with-prefix.properties +++ b/driver/src/test/resources/arangodb-with-prefix.properties @@ -1,3 +1,3 @@ adb.hosts=172.28.0.1:8529 -adb.acquireHostList=false +adb.acquireHostList=true adb.password=test diff --git a/driver/src/test/resources/arangodb.properties b/driver/src/test/resources/arangodb.properties index 9941cd11a..fa580e439 100644 --- a/driver/src/test/resources/arangodb.properties +++ b/driver/src/test/resources/arangodb.properties @@ -1,5 +1,5 @@ -arangodb.hosts=172.28.0.1:8529,172.28.0.1:8539,172.28.0.1:8549 -arangodb.acquireHostList=false +arangodb.hosts=172.28.0.1:8529 +arangodb.acquireHostList=true arangodb.password=test arangodb.timeout=30000 arangodb.responseQueueTimeSamples=20 diff --git a/http/src/main/java/com/arangodb/http/HttpCommunication.java b/http/src/main/java/com/arangodb/http/HttpCommunication.java index c929d08c4..b2752cea9 100644 --- a/http/src/main/java/com/arangodb/http/HttpCommunication.java +++ b/http/src/main/java/com/arangodb/http/HttpCommunication.java @@ -117,7 +117,6 @@ private CompletableFuture executeAsync(final InternalRequest r rfuture.completeExceptionally(errorEntityEx); } else { hostHandler.success(); - hostHandler.confirm(); rfuture.complete(response); } } diff --git a/vst/src/main/java/com/arangodb/vst/VstCommunication.java b/vst/src/main/java/com/arangodb/vst/VstCommunication.java index 847da7107..03f3aaa53 100644 --- a/vst/src/main/java/com/arangodb/vst/VstCommunication.java +++ b/vst/src/main/java/com/arangodb/vst/VstCommunication.java @@ -92,7 +92,6 @@ protected synchronized C connect(final HostHandle hostHandle, final AccessType a if (jwt != null || user != null) { tryAuthenticate(connection); } - hostHandler.confirm(); if (!connection.isOpen()) { // see https://github.com/arangodb/arangodb-java-driver/issues/384 hostHandler.fail(new IOException("The connection is closed.")); diff --git a/vst/src/main/java/com/arangodb/vst/VstProtocol.java b/vst/src/main/java/com/arangodb/vst/VstProtocol.java index 750308b5d..bad1a5b0e 100644 --- a/vst/src/main/java/com/arangodb/vst/VstProtocol.java +++ b/vst/src/main/java/com/arangodb/vst/VstProtocol.java @@ -27,6 +27,8 @@ import java.io.IOException; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * @author Mark Vollmary @@ -34,6 +36,7 @@ public class VstProtocol implements CommunicationProtocol { private final VstCommunicationAsync communication; + private final ExecutorService outgoingExecutor = Executors.newCachedThreadPool(); public VstProtocol(final VstCommunicationAsync communication) { super(); @@ -42,7 +45,8 @@ public VstProtocol(final VstCommunicationAsync communication) { @Override public CompletableFuture executeAsync(InternalRequest request, HostHandle hostHandle) { - return communication.execute(request, hostHandle); + return CompletableFuture.completedFuture(null) + .thenComposeAsync(__ -> communication.execute(request, hostHandle), outgoingExecutor); } @Override @@ -53,6 +57,7 @@ public void setJwt(String jwt) { @Override public void close() throws IOException { communication.close(); + outgoingExecutor.shutdown(); } }