Skip to content

Commit 72562d8

Browse files
authored
[grid][java]: session-timeout set connection timeout in RemoteNode (#13854)
* [grid][java]: add session-timeout to all kind of Nodes Signed-off-by: Viet Nguyen Duc <[email protected]> * [grid][java]: fix code as suggestions Signed-off-by: Viet Nguyen Duc <[email protected]> * [java][grid]: update test CustomNode can get/set sessionTimeout Signed-off-by: Viet Nguyen Duc <[email protected]> --------- Signed-off-by: Viet Nguyen Duc <[email protected]>
1 parent 8e3e26e commit 72562d8

File tree

13 files changed

+71
-9
lines changed

13 files changed

+71
-9
lines changed

java/src/org/openqa/selenium/grid/data/NodeStatus.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public class NodeStatus {
4242
private final Set<Slot> slots;
4343
private final Availability availability;
4444
private final Duration heartbeatPeriod;
45+
private final Duration sessionTimeout;
4546
private final String version;
4647
private final Map<String, String> osInfo;
4748

@@ -52,6 +53,7 @@ public NodeStatus(
5253
Set<Slot> slots,
5354
Availability availability,
5455
Duration heartbeatPeriod,
56+
Duration sessionTimeout,
5557
String version,
5658
Map<String, String> osInfo) {
5759
this.nodeId = Require.nonNull("Node id", nodeId);
@@ -62,6 +64,7 @@ public NodeStatus(
6264
this.slots = unmodifiableSet(new HashSet<>(Require.nonNull("Slots", slots)));
6365
this.availability = Require.nonNull("Availability", availability);
6466
this.heartbeatPeriod = heartbeatPeriod;
67+
this.sessionTimeout = sessionTimeout;
6568
this.version = Require.nonNull("Grid Node version", version);
6669
this.osInfo = Require.nonNull("Node host OS info", osInfo);
6770
}
@@ -73,6 +76,7 @@ public static NodeStatus fromJson(JsonInput input) {
7376
Set<Slot> slots = null;
7477
Availability availability = null;
7578
Duration heartbeatPeriod = null;
79+
Duration sessionTimeout = null;
7680
String version = null;
7781
Map<String, String> osInfo = null;
7882

@@ -87,6 +91,10 @@ public static NodeStatus fromJson(JsonInput input) {
8791
heartbeatPeriod = Duration.ofMillis(input.read(Long.class));
8892
break;
8993

94+
case "sessionTimeout":
95+
sessionTimeout = Duration.ofMillis(input.read(Long.class));
96+
break;
97+
9098
case "nodeId":
9199
nodeId = input.read(NodeId.class);
92100
break;
@@ -119,7 +127,15 @@ public static NodeStatus fromJson(JsonInput input) {
119127
input.endObject();
120128

121129
return new NodeStatus(
122-
nodeId, externalUri, maxSessions, slots, availability, heartbeatPeriod, version, osInfo);
130+
nodeId,
131+
externalUri,
132+
maxSessions,
133+
slots,
134+
availability,
135+
heartbeatPeriod,
136+
sessionTimeout,
137+
version,
138+
osInfo);
123139
}
124140

125141
public boolean hasCapability(Capabilities caps, SlotMatcher slotMatcher) {
@@ -162,6 +178,10 @@ public Duration getHeartbeatPeriod() {
162178
return heartbeatPeriod;
163179
}
164180

181+
public Duration getSessionTimeout() {
182+
return sessionTimeout;
183+
}
184+
165185
public String getVersion() {
166186
return version;
167187
}
@@ -212,6 +232,7 @@ private Map<String, Object> toJson() {
212232
toReturn.put("slots", slots);
213233
toReturn.put("availability", availability);
214234
toReturn.put("heartbeatPeriod", heartbeatPeriod.toMillis());
235+
toReturn.put("sessionTimeout", sessionTimeout.toMillis());
215236
toReturn.put("version", version);
216237
toReturn.put("osInfo", osInfo);
217238

java/src/org/openqa/selenium/grid/distributor/AddNode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public HttpResponse execute(HttpRequest req) {
6565
status.getNodeId(),
6666
status.getExternalUri(),
6767
registrationSecret,
68+
status.getSessionTimeout(),
6869
status.getSlots().stream().map(Slot::getStereotype).collect(Collectors.toSet()));
6970

7071
distributor.add(node);

java/src/org/openqa/selenium/grid/distributor/GridModel.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ private NodeStatus rewrite(NodeStatus status, Availability availability) {
367367
status.getSlots(),
368368
availability,
369369
status.getHeartbeatPeriod(),
370+
status.getSessionTimeout(),
370371
status.getVersion(),
371372
status.getOsInfo());
372373
}
@@ -508,6 +509,7 @@ private void amend(Availability availability, NodeStatus status, Slot slot) {
508509
newSlots,
509510
availability,
510511
status.getHeartbeatPeriod(),
512+
status.getSessionTimeout(),
511513
status.getVersion(),
512514
status.getOsInfo()));
513515
} finally {

java/src/org/openqa/selenium/grid/distributor/local/LocalDistributor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ private void register(NodeStatus status) {
314314
status.getNodeId(),
315315
status.getExternalUri(),
316316
registrationSecret,
317+
status.getSessionTimeout(),
317318
capabilities);
318319

319320
add(remoteNode);

java/src/org/openqa/selenium/grid/node/Node.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.common.collect.ImmutableMap;
2929
import java.io.IOException;
3030
import java.net.URI;
31+
import java.time.Duration;
3132
import java.util.Map;
3233
import java.util.ServiceLoader;
3334
import java.util.Set;
@@ -116,13 +117,16 @@ public abstract class Node implements HasReadyState, Routable {
116117
protected final Tracer tracer;
117118
private final NodeId id;
118119
private final URI uri;
120+
private final Duration sessionTimeout;
119121
private final Route routes;
120122
protected boolean draining;
121123

122-
protected Node(Tracer tracer, NodeId id, URI uri, Secret registrationSecret) {
124+
protected Node(
125+
Tracer tracer, NodeId id, URI uri, Secret registrationSecret, Duration sessionTimeout) {
123126
this.tracer = Require.nonNull("Tracer", tracer);
124127
this.id = Require.nonNull("Node id", id);
125128
this.uri = Require.nonNull("URI", uri);
129+
this.sessionTimeout = Require.positive("Session timeout", sessionTimeout);
126130
Require.nonNull("Registration secret", registrationSecret);
127131

128132
RequiresSecretFilter requiresSecret = new RequiresSecretFilter(registrationSecret);
@@ -246,6 +250,10 @@ public TemporaryFilesystem getDownloadsFilesystem(UUID uuid) throws IOException
246250

247251
public abstract HealthCheck getHealthCheck();
248252

253+
public Duration getSessionTimeout() {
254+
return sessionTimeout;
255+
}
256+
249257
public boolean isDraining() {
250258
return draining;
251259
}

java/src/org/openqa/selenium/grid/node/k8s/OneShotNode.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,13 @@ private OneShotNode(
109109
EventBus events,
110110
Secret registrationSecret,
111111
Duration heartbeatPeriod,
112+
Duration sessionTimeout,
112113
NodeId id,
113114
URI uri,
114115
URI gridUri,
115116
Capabilities stereotype,
116117
WebDriverInfo driverInfo) {
117-
super(tracer, id, uri, registrationSecret);
118+
super(tracer, id, uri, registrationSecret, Require.positive(sessionTimeout));
118119

119120
this.heartbeatPeriod = heartbeatPeriod;
120121
this.events = Require.nonNull("Event bus", events);
@@ -169,6 +170,7 @@ public static Node create(Config config) {
169170
eventOptions.getEventBus(),
170171
secretOptions.getRegistrationSecret(),
171172
nodeOptions.getHeartbeatPeriod(),
173+
nodeOptions.getSessionTimeout(),
172174
new NodeId(UUID.randomUUID()),
173175
serverOptions.getExternalUri(),
174176
nodeOptions
@@ -376,6 +378,7 @@ public NodeStatus getStatus() {
376378
: new Session(sessionId, getUri(), stereotype, capabilities, Instant.now()))),
377379
isDraining() ? DRAINING : UP,
378380
heartbeatPeriod,
381+
getSessionTimeout(),
379382
getNodeVersion(),
380383
getOsInfo());
381384
}

java/src/org/openqa/selenium/grid/node/local/LocalNode.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,12 @@ protected LocalNode(
154154
List<SessionSlot> factories,
155155
Secret registrationSecret,
156156
boolean managedDownloadsEnabled) {
157-
super(tracer, new NodeId(UUID.randomUUID()), uri, registrationSecret);
157+
super(
158+
tracer,
159+
new NodeId(UUID.randomUUID()),
160+
uri,
161+
registrationSecret,
162+
Require.positive(sessionTimeout));
158163

159164
this.bus = Require.nonNull("Event bus", bus);
160165

@@ -906,6 +911,7 @@ public NodeStatus getStatus() {
906911
slots,
907912
availability,
908913
heartbeatPeriod,
914+
getSessionTimeout(),
909915
getNodeVersion(),
910916
getOsInfo());
911917
}

java/src/org/openqa/selenium/grid/node/remote/RemoteNode.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.openqa.selenium.grid.data.Availability.DRAINING;
2323
import static org.openqa.selenium.grid.data.Availability.UP;
2424
import static org.openqa.selenium.net.Urls.fromUri;
25+
import static org.openqa.selenium.remote.http.ClientConfig.defaultConfig;
2526
import static org.openqa.selenium.remote.http.Contents.asJson;
2627
import static org.openqa.selenium.remote.http.Contents.reader;
2728
import static org.openqa.selenium.remote.http.HttpMethod.DELETE;
@@ -35,6 +36,7 @@
3536
import java.io.Reader;
3637
import java.io.UncheckedIOException;
3738
import java.net.URI;
39+
import java.time.Duration;
3840
import java.util.Collection;
3941
import java.util.Map;
4042
import java.util.Objects;
@@ -60,6 +62,7 @@
6062
import org.openqa.selenium.json.Json;
6163
import org.openqa.selenium.json.JsonInput;
6264
import org.openqa.selenium.remote.SessionId;
65+
import org.openqa.selenium.remote.http.ClientConfig;
6366
import org.openqa.selenium.remote.http.Filter;
6467
import org.openqa.selenium.remote.http.HttpClient;
6568
import org.openqa.selenium.remote.http.HttpHandler;
@@ -83,13 +86,15 @@ public RemoteNode(
8386
NodeId id,
8487
URI externalUri,
8588
Secret registrationSecret,
89+
Duration sessionTimeout,
8690
Collection<Capabilities> capabilities) {
87-
super(tracer, id, externalUri, registrationSecret);
91+
super(tracer, id, externalUri, registrationSecret, sessionTimeout);
8892
this.externalUri = Require.nonNull("External URI", externalUri);
8993
this.capabilities = ImmutableSet.copyOf(capabilities);
9094

91-
this.client =
92-
Require.nonNull("HTTP client factory", clientFactory).createClient(fromUri(externalUri));
95+
ClientConfig clientConfig =
96+
defaultConfig().readTimeout(this.getSessionTimeout()).baseUrl(fromUri(externalUri));
97+
this.client = Require.nonNull("HTTP client factory", clientFactory).createClient(clientConfig);
9398

9499
this.healthCheck = new RemoteCheck();
95100

java/src/org/openqa/selenium/redis/GridRedisClient.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ public Optional<NodeStatus> getNode(NodeId id) {
144144
node.getSlots(),
145145
node.getAvailability(),
146146
node.getHeartbeatPeriod(),
147+
node.getSessionTimeout(),
147148
node.getVersion(),
148149
node.getOsInfo());
149150
return Optional.of(resultNode);

java/test/org/openqa/selenium/grid/data/NodeStatusTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ void ensureRoundTripWorks() throws URISyntaxException {
5656
Instant.now()))),
5757
UP,
5858
Duration.ofSeconds(10),
59+
Duration.ofSeconds(300),
5960
"4.0.0",
6061
ImmutableMap.of(
6162
"name", "Max OS X",

0 commit comments

Comments
 (0)