Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #5994 - QueuedThreadPool "free" threads #5995

Merged
merged 2 commits into from Feb 24, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -20,8 +20,6 @@

import java.io.Closeable;
import java.io.IOException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
Expand Down Expand Up @@ -51,7 +49,7 @@
public class QueuedThreadPool extends ContainerLifeCycle implements ThreadFactory, SizedThreadPool, Dumpable, TryExecutor
{
private static final Logger LOG = Log.getLogger(QueuedThreadPool.class);
private static Runnable NOOP = () ->
private static final Runnable NOOP = () ->
{
};

Expand Down Expand Up @@ -158,6 +156,7 @@ public void setThreadPoolBudget(ThreadPoolBudget budget)
{
if (budget != null && budget.getSizedThreadPool() != this)
throw new IllegalArgumentException();
updateBean(_budget, budget);
_budget = budget;
}

Expand Down Expand Up @@ -425,16 +424,34 @@ public int getMinThreads()
* @return number of reserved threads or or -1 for heuristically determined
* @see #setReservedThreads
*/
@ManagedAttribute("the number of reserved threads in the pool")
@ManagedAttribute("number of configured reserved threads")
gregw marked this conversation as resolved.
Show resolved Hide resolved
public int getReservedThreads()
{
if (isStarted())
return _reservedThreads;
}

@ManagedAttribute("maximum number of reserved threads")
public int getMaxReservedThreads()
{
TryExecutor tryExecutor = _tryExecutor;
if (tryExecutor instanceof ReservedThreadExecutor)
{
ReservedThreadExecutor reservedThreadExecutor = getBean(ReservedThreadExecutor.class);
if (reservedThreadExecutor != null)
return reservedThreadExecutor.getCapacity();
ReservedThreadExecutor reservedThreadExecutor = (ReservedThreadExecutor)tryExecutor;
return reservedThreadExecutor.getCapacity();
}
return _reservedThreads;
return 0;
}

@ManagedAttribute("number of available reserved threads")
public int getAvailableReservedThreads()
gregw marked this conversation as resolved.
Show resolved Hide resolved
{
TryExecutor tryExecutor = _tryExecutor;
if (tryExecutor instanceof ReservedThreadExecutor)
{
ReservedThreadExecutor reservedThreadExecutor = (ReservedThreadExecutor)tryExecutor;
return reservedThreadExecutor.getAvailable();
}
return 0;
}

/**
Expand Down Expand Up @@ -604,8 +621,26 @@ public int getIdleThreads()
@ManagedAttribute("number of busy threads in the pool")
public int getBusyThreads()
{
int reserved = _tryExecutor instanceof ReservedThreadExecutor ? ((ReservedThreadExecutor)_tryExecutor).getAvailable() : 0;
return getThreads() - getIdleThreads() - reserved;
return getThreads() - getIdleThreads() - getAvailableReservedThreads();
}

@ManagedAttribute("number of potentially available threads in the pool")
public int getAvailableThreads()
{
return getMaxThreads() - getBusyThreads();
}

@ManagedAttribute("number of currently available threads in the pool")
public int getReadyThreads()
{
return getThreads() - getBusyThreads();
}

@ManagedAttribute("number of threads leased to components")
public int getLeasedThreads()
{
ThreadPoolBudget budget = _budget;
return budget == null ? 0 : budget.getLeasedThreads();
}

/**
Expand Down
Expand Up @@ -24,6 +24,8 @@
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;

import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;

Expand All @@ -32,9 +34,10 @@
*
* @see ThreadPool.SizedThreadPool#getThreadPoolBudget()
*/
@ManagedObject
public class ThreadPoolBudget
{
static final Logger LOG = Log.getLogger(ThreadPoolBudget.class);
private static final Logger LOG = Log.getLogger(ThreadPoolBudget.class);

public interface Lease extends Closeable
{
Expand Down Expand Up @@ -115,6 +118,14 @@ public ThreadPool.SizedThreadPool getSizedThreadPool()
return pool;
}

@ManagedAttribute("the number of threads leased to components")
public int getLeasedThreads()
{
return leases.stream()
.mapToInt(Lease::getThreads)
.sum();
}

public void reset()
{
leases.clear();
Expand Down Expand Up @@ -146,9 +157,7 @@ public Lease leaseTo(Object leasee, int threads)
*/
public boolean check(int maxThreads) throws IllegalStateException
{
int required = leases.stream()
.mapToInt(Lease::getThreads)
.sum();
int required = getLeasedThreads();
int left = maxThreads - required;
if (left <= 0)
{
Expand Down