Skip to content

Commit 334ee13

Browse files
authored
[DE-1016] Async connection pool (#602)
* ConnectionLoadBalanceTest * added pipelining option * async connection pool * increase test waiting time * non-blocking AsyncQueue::offer() * refactoring AsyncQueue
1 parent 9b8e9c6 commit 334ee13

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+348
-96
lines changed

core/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<relativePath>../release-parent</relativePath>
99
<groupId>com.arangodb</groupId>
1010
<artifactId>release-parent</artifactId>
11-
<version>7.18.0</version>
11+
<version>7.19.0-SNAPSHOT</version>
1212
</parent>
1313

1414
<name>core</name>

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,17 @@ public Builder chunkSize(final Integer chunkSize) {
517517
return this;
518518
}
519519

520+
/**
521+
* Set whether to use requests pipelining in HTTP/1.1 ({@link Protocol#HTTP_JSON} or {@link Protocol#HTTP_VPACK}).
522+
*
523+
* @param pipelining {@code true} if enabled
524+
* @return {@link ArangoDB.Builder}
525+
*/
526+
public Builder pipelining(final Boolean pipelining) {
527+
config.setPipelining(pipelining);
528+
return this;
529+
}
530+
520531
/**
521532
* Sets the maximum number of connections the built in connection pool will open per host.
522533
*

core/src/main/java/com/arangodb/config/ArangoConfigProperties.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public interface ArangoConfigProperties {
2121
String KEY_USE_SSL = "useSsl";
2222
String KEY_VERIFY_HOST = "verifyHost";
2323
String KEY_CHUNK_SIZE = "chunkSize";
24+
String KEY_PIPELINING = "pipelining";
2425
String KEY_MAX_CONNECTIONS = "maxConnections";
2526
String KEY_CONNECTION_TTL = "connectionTtl";
2627
String KEY_KEEP_ALIVE_INTERVAL = "keepAliveInterval";
@@ -110,6 +111,10 @@ default Optional<Integer> getChunkSize() {
110111
return Optional.empty();
111112
}
112113

114+
default Optional<Boolean> getPipelining() {
115+
return Optional.empty();
116+
}
117+
113118
default Optional<Integer> getMaxConnections() {
114119
return Optional.empty();
115120
}

core/src/main/java/com/arangodb/internal/ArangoDefaults.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public final class ArangoDefaults {
5050
public static final Boolean DEFAULT_USE_SSL = false;
5151
public static final Boolean DEFAULT_VERIFY_HOST = true;
5252
public static final Integer DEFAULT_CHUNK_SIZE = 30_000;
53+
public static final Boolean DEFAULT_PIPELINING = false;
5354
public static final Boolean DEFAULT_ACQUIRE_HOST_LIST = false;
5455
public static final Integer DEFAULT_ACQUIRE_HOST_LIST_INTERVAL = 60 * 60 * 1000; // hour
5556
public static final LoadBalancingStrategy DEFAULT_LOAD_BALANCING_STRATEGY = LoadBalancingStrategy.NONE;

core/src/main/java/com/arangodb/internal/config/ArangoConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class ArangoConfig {
3333
private SSLContext sslContext;
3434
private Boolean verifyHost;
3535
private Integer chunkSize;
36+
private Boolean pipelining;
3637
private Integer maxConnections;
3738
private Long connectionTtl;
3839
private Integer keepAliveInterval;
@@ -70,6 +71,7 @@ public void loadProperties(final ArangoConfigProperties properties) {
7071
useSsl = properties.getUseSsl().orElse(ArangoDefaults.DEFAULT_USE_SSL);
7172
verifyHost = properties.getVerifyHost().orElse(ArangoDefaults.DEFAULT_VERIFY_HOST);
7273
chunkSize = properties.getChunkSize().orElse(ArangoDefaults.DEFAULT_CHUNK_SIZE);
74+
pipelining = properties.getPipelining().orElse(ArangoDefaults.DEFAULT_PIPELINING);
7375
// FIXME: make maxConnections field Optional
7476
maxConnections = properties.getMaxConnections().orElse(null);
7577
// FIXME: make connectionTtl field Optional
@@ -173,6 +175,14 @@ public void setChunkSize(Integer chunkSize) {
173175
this.chunkSize = chunkSize;
174176
}
175177

178+
public Boolean getPipelining() {
179+
return pipelining;
180+
}
181+
182+
public void setPipelining(Boolean pipelining) {
183+
this.pipelining = pipelining;
184+
}
185+
176186
public Integer getMaxConnections() {
177187
if (maxConnections == null) {
178188
maxConnections = getDefaultMaxConnections();

core/src/main/java/com/arangodb/internal/config/ArangoConfigPropertiesImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ public Optional<Integer> getChunkSize() {
119119
return Optional.ofNullable(getProperty(KEY_CHUNK_SIZE)).map(Integer::valueOf);
120120
}
121121

122+
@Override
123+
public Optional<Boolean> getPipelining() {
124+
return Optional.ofNullable(getProperty(KEY_PIPELINING)).map(Boolean::valueOf);
125+
}
126+
122127
@Override
123128
public Optional<Integer> getMaxConnections() {
124129
return Optional.ofNullable(getProperty(KEY_MAX_CONNECTIONS)).map(Integer::valueOf);

core/src/main/java/com/arangodb/internal/net/Communication.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ public CompletableFuture<InternalResponse> executeAsync(final InternalRequest re
5050

5151
private CompletableFuture<InternalResponse> executeAsync(final InternalRequest request, final HostHandle hostHandle, final Host host, final int attemptCount) {
5252
long reqId = reqCount.getAndIncrement();
53-
return doExecuteAsync(request, hostHandle, host, attemptCount, host.connection(), reqId);
53+
return host.connection().thenCompose(c ->
54+
doExecuteAsync(request, hostHandle, host, attemptCount, c, reqId)
55+
.whenComplete((r, t) -> c.release()));
5456
}
5557

5658
private CompletableFuture<InternalResponse> doExecuteAsync(

core/src/main/java/com/arangodb/internal/net/Connection.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,6 @@ public interface Connection extends Closeable {
3535
void setJwt(String jwt);
3636

3737
CompletableFuture<InternalResponse> executeAsync(InternalRequest request);
38+
39+
void release();
3840
}

core/src/main/java/com/arangodb/internal/net/ConnectionFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@
2929
*/
3030
@UsedInApi
3131
public interface ConnectionFactory {
32-
Connection create(ArangoConfig config, HostDescription host);
32+
Connection create(ArangoConfig config, HostDescription host, ConnectionPool pool);
3333
}

core/src/main/java/com/arangodb/internal/net/ConnectionPool.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,22 @@
2020

2121
package com.arangodb.internal.net;
2222

23-
import com.arangodb.config.HostDescription;
23+
import com.arangodb.arch.UsedInApi;
2424

2525
import java.io.Closeable;
26+
import java.util.concurrent.CompletableFuture;
2627

2728
/**
2829
* @author Mark Vollmary
2930
*/
31+
@UsedInApi
3032
public interface ConnectionPool extends Closeable {
3133

32-
Connection createConnection(final HostDescription host);
34+
Connection createConnection();
3335

34-
Connection connection();
36+
CompletableFuture<Connection> connection();
37+
38+
void release(final Connection connection);
3539

3640
void setJwt(String jwt);
3741

0 commit comments

Comments
 (0)