1717
1818package org .openqa .selenium .grid .node .local ;
1919
20+ import static com .google .common .collect .ImmutableSet .toImmutableSet ;
21+ import static org .openqa .selenium .grid .data .Availability .DRAINING ;
22+ import static org .openqa .selenium .grid .data .Availability .UP ;
23+ import static org .openqa .selenium .grid .node .CapabilityResponseEncoder .getEncoder ;
24+ import static org .openqa .selenium .remote .HttpSessionId .getSessionId ;
25+ import static org .openqa .selenium .remote .RemoteTags .CAPABILITIES ;
26+ import static org .openqa .selenium .remote .RemoteTags .SESSION_ID ;
27+ import static org .openqa .selenium .remote .http .Contents .asJson ;
28+ import static org .openqa .selenium .remote .http .Contents .string ;
29+ import static org .openqa .selenium .remote .http .HttpMethod .DELETE ;
30+
2031import com .google .common .annotations .VisibleForTesting ;
2132import com .google .common .base .Ticker ;
2233import com .google .common .cache .Cache ;
2334import com .google .common .cache .CacheBuilder ;
2435import com .google .common .cache .RemovalListener ;
2536import com .google .common .collect .ImmutableList ;
2637import com .google .common .collect .ImmutableMap ;
38+
2739import org .openqa .selenium .Capabilities ;
2840import org .openqa .selenium .ImmutableCapabilities ;
2941import org .openqa .selenium .NoSuchSessionException ;
8496import java .util .Set ;
8597import java .util .UUID ;
8698import java .util .concurrent .ExecutionException ;
99+ import java .util .concurrent .atomic .AtomicBoolean ;
87100import java .util .concurrent .atomic .AtomicInteger ;
88101import java .util .logging .Logger ;
89102import java .util .stream .Collectors ;
90103
91- import static com .google .common .collect .ImmutableSet .toImmutableSet ;
92- import static org .openqa .selenium .grid .data .Availability .DRAINING ;
93- import static org .openqa .selenium .grid .data .Availability .UP ;
94- import static org .openqa .selenium .grid .node .CapabilityResponseEncoder .getEncoder ;
95- import static org .openqa .selenium .remote .HttpSessionId .getSessionId ;
96- import static org .openqa .selenium .remote .RemoteTags .CAPABILITIES ;
97- import static org .openqa .selenium .remote .RemoteTags .SESSION_ID ;
98- import static org .openqa .selenium .remote .http .Contents .asJson ;
99- import static org .openqa .selenium .remote .http .Contents .string ;
100- import static org .openqa .selenium .remote .http .HttpMethod .DELETE ;
101-
102104@ ManagedService (objectName = "org.seleniumhq.grid:type=Node,name=LocalNode" ,
103105 description = "Node running the webdriver sessions." )
104106public class LocalNode extends Node {
@@ -115,7 +117,8 @@ public class LocalNode extends Node {
115117 private final Cache <SessionId , SessionSlot > currentSessions ;
116118 private final Cache <SessionId , TemporaryFilesystem > tempFileSystems ;
117119 private final Regularly regularly ;
118- private AtomicInteger pendingSessions = new AtomicInteger ();
120+ private final AtomicInteger pendingSessions = new AtomicInteger ();
121+ private final AtomicBoolean heartBeatStarted = new AtomicBoolean (false );
119122
120123 private LocalNode (
121124 Tracer tracer ,
@@ -175,8 +178,11 @@ private LocalNode(
175178
176179 bus .addListener (NodeAddedEvent .listener (nodeId -> {
177180 if (getId ().equals (nodeId )) {
178- regularly .submit (() ->
179- bus .fire (new NodeHeartBeatEvent (getId ())), heartbeatPeriod , heartbeatPeriod );
181+ // Lets avoid to create more than one "Regularly" when the Node registers again.
182+ if (!heartBeatStarted .getAndSet (true )) {
183+ regularly .submit (
184+ () -> bus .fire (new NodeHeartBeatEvent (getId ())), heartbeatPeriod , heartbeatPeriod );
185+ }
180186 }
181187 }));
182188
0 commit comments