|
17 | 17 |
|
18 | 18 | package org.openqa.selenium.grid.sessionqueue.local;
|
19 | 19 |
|
| 20 | +import org.openqa.selenium.concurrent.Regularly; |
20 | 21 | import org.openqa.selenium.events.EventBus;
|
21 | 22 | import org.openqa.selenium.grid.config.Config;
|
22 | 23 | import org.openqa.selenium.grid.data.NewSessionErrorResponse;
|
@@ -73,12 +74,20 @@ public class LocalNewSessionQueue extends NewSessionQueue {
|
73 | 74 | private final ScheduledExecutorService executorService =
|
74 | 75 | Executors.newSingleThreadScheduledExecutor();
|
75 | 76 | private final Thread shutdownHook = new Thread(this::callExecutorShutdown);
|
| 77 | + private final String timedOutErrorMessage = |
| 78 | + String.format( "New session request rejected after being in the queue for more than %s", |
| 79 | + requestTimeout); |
76 | 80 |
|
77 | 81 | public LocalNewSessionQueue(Tracer tracer, EventBus bus, Duration retryInterval,
|
78 | 82 | Duration requestTimeout) {
|
79 | 83 | super(tracer, retryInterval, requestTimeout);
|
80 | 84 | this.bus = Require.nonNull("Event bus", bus);
|
81 | 85 | Runtime.getRuntime().addShutdownHook(shutdownHook);
|
| 86 | + |
| 87 | + Regularly regularly = new Regularly("New Session Queue Clean up"); |
| 88 | + regularly.submit(this::purgeTimedOutRequests, Duration.ofSeconds(60), |
| 89 | + Duration.ofSeconds(30)); |
| 90 | + |
82 | 91 | new JMXHelper().register(this);
|
83 | 92 | }
|
84 | 93 |
|
@@ -194,8 +203,7 @@ private void retryRequest(SessionRequest sessionRequest) {
|
194 | 203 | LOG.log(Level.INFO, "Request {0} timed out", requestId);
|
195 | 204 | sessionRequests.remove(sessionRequest);
|
196 | 205 | bus.fire(new NewSessionRejectedEvent(
|
197 |
| - new NewSessionErrorResponse(requestId, String.format( |
198 |
| - "New session request rejected after being in the queue for more than %s", requestTimeout)))); |
| 206 | + new NewSessionErrorResponse(requestId, timedOutErrorMessage))); |
199 | 207 | } else {
|
200 | 208 | LOG.log(Level.INFO,
|
201 | 209 | "Adding request back to the queue. All slots are busy. Request: {0}",
|
@@ -239,8 +247,7 @@ public Optional<HttpRequest> remove(RequestId id) {
|
239 | 247 | HttpRequest request = httpRequest.get();
|
240 | 248 | if (hasRequestTimedOut(request)) {
|
241 | 249 | bus.fire(new NewSessionRejectedEvent(
|
242 |
| - new NewSessionErrorResponse(id, String.format( |
243 |
| - "New session request rejected after being in the queue for more than %s", requestTimeout)))); |
| 250 | + new NewSessionErrorResponse(id, timedOutErrorMessage))); |
244 | 251 | return Optional.empty();
|
245 | 252 | }
|
246 | 253 | }
|
@@ -272,6 +279,24 @@ public int clear() {
|
272 | 279 | }
|
273 | 280 | }
|
274 | 281 |
|
| 282 | + private void purgeTimedOutRequests() { |
| 283 | + Lock writeLock = lock.writeLock(); |
| 284 | + writeLock.lock(); |
| 285 | + try { |
| 286 | + Iterator<SessionRequest> iterator = sessionRequests.iterator(); |
| 287 | + while (iterator.hasNext()) { |
| 288 | + SessionRequest sessionRequest = iterator.next(); |
| 289 | + if (hasRequestTimedOut(sessionRequest.getHttpRequest())) { |
| 290 | + iterator.remove(); |
| 291 | + bus.fire(new NewSessionRejectedEvent( |
| 292 | + new NewSessionErrorResponse(sessionRequest.getRequestId(), timedOutErrorMessage))); |
| 293 | + } |
| 294 | + } |
| 295 | + } finally { |
| 296 | + writeLock.unlock(); |
| 297 | + } |
| 298 | + } |
| 299 | + |
275 | 300 | public void callExecutorShutdown() {
|
276 | 301 | LOG.info("Shutting down session queue executor service");
|
277 | 302 | executorService.shutdown();
|
|
0 commit comments