From 069550ce35270cd3e308f102178a17e18eb700a6 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Fri, 23 Jul 2021 16:46:00 +1000 Subject: [PATCH] Alternative "fix" for #6495 Remember last time we hit zero reserved threads --- .../jetty/util/thread/ReservedThreadExecutor.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ReservedThreadExecutor.java b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ReservedThreadExecutor.java index f2b41c68f6e3..1b214d3c5bd1 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ReservedThreadExecutor.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ReservedThreadExecutor.java @@ -68,6 +68,7 @@ public String toString() private ThreadPoolBudget.Lease _lease; private long _idleTime = 1L; private TimeUnit _idleTimeUnit = TimeUnit.MINUTES; + private volatile long _lastZero = Long.MAX_VALUE; /** * @param executor The executor to use to obtain threads @@ -226,6 +227,8 @@ private void startReservedThread() if (size == Integer.MAX_VALUE || pending + size >= _capacity) return; + if (size == 0) + _lastZero = System.nanoTime(); if (!_count.compareAndSet(count, pending + 1, size)) continue; if (LOG.isDebugEnabled()) @@ -320,13 +323,14 @@ public void run() // reduce pending if this thread was pending int pending = AtomicBiInteger.getHi(count) - (state == State.PENDING ? 1 : 0); - - // increment size if not stopped nor surplus to capacity? int size = AtomicBiInteger.getLo(count); - if (size < _capacity) - size++; - else + + // Exit if excess capacity or it has been too long since we hit zero reserved threads? + if (size >= _capacity || + size > 0 && _idleTime > 0 && _idleTimeUnit.toNanos(_idleTime) < (_lastZero - System.nanoTime()) && _state.compareAndSet(state, State.IDLED_OUT)) exit = true; + else + size++; // Update count for pending and size if (!_count.compareAndSet(count, pending, size))