Skip to content

Commit a30e513

Browse files
committed
Share a single timer instance for all Netty connections
1 parent 67ef04f commit a30e513

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

java/client/src/org/openqa/selenium/remote/http/netty/NettyClient.java

+30-10
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,15 @@
1818
package org.openqa.selenium.remote.http.netty;
1919

2020
import com.google.auto.service.AutoService;
21+
import io.netty.util.HashedWheelTimer;
22+
import io.netty.util.Timer;
2123
import io.netty.util.concurrent.DefaultThreadFactory;
2224
import org.asynchttpclient.AsyncHttpClient;
25+
import org.asynchttpclient.AsyncHttpClientConfig;
2326
import org.asynchttpclient.DefaultAsyncHttpClientConfig;
2427
import org.asynchttpclient.Dsl;
28+
import org.asynchttpclient.config.AsyncHttpClientConfigDefaults;
29+
import org.asynchttpclient.netty.channel.DefaultChannelPool;
2530
import org.openqa.selenium.internal.Require;
2631
import org.openqa.selenium.remote.http.ClientConfig;
2732
import org.openqa.selenium.remote.http.Filter;
@@ -33,10 +38,23 @@
3338
import org.openqa.selenium.remote.http.WebSocket;
3439

3540
import java.io.IOException;
41+
import java.util.Map;
42+
import java.util.concurrent.ThreadFactory;
43+
import java.util.concurrent.TimeUnit;
3644
import java.util.function.BiFunction;
3745

3846
public class NettyClient implements HttpClient {
39-
47+
private final static Timer TIMER;
48+
static {
49+
ThreadFactory threadFactory = new DefaultThreadFactory("netty-client-timer", true);
50+
HashedWheelTimer timer = new HashedWheelTimer(
51+
threadFactory,
52+
AsyncHttpClientConfigDefaults.defaultHashedWheelTimerTickDuration(),
53+
TimeUnit.MILLISECONDS,
54+
AsyncHttpClientConfigDefaults.defaultHashedWheelTimerSize());
55+
timer.start();
56+
TIMER = timer;
57+
}
4058
private final ClientConfig config;
4159
private final AsyncHttpClient client;
4260
private final HttpHandler handler;
@@ -57,19 +75,21 @@ private AsyncHttpClient createHttpClient(ClientConfig config) {
5775
.setAggregateWebSocketFrameFragments(true)
5876
.setWebSocketMaxBufferSize(Integer.MAX_VALUE)
5977
.setWebSocketMaxFrameSize(Integer.MAX_VALUE)
60-
.setConnectTimeout((int) config.connectionTimeout().toMillis());
61-
62-
// String info = config.baseUrl().getUserInfo();
63-
// if (info != null && !info.equals("")) {
64-
// String[] parts = info.split(":", 2);
65-
// String user = parts[0];
66-
// String pass = parts.length > 1 ? parts[1] : null;
67-
// builder.setRealm(Dsl.basicAuthRealm(user, pass).setUsePreemptiveAuth(true).build());
68-
// }
78+
.setNettyTimer(TIMER)
79+
.setConnectTimeout(toClampedInt(config.connectionTimeout().toMillis()))
80+
.setReadTimeout(toClampedInt(config.readTimeout().toMillis()));
6981

7082
return Dsl.asyncHttpClient(builder);
7183
}
7284

85+
/**
86+
* Converts a long to an int, clamping the maximum and minimum values to
87+
* fit in an integer without overflowing.
88+
*/
89+
private int toClampedInt(long value) {
90+
return (int) Math.max(Integer.MIN_VALUE, Math.min(Integer.MAX_VALUE, value));
91+
}
92+
7393
@Override
7494
public HttpResponse execute(HttpRequest request) {
7595
return handler.execute(request);

java/server/test/org/openqa/selenium/grid/router/EndToEndTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public static Collection<Supplier<TestData>> buildGrids() {
102102
public Supplier<TestData> values;
103103

104104
private Server<?> server;
105-
private TearDownFixture[] fixtures;
105+
private TearDownFixture[] fixtures = new TearDownFixture[0];
106106

107107
private HttpClient.Factory clientFactory;
108108
private HttpClient client;
@@ -118,7 +118,7 @@ public void setFields() {
118118

119119
@After
120120
public void stopServers() {
121-
Safely.safelyCall(client::close);
121+
Safely.safelyCall(() -> client.close());
122122
Safely.safelyCall(this.fixtures);
123123
}
124124

0 commit comments

Comments
 (0)