27
27
import org .openqa .selenium .grid .data .SessionClosedEvent ;
28
28
import org .openqa .selenium .grid .data .Slot ;
29
29
import org .openqa .selenium .grid .data .SlotId ;
30
+ import org .openqa .selenium .grid .distributor .GridModel ;
30
31
import org .openqa .selenium .internal .Require ;
31
32
import org .openqa .selenium .remote .SessionId ;
32
33
48
49
import static org .openqa .selenium .grid .data .Availability .DRAINING ;
49
50
import static org .openqa .selenium .grid .data .Availability .UP ;
50
51
51
- public class GridModel {
52
+ public class LocalGridModel implements GridModel {
52
53
53
- private static final Logger LOG = Logger .getLogger (GridModel .class .getName ());
54
+ private static final Logger LOG = Logger .getLogger (LocalGridModel .class .getName ());
54
55
private static final SessionId RESERVED = new SessionId ("reserved" );
55
56
private final ReadWriteLock lock = new ReentrantReadWriteLock (/* fair */ true );
56
57
private final Map <Availability , Set <NodeStatus >> nodes = new ConcurrentHashMap <>();
57
58
private final EventBus events ;
58
59
59
- public GridModel (EventBus events ) {
60
+ public LocalGridModel (EventBus events ) {
60
61
this .events = Require .nonNull ("Event bus" , events );
61
62
62
63
this .events .addListener (NodeDrainStarted .listener (nodeId -> setAvailability (nodeId , DRAINING )));
63
64
this .events .addListener (SessionClosedEvent .listener (this ::release ));
64
65
}
65
66
66
- public GridModel add (NodeStatus node ) {
67
+ @ Override
68
+ public void add (NodeStatus node ) {
67
69
Require .nonNull ("Node" , node );
68
70
69
71
Lock writeLock = lock .writeLock ();
@@ -88,11 +90,10 @@ public GridModel add(NodeStatus node) {
88
90
} finally {
89
91
writeLock .unlock ();
90
92
}
91
-
92
- return this ;
93
93
}
94
94
95
- public GridModel refresh (NodeStatus status ) {
95
+ @ Override
96
+ public void refresh (NodeStatus status ) {
96
97
Require .nonNull ("Node status" , status );
97
98
98
99
Lock writeLock = lock .writeLock ();
@@ -101,27 +102,26 @@ public GridModel refresh(NodeStatus status) {
101
102
AvailabilityAndNode availabilityAndNode = findNode (status .getId ());
102
103
103
104
if (availabilityAndNode == null ) {
104
- return this ;
105
+ return ;
105
106
}
106
107
107
108
// if the node was marked as "down", keep it down until a healthcheck passes:
108
109
// just because the node can hit the event bus doesn't mean it's reachable
109
110
if (DOWN .equals (availabilityAndNode .availability )) {
110
111
nodes (DOWN ).remove (availabilityAndNode .status );
111
112
nodes (DOWN ).add (status );
112
- return this ;
113
113
}
114
114
115
115
// But do trust the node if it tells us it's draining
116
116
nodes (availabilityAndNode .availability ).remove (availabilityAndNode .status );
117
117
nodes (status .getAvailability ()).add (status );
118
- return this ;
119
118
} finally {
120
119
writeLock .unlock ();
121
120
}
122
121
}
123
122
124
- public GridModel touch (NodeId id ) {
123
+ @ Override
124
+ public void touch (NodeId id ) {
125
125
Require .nonNull ("Node ID" , id );
126
126
127
127
Lock writeLock = lock .writeLock ();
@@ -131,30 +131,30 @@ public GridModel touch(NodeId id) {
131
131
if (availabilityAndNode != null ) {
132
132
availabilityAndNode .status .touch ();
133
133
}
134
- return this ;
135
134
} finally {
136
135
writeLock .unlock ();
137
136
}
138
137
}
139
138
140
- public GridModel remove (NodeId id ) {
139
+ @ Override
140
+ public void remove (NodeId id ) {
141
141
Require .nonNull ("Node ID" , id );
142
142
143
143
Lock writeLock = lock .writeLock ();
144
144
writeLock .lock ();
145
145
try {
146
146
AvailabilityAndNode availabilityAndNode = findNode (id );
147
147
if (availabilityAndNode == null ) {
148
- return this ;
148
+ return ;
149
149
}
150
150
151
151
nodes (availabilityAndNode .availability ).remove (availabilityAndNode .status );
152
- return this ;
153
152
} finally {
154
153
writeLock .unlock ();
155
154
}
156
155
}
157
156
157
+ @ Override
158
158
public void purgeDeadNodes () {
159
159
long now = System .currentTimeMillis ();
160
160
Lock writeLock = lock .writeLock ();
@@ -200,6 +200,7 @@ public void purgeDeadNodes() {
200
200
}
201
201
}
202
202
203
+ @ Override
203
204
public Availability setAvailability (NodeId id , Availability availability ) {
204
205
Require .nonNull ("Node ID" , id );
205
206
Require .nonNull ("Availability" , availability );
@@ -232,6 +233,7 @@ public Availability setAvailability(NodeId id, Availability availability) {
232
233
}
233
234
}
234
235
236
+ @ Override
235
237
public boolean reserve (SlotId slotId ) {
236
238
Lock writeLock = lock .writeLock ();
237
239
writeLock .lock ();
@@ -269,6 +271,7 @@ public boolean reserve(SlotId slotId) {
269
271
}
270
272
}
271
273
274
+ @ Override
272
275
public Set <NodeStatus > getSnapshot () {
273
276
Lock readLock = this .lock .readLock ();
274
277
readLock .lock ();
@@ -285,7 +288,7 @@ public Set<NodeStatus> getSnapshot() {
285
288
}
286
289
}
287
290
288
- private Set <NodeStatus > nodes (Availability availability ) {
291
+ public Set <NodeStatus > nodes (Availability availability ) {
289
292
return nodes .computeIfAbsent (availability , ignored -> new HashSet <>());
290
293
}
291
294
@@ -312,7 +315,8 @@ private NodeStatus rewrite(NodeStatus status, Availability availability) {
312
315
status .getOsInfo ());
313
316
}
314
317
315
- private void release (SessionId id ) {
318
+ @ Override
319
+ public void release (SessionId id ) {
316
320
if (id == null ) {
317
321
return ;
318
322
}
@@ -361,6 +365,7 @@ private void reserve(NodeStatus status, Slot slot) {
361
365
amend (UP , status , reserved );
362
366
}
363
367
368
+ @ Override
364
369
public void setSession (SlotId slotId , Session session ) {
365
370
Require .nonNull ("Slot ID" , slotId );
366
371
0 commit comments