Skip to content

Commit 1776b54

Browse files
committed
refactor extendedhostresolver
1 parent b0ccec4 commit 1776b54

File tree

7 files changed

+105
-82
lines changed

7 files changed

+105
-82
lines changed

src/main/java/com/arangodb/ArangoDB.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,7 @@ public synchronized ArangoDB build() {
616616
final Collection<Host> hostList = createHostList(max, connectionFactory);
617617
final HostResolver hostResolver = createHostResolver(hostList, max, connectionFactory);
618618
final HostHandler hostHandler = createHostHandler(hostResolver);
619+
619620
return new ArangoDBImpl(
620621
new VstCommunicationSync.Builder(hostHandler).timeout(timeout).user(user).password(password)
621622
.useSsl(useSsl).sslContext(sslContext).chunksize(chunksize).maxConnections(maxConnections)

src/main/java/com/arangodb/internal/ArangoDBImpl.java

Lines changed: 17 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@
2121
package com.arangodb.internal;
2222

2323
import java.io.IOException;
24-
import java.util.ArrayList;
2524
import java.util.Collection;
26-
import java.util.Collections;
27-
import java.util.Map;
2825

2926
import com.arangodb.ArangoDB;
3027
import com.arangodb.ArangoDBException;
@@ -42,7 +39,6 @@
4239
import com.arangodb.internal.net.CommunicationProtocol;
4340
import com.arangodb.internal.net.HostHandle;
4441
import com.arangodb.internal.net.HostResolver;
45-
import com.arangodb.internal.net.HostResolver.EndpointResolver;
4642
import com.arangodb.internal.util.ArangoSerializationFactory;
4743
import com.arangodb.internal.util.ArangoSerializationFactory.Serializer;
4844
import com.arangodb.internal.velocystream.VstCommunicationSync;
@@ -52,10 +48,8 @@
5248
import com.arangodb.model.UserUpdateOptions;
5349
import com.arangodb.util.ArangoCursorInitializer;
5450
import com.arangodb.util.ArangoSerialization;
55-
import com.arangodb.velocypack.VPackSlice;
5651
import com.arangodb.velocypack.exception.VPackException;
5752
import com.arangodb.velocystream.Request;
58-
import com.arangodb.velocystream.RequestType;
5953
import com.arangodb.velocystream.Response;
6054

6155
/**
@@ -71,58 +65,30 @@ public class ArangoDBImpl extends InternalArangoDB<ArangoExecutorSync> implement
7165
public ArangoDBImpl(final VstCommunicationSync.Builder vstBuilder, final HttpCommunication.Builder httpBuilder,
7266
final ArangoSerializationFactory util, final Protocol protocol, final HostResolver hostResolver,
7367
final ArangoContext context) {
74-
super(new ArangoExecutorSync(createProtocol(vstBuilder, httpBuilder, util.get(Serializer.INTERNAL), protocol),
75-
util, new DocumentCache()), util, context);
76-
cp = createProtocol(new VstCommunicationSync.Builder(vstBuilder).maxConnections(1),
77-
new HttpCommunication.Builder(httpBuilder), util.get(Serializer.INTERNAL), protocol);
78-
hostResolver.init(new EndpointResolver() {
79-
@Override
80-
public Collection<String> resolve(final boolean closeConnections) throws ArangoDBException {
81-
Collection<String> response;
82-
try {
83-
response = executor.execute(new Request(ArangoRequestParam.SYSTEM, RequestType.GET, PATH_ENDPOINTS),
84-
new ResponseDeserializer<Collection<String>>() {
85-
@Override
86-
public Collection<String> deserialize(final Response response) throws VPackException {
87-
final VPackSlice field = response.getBody().get("endpoints");
88-
Collection<String> endpoints;
89-
if (field.isNone()) {
90-
endpoints = Collections.<String> emptyList();
91-
} else {
92-
final Collection<Map<String, String>> tmp = util().deserialize(field,
93-
Collection.class);
94-
endpoints = new ArrayList<String>();
95-
for (final Map<String, String> map : tmp) {
96-
for (final String value : map.values()) {
97-
endpoints.add(value);
98-
}
99-
}
100-
}
101-
return endpoints;
102-
}
103-
}, null);
104-
} catch (final ArangoDBException e) {
105-
final Integer responseCode = e.getResponseCode();
106-
if (responseCode != null && responseCode == 403) {
107-
response = Collections.<String> emptyList();
108-
} else {
109-
throw e;
110-
}
111-
} finally {
112-
if (closeConnections) {
113-
ArangoDBImpl.this.shutdown();
114-
}
115-
}
116-
return response;
117-
}
118-
});
68+
69+
super(new ArangoExecutorSync(
70+
createProtocol(vstBuilder, httpBuilder, util.get(Serializer.INTERNAL), protocol),
71+
util,
72+
new DocumentCache()),
73+
util,
74+
context);
75+
76+
cp = createProtocol(
77+
new VstCommunicationSync.Builder(vstBuilder).maxConnections(1),
78+
new HttpCommunication.Builder(httpBuilder),
79+
util.get(Serializer.INTERNAL),
80+
protocol);
81+
82+
hostResolver.init(this.executor(), util());
83+
11984
}
12085

12186
private static CommunicationProtocol createProtocol(
12287
final VstCommunicationSync.Builder vstBuilder,
12388
final HttpCommunication.Builder httpBuilder,
12489
final ArangoSerialization util,
12590
final Protocol protocol) {
91+
12692
return (protocol == null || Protocol.VST == protocol) ? createVST(vstBuilder, util)
12793
: createHTTP(httpBuilder, util);
12894
}

src/main/java/com/arangodb/internal/InternalArangoDB.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public abstract class InternalArangoDB<E extends ArangoExecutor> extends ArangoE
5454
private static final String PATH_API_ADMIN_LOG = "/_admin/log";
5555
private static final String PATH_API_ADMIN_LOG_LEVEL = "/_admin/log/level";
5656
private static final String PATH_API_ROLE = "/_admin/server/role";
57-
protected static final String PATH_ENDPOINTS = "/_api/cluster/endpoints";
57+
private static final String PATH_ENDPOINTS = "/_api/cluster/endpoints";
5858
private static final String PATH_API_USER = "/_api/user";
5959

6060
protected InternalArangoDB(final E executor, final ArangoSerializationFactory util, final ArangoContext context) {

src/main/java/com/arangodb/internal/net/ExtendedHostResolver.java

Lines changed: 74 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,48 @@
2020

2121
package com.arangodb.internal.net;
2222

23+
import java.util.ArrayList;
2324
import java.util.Arrays;
2425
import java.util.Collection;
26+
import java.util.Collections;
2527
import java.util.List;
28+
import java.util.Map;
2629

2730
import org.slf4j.Logger;
2831
import org.slf4j.LoggerFactory;
2932

33+
import com.arangodb.ArangoDBException;
34+
import com.arangodb.internal.ArangoExecutor.ResponseDeserializer;
35+
import com.arangodb.internal.ArangoExecutorSync;
36+
import com.arangodb.internal.ArangoRequestParam;
3037
import com.arangodb.internal.util.HostUtils;
38+
import com.arangodb.util.ArangoSerialization;
39+
import com.arangodb.velocypack.VPackSlice;
40+
import com.arangodb.velocypack.exception.VPackException;
41+
import com.arangodb.velocystream.Request;
42+
import com.arangodb.velocystream.RequestType;
43+
import com.arangodb.velocystream.Response;
3144

3245
/**
3346
* @author Mark Vollmary
3447
*
3548
*/
3649
public class ExtendedHostResolver implements HostResolver {
37-
50+
3851
private static final Logger LOGGER = LoggerFactory.getLogger(ExtendedHostResolver.class);
3952

4053
private static final long MAX_CACHE_TIME = 60 * 60 * 1000;
41-
42-
private EndpointResolver resolver;
54+
4355
private HostSet hosts;
44-
56+
4557
private final Integer maxConnections;
4658
private final ConnectionFactory connectionFactory;
47-
59+
4860
private long lastUpdate;
4961

62+
private ArangoExecutorSync executor;
63+
private ArangoSerialization arangoSerialization;
64+
5065
public ExtendedHostResolver(final List<Host> hosts, final Integer maxConnections,
5166
final ConnectionFactory connectionFactory) {
5267
super();
@@ -57,52 +72,93 @@ public ExtendedHostResolver(final List<Host> hosts, final Integer maxConnections
5772
}
5873

5974
@Override
60-
public void init(final EndpointResolver resolver) {
61-
this.resolver = resolver;
75+
public void init(ArangoExecutorSync executor, ArangoSerialization arangoSerialization) {
76+
this.executor = executor;
77+
this.arangoSerialization = arangoSerialization;
6278
}
6379

6480
@Override
6581

6682
public HostSet resolve(final boolean initial, final boolean closeConnections) {
67-
83+
6884
if (!initial && isExpired()) {
69-
85+
7086
lastUpdate = System.currentTimeMillis();
71-
72-
final Collection<String> endpoints = resolver.resolve(closeConnections);
87+
88+
final Collection<String> endpoints = resolveFromServer();
7389
LOGGER.debug("Resolve " + endpoints.size() + " Endpoints");
7490
LOGGER.debug("Endpoints " + Arrays.deepToString(endpoints.toArray()));
75-
91+
7692
if (!endpoints.isEmpty()) {
7793
hosts.clear();
7894
}
79-
95+
8096
for (final String endpoint : endpoints) {
8197
LOGGER.debug("Create HOST from " + endpoint);
82-
98+
8399
if (endpoint.matches(".*://.+:[0-9]+")) {
84-
100+
85101
final String[] s = endpoint.replaceAll(".*://", "").split(":");
86102
if (s.length == 2) {
87103
final HostDescription description = new HostDescription(s[0], Integer.valueOf(s[1]));
88104
hosts.addHost(HostUtils.createHost(description, maxConnections, connectionFactory));
89105
} else if (s.length == 4) {
90-
// IPV6 Address - TODO: we need a proper function to resolve AND support IPV4 & IPV6 functions globally
106+
// IPV6 Address - TODO: we need a proper function to resolve AND support IPV4 & IPV6 functions
107+
// globally
91108
final HostDescription description = new HostDescription("127.0.0.1", Integer.valueOf(s[3]));
92109
hosts.addHost(HostUtils.createHost(description, maxConnections, connectionFactory));
93110
} else {
94111
LOGGER.warn("Skip Endpoint (Missing Port)" + endpoint);
95112
}
96-
113+
97114
} else {
98115
LOGGER.warn("Skip Endpoint (Format)" + endpoint);
99116
}
100117
}
101118
}
102-
119+
103120
return hosts;
104121
}
105122

123+
private Collection<String> resolveFromServer() throws ArangoDBException {
124+
125+
Collection<String> response;
126+
127+
try {
128+
129+
response = executor.execute(
130+
new Request(ArangoRequestParam.SYSTEM, RequestType.GET, "/_api/cluster/endpoints"),
131+
new ResponseDeserializer<Collection<String>>() {
132+
@Override
133+
public Collection<String> deserialize(final Response response) throws VPackException {
134+
final VPackSlice field = response.getBody().get("endpoints");
135+
Collection<String> endpoints;
136+
if (field.isNone()) {
137+
endpoints = Collections.<String> emptyList();
138+
} else {
139+
final Collection<Map<String, String>> tmp = arangoSerialization.deserialize(field, Collection.class);
140+
endpoints = new ArrayList<String>();
141+
for (final Map<String, String> map : tmp) {
142+
for (final String value : map.values()) {
143+
endpoints.add(value);
144+
}
145+
}
146+
}
147+
return endpoints;
148+
}
149+
}, null);
150+
} catch (final ArangoDBException e) {
151+
final Integer responseCode = e.getResponseCode();
152+
if (responseCode != null && responseCode == 403) {
153+
response = Collections.<String> emptyList();
154+
} else {
155+
throw e;
156+
}
157+
}
158+
159+
return response;
160+
}
161+
106162
private boolean isExpired() {
107163
return System.currentTimeMillis() > lastUpdate + MAX_CACHE_TIME;
108164
}

src/main/java/com/arangodb/internal/net/HostResolver.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,16 @@
2020

2121
package com.arangodb.internal.net;
2222

23-
import java.util.Collection;
24-
25-
import com.arangodb.ArangoDBException;
23+
import com.arangodb.internal.ArangoExecutorSync;
24+
import com.arangodb.util.ArangoSerialization;
2625

2726
/**
2827
* @author Mark Vollmary
2928
*
3029
*/
3130
public interface HostResolver {
3231

33-
public interface EndpointResolver {
34-
Collection<String> resolve(boolean closeConnections) throws ArangoDBException;
35-
}
36-
37-
void init(final EndpointResolver resolver);
32+
void init(ArangoExecutorSync executorSync, ArangoSerialization arangoSerialization);
3833

3934
HostSet resolve(boolean initial, boolean closeConnections);
4035

src/main/java/com/arangodb/internal/net/SimpleHostResolver.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,25 @@
2222

2323
import java.util.List;
2424

25+
import com.arangodb.internal.ArangoExecutorSync;
26+
import com.arangodb.util.ArangoSerialization;
27+
2528
/**
2629
* @author Mark Vollmary
2730
*
2831
*/
2932
public class SimpleHostResolver implements HostResolver {
3033

3134
private final List<Host> hosts;
32-
35+
3336
public SimpleHostResolver(final List<Host> hosts) {
3437
super();
3538
this.hosts = hosts;
3639
}
3740

3841
@Override
39-
public void init(final EndpointResolver resolver) {
42+
public void init(ArangoExecutorSync executor, ArangoSerialization arangoSerialization) {
43+
4044
}
4145

4246
@Override

src/test/java/com/arangodb/internal/HostHandlerTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.arangodb.internal.net.HostSet;
3838
import com.arangodb.internal.net.RandomHostHandler;
3939
import com.arangodb.internal.net.RoundRobinHostHandler;
40+
import com.arangodb.util.ArangoSerialization;
4041

4142
/**
4243
* @author Mark Vollmary
@@ -59,7 +60,7 @@ public HostSet resolve(final boolean initial, final boolean closeConnections) {
5960
}
6061

6162
@Override
62-
public void init(final EndpointResolver resolver) {
63+
public void init(ArangoExecutorSync executor, ArangoSerialization arangoSerialization) {
6364

6465
}
6566

@@ -78,7 +79,7 @@ public HostSet resolve(final boolean initial, final boolean closeConnections) {
7879
}
7980

8081
@Override
81-
public void init(final EndpointResolver resolver) {
82+
public void init(ArangoExecutorSync executor, ArangoSerialization arangoSerialization) {
8283

8384
}
8485

0 commit comments

Comments
 (0)