Skip to content

Commit cff83e3

Browse files
authored
added HTTP/2 window size configuration, increased default values (#616)
1 parent cd92533 commit cff83e3

File tree

10 files changed

+95
-3
lines changed

10 files changed

+95
-3
lines changed

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,28 @@ public Builder pipelining(final Boolean pipelining) {
562562
return this;
563563
}
564564

565+
/**
566+
* Sets the size of the connection window for HTTP/2.
567+
*
568+
* @param connectionWindowSize size in bytes
569+
* @return {@link ArangoDB.Builder}
570+
*/
571+
public Builder connectionWindowSize(final Integer connectionWindowSize) {
572+
config.setConnectionWindowSize(connectionWindowSize);
573+
return this;
574+
}
575+
576+
/**
577+
* Sets the initial window size for HTTP/2 streams.
578+
*
579+
* @param initialWindowSize size in bytes
580+
* @return {@link ArangoDB.Builder}
581+
*/
582+
public Builder initialWindowSize(final Integer initialWindowSize) {
583+
config.setInitialWindowSize(initialWindowSize);
584+
return this;
585+
}
586+
565587
/**
566588
* Sets the maximum number of connections the built in connection pool will open per host.
567589
*

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ public interface ArangoConfigProperties {
2525
String KEY_VERIFY_HOST = "verifyHost";
2626
String KEY_CHUNK_SIZE = "chunkSize";
2727
String KEY_PIPELINING = "pipelining";
28+
String KEY_CONNECTION_WINDOW_SIZE = "connectionWindowSize";
29+
String KEY_INITIAL_WINDOW_SIZE = "initialWindowSize";
2830
String KEY_MAX_CONNECTIONS = "maxConnections";
2931
String KEY_CONNECTION_TTL = "connectionTtl";
3032
String KEY_KEEP_ALIVE_INTERVAL = "keepAliveInterval";
@@ -130,6 +132,14 @@ default Optional<Boolean> getPipelining() {
130132
return Optional.empty();
131133
}
132134

135+
default Optional<Integer> getConnectionWindowSize() {
136+
return Optional.empty();
137+
}
138+
139+
default Optional<Integer> getInitialWindowSize() {
140+
return Optional.empty();
141+
}
142+
133143
default Optional<Integer> getMaxConnections() {
134144
return Optional.empty();
135145
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,12 @@
3030

3131
/**
3232
* @author Mark Vollmary
33+
* @author Michele Rastelli
3334
*/
3435
public final class ArangoDefaults {
3536

37+
private static final int MB = 1024 * 1024;
38+
3639
public static final int INTEGER_BYTES = Integer.SIZE / Byte.SIZE;
3740
public static final int LONG_BYTES = Long.SIZE / Byte.SIZE;
3841
public static final int CHUNK_MIN_HEADER_SIZE = INTEGER_BYTES + INTEGER_BYTES + LONG_BYTES;
@@ -52,6 +55,8 @@ public final class ArangoDefaults {
5255
public static final Boolean DEFAULT_VERIFY_HOST = true;
5356
public static final Integer DEFAULT_CHUNK_SIZE = 30_000;
5457
public static final Boolean DEFAULT_PIPELINING = false;
58+
public static final Integer DEFAULT_CONNECTION_WINDOW_SIZE = 32 * MB;
59+
public static final Integer DEFAULT_INITIAL_WINDOW_SIZE = 2 * MB;
5560
public static final Boolean DEFAULT_ACQUIRE_HOST_LIST = false;
5661
public static final Integer DEFAULT_ACQUIRE_HOST_LIST_INTERVAL = 60 * 60 * 1000; // hour
5762
public static final LoadBalancingStrategy DEFAULT_LOAD_BALANCING_STRATEGY = LoadBalancingStrategy.NONE;

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public class ArangoConfig {
4242
private Boolean verifyHost;
4343
private Integer chunkSize;
4444
private Boolean pipelining;
45+
private Integer connectionWindowSize;
46+
private Integer initialWindowSize;
4547
private Integer maxConnections;
4648
private Long connectionTtl;
4749
private Integer keepAliveInterval;
@@ -83,6 +85,8 @@ public void loadProperties(final ArangoConfigProperties properties) {
8385
verifyHost = properties.getVerifyHost().orElse(ArangoDefaults.DEFAULT_VERIFY_HOST);
8486
chunkSize = properties.getChunkSize().orElse(ArangoDefaults.DEFAULT_CHUNK_SIZE);
8587
pipelining = properties.getPipelining().orElse(ArangoDefaults.DEFAULT_PIPELINING);
88+
connectionWindowSize = properties.getConnectionWindowSize().orElse(ArangoDefaults.DEFAULT_CONNECTION_WINDOW_SIZE);
89+
initialWindowSize = properties.getInitialWindowSize().orElse(ArangoDefaults.DEFAULT_INITIAL_WINDOW_SIZE);
8690
// FIXME: make maxConnections field Optional
8791
maxConnections = properties.getMaxConnections().orElse(null);
8892
// FIXME: make connectionTtl field Optional
@@ -209,6 +213,22 @@ public void setPipelining(Boolean pipelining) {
209213
this.pipelining = pipelining;
210214
}
211215

216+
public Integer getConnectionWindowSize() {
217+
return connectionWindowSize;
218+
}
219+
220+
public void setConnectionWindowSize(Integer connectionWindowSize) {
221+
this.connectionWindowSize = connectionWindowSize;
222+
}
223+
224+
public Integer getInitialWindowSize() {
225+
return initialWindowSize;
226+
}
227+
228+
public void setInitialWindowSize(Integer initialWindowSize) {
229+
this.initialWindowSize = initialWindowSize;
230+
}
231+
212232
public Integer getMaxConnections() {
213233
if (maxConnections == null) {
214234
maxConnections = getDefaultMaxConnections();

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ public Optional<Boolean> getPipelining() {
139139
return Optional.ofNullable(getProperty(KEY_PIPELINING)).map(Boolean::valueOf);
140140
}
141141

142+
@Override
143+
public Optional<Integer> getConnectionWindowSize() {
144+
return Optional.ofNullable(getProperty(KEY_CONNECTION_WINDOW_SIZE)).map(Integer::valueOf);
145+
}
146+
147+
@Override
148+
public Optional<Integer> getInitialWindowSize() {
149+
return Optional.ofNullable(getProperty(KEY_INITIAL_WINDOW_SIZE)).map(Integer::valueOf);
150+
}
151+
142152
@Override
143153
public Optional<Integer> getMaxConnections() {
144154
return Optional.ofNullable(getProperty(KEY_MAX_CONNECTIONS)).map(Integer::valueOf);

http-protocol/src/main/java/com/arangodb/http/HttpConnection.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import io.vertx.core.Vertx;
4141
import io.vertx.core.VertxOptions;
4242
import io.vertx.core.buffer.Buffer;
43+
import io.vertx.core.http.Http2Settings;
4344
import io.vertx.core.http.HttpHeaders;
4445
import io.vertx.core.http.HttpMethod;
4546
import io.vertx.core.http.HttpVersion;
@@ -161,7 +162,9 @@ private static String getUserAgent() {
161162
.setProtocolVersion(httpVersion)
162163
.setDefaultHost(host.getHost())
163164
.setDefaultPort(host.getPort())
164-
.setProxyOptions(protocolConfig.getProxyOptions());
165+
.setProxyOptions(protocolConfig.getProxyOptions())
166+
.setHttp2ConnectionWindowSize(config.getConnectionWindowSize())
167+
.setInitialSettings(new Http2Settings().setInitialWindowSize(config.getInitialWindowSize()));
165168

166169
if (compression != Compression.NONE) {
167170
webClientOptions.setTryUseCompression(true);

test-non-functional/src/test/java/mp/ArangoConfigPropertiesMPImpl.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public final class ArangoConfigPropertiesMPImpl implements ArangoConfigPropertie
2727
private Optional<Boolean> verifyHost;
2828
private Optional<Integer> chunkSize;
2929
private Optional<Boolean> pipelining;
30+
private Optional<Integer> connectionWindowSize;
31+
private Optional<Integer> initialWindowSize;
3032
private Optional<Integer> maxConnections;
3133
private Optional<Long> connectionTtl;
3234
private Optional<Integer> keepAliveInterval;
@@ -104,6 +106,16 @@ public Optional<Boolean> getPipelining() {
104106
return pipelining;
105107
}
106108

109+
@Override
110+
public Optional<Integer> getConnectionWindowSize() {
111+
return connectionWindowSize;
112+
}
113+
114+
@Override
115+
public Optional<Integer> getInitialWindowSize() {
116+
return initialWindowSize;
117+
}
118+
107119
@Override
108120
public Optional<Integer> getMaxConnections() {
109121
return maxConnections;
@@ -164,12 +176,12 @@ public boolean equals(Object o) {
164176
if (this == o) return true;
165177
if (o == null || getClass() != o.getClass()) return false;
166178
ArangoConfigPropertiesMPImpl that = (ArangoConfigPropertiesMPImpl) o;
167-
return Objects.equals(hosts, that.hosts) && Objects.equals(protocol, that.protocol) && Objects.equals(user, that.user) && Objects.equals(password, that.password) && Objects.equals(jwt, that.jwt) && Objects.equals(timeout, that.timeout) && Objects.equals(useSsl, that.useSsl) && Objects.equals(verifyHost, that.verifyHost) && Objects.equals(chunkSize, that.chunkSize) && Objects.equals(pipelining, that.pipelining) && Objects.equals(maxConnections, that.maxConnections) && Objects.equals(connectionTtl, that.connectionTtl) && Objects.equals(keepAliveInterval, that.keepAliveInterval) && Objects.equals(acquireHostList, that.acquireHostList) && Objects.equals(acquireHostListInterval, that.acquireHostListInterval) && Objects.equals(loadBalancingStrategy, that.loadBalancingStrategy) && Objects.equals(responseQueueTimeSamples, that.responseQueueTimeSamples) && Objects.equals(compression, that.compression) && Objects.equals(compressionThreshold, that.compressionThreshold) && Objects.equals(compressionLevel, that.compressionLevel) && Objects.equals(serdeProviderClass, that.serdeProviderClass);
179+
return Objects.equals(hosts, that.hosts) && Objects.equals(protocol, that.protocol) && Objects.equals(user, that.user) && Objects.equals(password, that.password) && Objects.equals(jwt, that.jwt) && Objects.equals(timeout, that.timeout) && Objects.equals(useSsl, that.useSsl) && Objects.equals(verifyHost, that.verifyHost) && Objects.equals(chunkSize, that.chunkSize) && Objects.equals(pipelining, that.pipelining) && Objects.equals(connectionWindowSize, that.connectionWindowSize) && Objects.equals(initialWindowSize, that.initialWindowSize) && Objects.equals(maxConnections, that.maxConnections) && Objects.equals(connectionTtl, that.connectionTtl) && Objects.equals(keepAliveInterval, that.keepAliveInterval) && Objects.equals(acquireHostList, that.acquireHostList) && Objects.equals(acquireHostListInterval, that.acquireHostListInterval) && Objects.equals(loadBalancingStrategy, that.loadBalancingStrategy) && Objects.equals(responseQueueTimeSamples, that.responseQueueTimeSamples) && Objects.equals(compression, that.compression) && Objects.equals(compressionThreshold, that.compressionThreshold) && Objects.equals(compressionLevel, that.compressionLevel) && Objects.equals(serdeProviderClass, that.serdeProviderClass);
168180
}
169181

170182
@Override
171183
public int hashCode() {
172-
return Objects.hash(hosts, protocol, user, password, jwt, timeout, useSsl, verifyHost, chunkSize, pipelining, maxConnections, connectionTtl, keepAliveInterval, acquireHostList, acquireHostListInterval, loadBalancingStrategy, responseQueueTimeSamples, compression, compressionThreshold, compressionLevel, serdeProviderClass);
184+
return Objects.hash(hosts, protocol, user, password, jwt, timeout, useSsl, verifyHost, chunkSize, pipelining, connectionWindowSize, initialWindowSize, maxConnections, connectionTtl, keepAliveInterval, acquireHostList, acquireHostListInterval, loadBalancingStrategy, responseQueueTimeSamples, compression, compressionThreshold, compressionLevel, serdeProviderClass);
173185
}
174186

175187
@Override
@@ -185,6 +197,8 @@ public String toString() {
185197
", verifyHost=" + verifyHost +
186198
", chunkSize=" + chunkSize +
187199
", pipelining=" + pipelining +
200+
", connectionWindowSize=" + connectionWindowSize +
201+
", initialWindowSize=" + initialWindowSize +
188202
", maxConnections=" + maxConnections +
189203
", connectionTtl=" + connectionTtl +
190204
", keepAliveInterval=" + keepAliveInterval +

test-non-functional/src/test/java/mp/ConfigMPDefaultsTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ private void checkResult(ArangoConfigProperties config) {
2929
assertThat(config.getVerifyHost()).isEmpty();
3030
assertThat(config.getChunkSize()).isEmpty();
3131
assertThat(config.getPipelining()).isEmpty();
32+
assertThat(config.getConnectionWindowSize()).isEmpty();
33+
assertThat(config.getInitialWindowSize()).isEmpty();
3234
assertThat(config.getMaxConnections()).isNotPresent();
3335
assertThat(config.getConnectionTtl()).isNotPresent();
3436
assertThat(config.getKeepAliveInterval()).isNotPresent();

test-non-functional/src/test/java/mp/ConfigMPTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ class ConfigMPTest {
2727
private final Boolean verifyHost = false;
2828
private final Integer vstChunkSize = 1234;
2929
private final Boolean pipelining = true;
30+
private final Integer connectionWindowSize = 987;
31+
private final Integer initialWindowSize = 876;
3032
private final Integer maxConnections = 123;
3133
private final Long connectionTtl = 12345L;
3234
private final Integer keepAliveInterval = 123456;
@@ -66,6 +68,8 @@ private void checkResult(ArangoConfigProperties config) {
6668
assertThat(config.getVerifyHost()).hasValue(verifyHost);
6769
assertThat(config.getChunkSize()).hasValue(vstChunkSize);
6870
assertThat(config.getPipelining()).hasValue(pipelining);
71+
assertThat(config.getConnectionWindowSize()).hasValue(connectionWindowSize);
72+
assertThat(config.getInitialWindowSize()).hasValue(initialWindowSize);
6973
assertThat(config.getMaxConnections())
7074
.isPresent()
7175
.hasValue(maxConnections);

test-non-functional/src/test/resources/arangodb-config-test.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ adb.sslProtocol=sslProtocol
1111
adb.verifyHost=false
1212
adb.chunkSize=1234
1313
adb.pipelining=true
14+
adb.connectionWindowSize=987
15+
adb.initialWindowSize=876
1416
adb.maxConnections=123
1517
adb.connectionTtl=12345
1618
adb.keepAliveInterval=123456

0 commit comments

Comments
 (0)