From 0dfd01be3db7412707fa397a8359b051b006091f Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 24 Oct 2023 12:20:12 +0200 Subject: [PATCH 1/8] HostResolver refactoring --- .../com/arangodb/internal/net/ExtendedHostResolver.java | 2 +- .../com/arangodb/internal/net/FallbackHostHandler.java | 6 +++--- .../main/java/com/arangodb/internal/net/HostResolver.java | 2 +- .../java/com/arangodb/internal/net/RandomHostHandler.java | 8 ++++---- .../com/arangodb/internal/net/RoundRobinHostHandler.java | 4 ++-- .../com/arangodb/internal/net/SimpleHostResolver.java | 2 +- .../test/java/com/arangodb/internal/HostHandlerTest.java | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) 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..16493622c 100644 --- a/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java @@ -71,7 +71,7 @@ public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) } @Override - public HostSet resolve(boolean initial, boolean closeConnections) { + public HostSet resolve(boolean initial) { if (!initial && isExpired()) { 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..befeed908 100644 --- a/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java @@ -44,7 +44,7 @@ public FallbackHostHandler(final HostResolver resolver) { this.resolver = resolver; lastFailExceptions = new ArrayList<>(); reset(); - hosts = resolver.resolve(true, false); + hosts = resolver.resolve(true); current = lastSuccess = hosts.getHostsList().get(0); firstOpened = true; } @@ -69,7 +69,7 @@ public void success() { @Override public void fail(Exception exception) { - hosts = resolver.resolve(false, false); + hosts = resolver.resolve(false); final List hostList = hosts.getHostsList(); final int index = hostList.indexOf(current) + 1; final boolean inBound = index < hostList.size(); @@ -97,7 +97,7 @@ public void reset() { public void confirm() { if (firstOpened) { // after first successful established connection, update host list - hosts = resolver.resolve(false, false); + hosts = resolver.resolve(false); firstOpened = false; } } 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..bc0705eb6 100644 --- a/core/src/main/java/com/arangodb/internal/net/HostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/HostResolver.java @@ -30,6 +30,6 @@ public interface HostResolver { void init(ArangoExecutorSync executorSync, InternalSerde arangoSerialization); - HostSet resolve(boolean initial, boolean closeConnections); + HostSet resolve(boolean initial); } 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..330f896fd 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,13 @@ public RandomHostHandler(final HostResolver resolver, final HostHandler fallback super(); this.resolver = resolver; this.fallback = fallback; - current = getRandomHost(true, false); + current = getRandomHost(true); } @Override public Host get(final HostHandle hostHandle, AccessType accessType) { if (current == null) { - current = getRandomHost(false, true); + current = getRandomHost(false); } return current; } @@ -68,8 +68,8 @@ 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 boolean initial) { + hosts = resolver.resolve(initial); final ArrayList hostList = new ArrayList<>(hosts.getHostsList()); Collections.shuffle(hostList); return hostList.get(0); 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..3b4c4c622 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.resolve(true); current = 0L; reset(); } @Override public Host get(final HostHandle hostHandle, AccessType accessType) { - hosts = resolver.resolve(false, false); + hosts = resolver.resolve(false); final int size = hosts.getHostsList().size(); if (fails > size) { 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..d1d6d2935 100644 --- a/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java @@ -43,7 +43,7 @@ public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) } @Override - public HostSet resolve(final boolean initial, final boolean closeConnections) { + public HostSet resolve(final boolean initial) { return new HostSet(hosts); } diff --git a/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java b/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java index 3803a3c4e..b84ce5057 100644 --- a/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java +++ b/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java @@ -64,7 +64,7 @@ public void close() { private static final HostResolver SINGLE_HOST = new HostResolver() { @Override - public HostSet resolve(final boolean initial, final boolean closeConnections) { + public HostSet resolve(final boolean initial) { HostSet set = new HostSet(Collections.emptyList()); set.addHost(HOST_0); @@ -82,7 +82,7 @@ public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) private static final HostResolver MULTIPLE_HOSTS = new HostResolver() { @Override - public HostSet resolve(final boolean initial, final boolean closeConnections) { + public HostSet resolve(final boolean initial) { HostSet set = new HostSet(Collections.emptyList()); set.addHost(HOST_0); From 7686f0d895431457a7ebb7cca2698d62b72fdb50 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 24 Oct 2023 13:16:52 +0200 Subject: [PATCH 2/8] HostResolver refactoring --- core/src/main/java/com/arangodb/ArangoDB.java | 8 ++++++-- .../src/main/java/com/arangodb/internal/ArangoDBImpl.java | 8 +++----- .../java/com/arangodb/internal/ArangoExecuteable.java | 6 ++---- .../main/java/com/arangodb/internal/InternalArangoDB.java | 4 ++-- .../com/arangodb/internal/InternalArangoDBBuilder.java | 3 +-- 5 files changed, 14 insertions(+), 15 deletions(-) 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/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)); From 51c30b0705f68fd9a67ef3b50c470bef5c89d7d7 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 24 Oct 2023 13:33:25 +0200 Subject: [PATCH 3/8] HostResolver refactoring --- .../internal/net/ExtendedHostResolver.java | 9 ++++++-- .../internal/net/FallbackHostHandler.java | 6 ++--- .../arangodb/internal/net/HostResolver.java | 4 +++- .../internal/net/RandomHostHandler.java | 9 ++++---- .../internal/net/RoundRobinHostHandler.java | 4 ++-- .../internal/net/SimpleHostResolver.java | 7 +++++- .../arangodb/internal/HostHandlerTest.java | 22 +++++++++++++++---- 7 files changed, 44 insertions(+), 17 deletions(-) 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 16493622c..27f97c36e 100644 --- a/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java @@ -71,9 +71,14 @@ public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) } @Override - public HostSet resolve(boolean initial) { + public HostSet getHosts() { + return hosts; + } + + @Override + public HostSet resolve() { - if (!initial && isExpired()) { + if (isExpired()) { lastUpdate = System.currentTimeMillis(); 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 befeed908..124c823a6 100644 --- a/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java @@ -44,7 +44,7 @@ public FallbackHostHandler(final HostResolver resolver) { this.resolver = resolver; lastFailExceptions = new ArrayList<>(); reset(); - hosts = resolver.resolve(true); + hosts = resolver.getHosts(); current = lastSuccess = hosts.getHostsList().get(0); firstOpened = true; } @@ -69,7 +69,7 @@ public void success() { @Override public void fail(Exception exception) { - hosts = resolver.resolve(false); + hosts = resolver.resolve(); final List hostList = hosts.getHostsList(); final int index = hostList.indexOf(current) + 1; final boolean inBound = index < hostList.size(); @@ -97,7 +97,7 @@ public void reset() { public void confirm() { if (firstOpened) { // after first successful established connection, update host list - hosts = resolver.resolve(false); + hosts = resolver.resolve(); firstOpened = false; } } 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 bc0705eb6..1b4826164 100644 --- a/core/src/main/java/com/arangodb/internal/net/HostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/HostResolver.java @@ -30,6 +30,8 @@ public interface HostResolver { void init(ArangoExecutorSync executorSync, InternalSerde arangoSerialization); - HostSet resolve(boolean initial); + HostSet getHosts(); + + HostSet resolve(); } 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 330f896fd..edfa01aca 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); + hosts = resolver.getHosts(); + current = getRandomHost(); } @Override public Host get(final HostHandle hostHandle, AccessType accessType) { if (current == null) { - current = getRandomHost(false); + hosts = resolver.resolve(); + current = getRandomHost(); } return current; } @@ -68,8 +70,7 @@ public synchronized void failIfNotMatch(HostDescription host, Exception exceptio } } - private Host getRandomHost(final boolean initial) { - hosts = resolver.resolve(initial); + private Host getRandomHost() { final ArrayList hostList = new ArrayList<>(hosts.getHostsList()); Collections.shuffle(hostList); return hostList.get(0); 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 3b4c4c622..545275a97 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); + hosts = resolver.getHosts(); current = 0L; reset(); } @Override public Host get(final HostHandle hostHandle, AccessType accessType) { - hosts = resolver.resolve(false); + hosts = resolver.resolve(); final int size = hosts.getHostsList().size(); if (fails > size) { 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 d1d6d2935..876208626 100644 --- a/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java @@ -43,7 +43,12 @@ public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) } @Override - public HostSet resolve(final boolean initial) { + public HostSet getHosts() { + return new HostSet(hosts); + } + + @Override + public HostSet resolve() { return new HostSet(hosts); } diff --git a/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java b/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java index b84ce5057..4c3f8b98d 100644 --- a/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java +++ b/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java @@ -64,8 +64,7 @@ public void close() { private static final HostResolver SINGLE_HOST = new HostResolver() { @Override - public HostSet resolve(final boolean initial) { - + public HostSet resolve() { HostSet set = new HostSet(Collections.emptyList()); set.addHost(HOST_0); return set; @@ -76,14 +75,20 @@ public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) } + @Override + public HostSet getHosts() { + 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) { - + public HostSet resolve() { HostSet set = new HostSet(Collections.emptyList()); set.addHost(HOST_0); set.addHost(HOST_1); @@ -96,6 +101,15 @@ public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) } + @Override + public HostSet getHosts() { + HostSet set = new HostSet(Collections.emptyList()); + set.addHost(HOST_0); + set.addHost(HOST_1); + set.addHost(HOST_2); + return set; + } + }; @Test From 82a6ea570a795db9737a0e9bf10ec5bf398102d7 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 24 Oct 2023 13:47:56 +0200 Subject: [PATCH 4/8] HostResolver refactoring --- .../internal/net/DirtyReadHostHandler.java | 5 ----- .../internal/net/ExtendedHostResolver.java | 5 +++-- .../internal/net/FallbackHostHandler.java | 13 +------------ .../com/arangodb/internal/net/HostHandler.java | 2 -- .../com/arangodb/internal/net/HostResolver.java | 2 -- .../arangodb/internal/net/RandomHostHandler.java | 6 +----- .../internal/net/RoundRobinHostHandler.java | 6 +----- .../internal/net/SimpleHostResolver.java | 5 ----- .../com/arangodb/internal/HostHandlerTest.java | 16 ---------------- .../com/arangodb/http/HttpCommunication.java | 1 - .../java/com/arangodb/vst/VstCommunication.java | 1 - 11 files changed, 6 insertions(+), 56 deletions(-) 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..fca30cdde 100644 --- a/core/src/main/java/com/arangodb/internal/net/DirtyReadHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/DirtyReadHostHandler.java @@ -72,11 +72,6 @@ public void reset() { determineHostHandler().reset(); } - @Override - public void confirm() { - determineHostHandler().confirm(); - } - @Override public void close() throws IOException { master.close(); 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 27f97c36e..0dbb1828f 100644 --- a/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java @@ -68,6 +68,7 @@ public ExtendedHostResolver(final List hosts, final ArangoConfig config, public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) { this.executor = executor; this.arangoSerialization = arangoSerialization; + resolve(); } @Override @@ -75,8 +76,8 @@ public HostSet getHosts() { return hosts; } - @Override - public HostSet resolve() { + // TODO: invoke at scheduled intervals + private HostSet resolve() { if (isExpired()) { 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 124c823a6..35e1747d7 100644 --- a/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java @@ -37,7 +37,6 @@ 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) { @@ -46,7 +45,6 @@ public FallbackHostHandler(final HostResolver resolver) { reset(); 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(); + hosts = resolver.getHosts(); final List hostList = hosts.getHostsList(); final int index = hostList.indexOf(current) + 1; final boolean inBound = index < hostList.size(); @@ -93,15 +91,6 @@ public void reset() { lastFailExceptions.clear(); } - @Override - public void confirm() { - if (firstOpened) { - // after first successful established connection, update host list - hosts = resolver.resolve(); - firstOpened = false; - } - } - @Override public void close() { hosts.close(); 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..f8abdcd2e 100644 --- a/core/src/main/java/com/arangodb/internal/net/HostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/HostHandler.java @@ -39,8 +39,6 @@ public interface HostHandler { void reset(); - void confirm(); - void close() throws IOException; void closeCurrentOnError(); 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 1b4826164..c6ac90524 100644 --- a/core/src/main/java/com/arangodb/internal/net/HostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/HostResolver.java @@ -32,6 +32,4 @@ public interface HostResolver { HostSet getHosts(); - HostSet resolve(); - } 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 edfa01aca..45cc634c9 100644 --- a/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java @@ -46,7 +46,7 @@ public RandomHostHandler(final HostResolver resolver, final HostHandler fallback @Override public Host get(final HostHandle hostHandle, AccessType accessType) { if (current == null) { - hosts = resolver.resolve(); + hosts = resolver.getHosts(); current = getRandomHost(); } return current; @@ -81,10 +81,6 @@ public void reset() { fallback.reset(); } - @Override - public void confirm() { - } - @Override public void close() { hosts.close(); 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 545275a97..ca8306aa7 100644 --- a/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java @@ -50,7 +50,7 @@ public RoundRobinHostHandler(final HostResolver resolver) { @Override public Host get(final HostHandle hostHandle, AccessType accessType) { - hosts = resolver.resolve(); + hosts = resolver.getHosts(); final int size = hosts.getHostsList().size(); if (fails > size) { @@ -101,10 +101,6 @@ public void reset() { lastFailExceptions.clear(); } - @Override - public void confirm() { - } - @Override public void close() { hosts.close(); 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 876208626..db49e71e2 100644 --- a/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java +++ b/core/src/main/java/com/arangodb/internal/net/SimpleHostResolver.java @@ -47,9 +47,4 @@ public HostSet getHosts() { return new HostSet(hosts); } - @Override - public HostSet resolve() { - return new HostSet(hosts); - } - } diff --git a/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java b/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java index 4c3f8b98d..b38aa3877 100644 --- a/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java +++ b/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java @@ -63,13 +63,6 @@ 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() { - HostSet set = new HostSet(Collections.emptyList()); - set.addHost(HOST_0); - return set; - } - @Override public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) { @@ -87,15 +80,6 @@ public HostSet getHosts() { 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() { - 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) { 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.")); From d3d1b53ed49033573271bf76b24cf85bfe829f07 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 24 Oct 2023 14:28:47 +0200 Subject: [PATCH 5/8] HostResolver refactoring --- .../internal/net/ExtendedHostResolver.java | 43 +++++++++---------- .../internal/net/FallbackHostHandler.java | 1 + .../arangodb/internal/net/HostHandler.java | 2 + .../arangodb/internal/net/HostResolver.java | 6 ++- .../internal/net/RandomHostHandler.java | 1 + .../internal/net/RoundRobinHostHandler.java | 1 + .../internal/net/SimpleHostResolver.java | 8 ---- .../arangodb/internal/HostHandlerTest.java | 41 +++++------------- 8 files changed, 40 insertions(+), 63 deletions(-) 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 0dbb1828f..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,7 +65,12 @@ 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 @@ -69,6 +78,13 @@ 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 void close() { + schedule.cancel(false); + scheduler.shutdown(); } @Override @@ -76,13 +92,7 @@ public HostSet getHosts() { return hosts; } - // TODO: invoke at scheduled intervals - private HostSet resolve() { - - if (isExpired()) { - - lastUpdate = System.currentTimeMillis(); - + private void resolve() { final Collection endpoints = resolveFromServer(); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Resolve {} Endpoints", endpoints.size()); @@ -116,17 +126,11 @@ private HostSet resolve() { } } hosts.clearAllMarkedForDeletion(); - } - - return hosts; } private Collection resolveFromServer() { - Collection response; - try { - response = executor.execute( new InternalRequest(ArangoRequestParam.SYSTEM, RequestType.GET, "/_api/cluster/endpoints"), response1 -> { @@ -142,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)) { @@ -151,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 35e1747d7..0d5a1de3e 100644 --- a/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java @@ -94,6 +94,7 @@ public void reset() { @Override public void close() { hosts.close(); + 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 f8abdcd2e..c6ae90307 100644 --- a/core/src/main/java/com/arangodb/internal/net/HostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/HostHandler.java @@ -41,8 +41,10 @@ public interface HostHandler { void close() throws IOException; + // TODO: check if used void closeCurrentOnError(); + // TODO: check if used 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 c6ac90524..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,7 +28,11 @@ */ public interface HostResolver { - void init(ArangoExecutorSync executorSync, InternalSerde arangoSerialization); + default void init(ArangoExecutorSync executorSync, InternalSerde arangoSerialization) { + } + + 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 45cc634c9..73a059853 100644 --- a/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java @@ -84,6 +84,7 @@ public void reset() { @Override public void close() { hosts.close(); + 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 ca8306aa7..3a020d687 100644 --- a/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java @@ -104,6 +104,7 @@ public void reset() { @Override public void close() { hosts.close(); + 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 db49e71e2..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; /** @@ -37,11 +34,6 @@ public SimpleHostResolver(final List hosts) { this.hosts = hosts; } - @Override - public void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) { - - } - @Override public HostSet getHosts() { return new HostSet(hosts); diff --git a/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java b/driver/src/test/java/com/arangodb/internal/HostHandlerTest.java index b38aa3877..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,39 +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 void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) { - - } - - @Override - public HostSet getHosts() { - HostSet set = new HostSet(Collections.emptyList()); - set.addHost(HOST_0); - return set; - } - + 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 void init(ArangoExecutorSync executor, InternalSerde arangoSerialization) { - - } - - @Override - public HostSet getHosts() { - HostSet set = new HostSet(Collections.emptyList()); - set.addHost(HOST_0); - set.addHost(HOST_1); - set.addHost(HOST_2); - return set; - } - + 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 From eb0d444ed10e94d5780ca9e4f60673b8f1504e94 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 24 Oct 2023 14:34:14 +0200 Subject: [PATCH 6/8] HostResolver refactoring --- .../arangodb/internal/net/DirtyReadHostHandler.java | 10 ---------- .../arangodb/internal/net/FallbackHostHandler.java | 12 ------------ .../java/com/arangodb/internal/net/HostHandler.java | 6 ------ .../com/arangodb/internal/net/RandomHostHandler.java | 12 ------------ .../arangodb/internal/net/RoundRobinHostHandler.java | 10 ---------- 5 files changed, 50 deletions(-) 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 fca30cdde..3826e6de5 100644 --- a/core/src/main/java/com/arangodb/internal/net/DirtyReadHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/DirtyReadHostHandler.java @@ -78,16 +78,6 @@ public void close() throws IOException { 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/FallbackHostHandler.java b/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java index 0d5a1de3e..f0eefcd61 100644 --- a/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/FallbackHostHandler.java @@ -97,18 +97,6 @@ public void close() { resolver.close(); } - @Override - public void closeCurrentOnError() { - current.closeOnError(); - } - - @Override - public synchronized void closeCurrentOnErrorIfNotMatch(HostDescription host) { - if (!host.equals(current.getDescription())) { - closeCurrentOnError(); - } - } - @Override public void setJwt(String jwt) { hosts.setJwt(jwt); 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 c6ae90307..6337007d6 100644 --- a/core/src/main/java/com/arangodb/internal/net/HostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/HostHandler.java @@ -41,12 +41,6 @@ public interface HostHandler { void close() throws IOException; - // TODO: check if used - void closeCurrentOnError(); - - // TODO: check if used - void closeCurrentOnErrorIfNotMatch(HostDescription host); - void setJwt(String jwt); } 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 73a059853..031ed380d 100644 --- a/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/RandomHostHandler.java @@ -87,18 +87,6 @@ public void close() { resolver.close(); } - @Override - public void closeCurrentOnError() { - current.closeOnError(); - } - - @Override - public synchronized void closeCurrentOnErrorIfNotMatch(HostDescription host) { - if (!host.equals(current.getDescription())) { - closeCurrentOnError(); - } - } - @Override public void setJwt(String jwt) { fallback.setJwt(jwt); 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 3a020d687..45a0069dd 100644 --- a/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java +++ b/core/src/main/java/com/arangodb/internal/net/RoundRobinHostHandler.java @@ -107,16 +107,6 @@ public void close() { resolver.close(); } - @Override - public void closeCurrentOnError() { - currentHost.closeOnError(); - } - - @Override - public void closeCurrentOnErrorIfNotMatch(HostDescription host) { - closeCurrentOnError(); - } - @Override public void setJwt(String jwt) { hosts.setJwt(jwt); From 14d7c85d68a060e86ece79e10dfd19b55871ea9f Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 24 Oct 2023 14:50:00 +0200 Subject: [PATCH 7/8] reverted acquireHostList=true in tests --- .../java/com/arangodb/ArangoDBAsyncTest.java | 16 +++++++++++----- .../src/test/java/com/arangodb/ArangoDBTest.java | 16 +++++++++++----- .../test/java/com/arangodb/JwtAuthAsyncTest.java | 2 +- .../src/test/java/com/arangodb/JwtAuthTest.java | 2 +- .../resources/arangodb-with-prefix.properties | 2 +- driver/src/test/resources/arangodb.properties | 4 ++-- 6 files changed, 27 insertions(+), 15 deletions(-) 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/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 From cf4dee41ea2ce9111a67599a51a8f55fc2697e42 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 24 Oct 2023 15:31:20 +0200 Subject: [PATCH 8/8] VST outgoing executor (DE-696) --- core/src/main/java/com/arangodb/ArangoDBException.java | 7 +++++-- vst/src/main/java/com/arangodb/vst/VstProtocol.java | 7 ++++++- 2 files changed, 11 insertions(+), 3 deletions(-) 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/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(); } }