Merged branch 'jetty-9.3.x' into 'jetty-9.4.x'.
This commit is contained in:
commit
4d4ecfd5cf
|
@ -53,7 +53,7 @@ public class HttpChannelOverFCGI extends HttpChannel
|
|||
public HttpChannelOverFCGI(Connector connector, HttpConfiguration configuration, EndPoint endPoint, HttpTransport transport)
|
||||
{
|
||||
super(connector, configuration, endPoint, transport);
|
||||
this.dispatcher = new Dispatcher(connector.getExecutor(), this);
|
||||
this.dispatcher = new Dispatcher(connector.getServer().getThreadPool(), this);
|
||||
}
|
||||
|
||||
protected void header(HttpField field)
|
||||
|
|
|
@ -95,20 +95,9 @@ public class HttpChannel implements Runnable, HttpOutput.Interceptor
|
|||
_request = new Request(this, newHttpInput(_state));
|
||||
_response = new Response(this, newHttpOutput());
|
||||
|
||||
if (connector==null)
|
||||
{
|
||||
// Testing mode
|
||||
_executor=null;
|
||||
_requestLog=null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Server server=_connector.getServer();
|
||||
_executor=server.getThreadPool();
|
||||
_requestLog=server.getRequestLog();
|
||||
}
|
||||
_executor = connector == null ? null : connector.getServer().getThreadPool();
|
||||
_requestLog = connector == null ? null : connector.getServer().getRequestLog();
|
||||
|
||||
_requestLog=_connector==null?null:_connector.getServer().getRequestLog();
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("new {} -> {},{},{}",this,_endPoint,_endPoint.getConnection(),_state);
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ import java.nio.ByteBuffer;
|
|||
import java.util.ArrayDeque;
|
||||
import java.util.Deque;
|
||||
import java.util.Objects;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import javax.servlet.ReadListener;
|
||||
|
@ -119,7 +119,9 @@ public class HttpInput extends ServletInputStream implements Runnable
|
|||
|
||||
private void wake()
|
||||
{
|
||||
_channelState.getHttpChannel().getConnector().getExecutor().execute(_channelState.getHttpChannel());
|
||||
HttpChannel channel = _channelState.getHttpChannel();
|
||||
Executor executor = channel.getConnector().getServer().getThreadPool();
|
||||
executor.execute(channel);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -255,10 +255,11 @@ public class LowResourceMonitor extends AbstractLifeCycle
|
|||
String cause="";
|
||||
int connections=0;
|
||||
|
||||
if (_monitorThreads && _server.getThreadPool().isLowOnThreads())
|
||||
ThreadPool serverThreads = _server.getThreadPool();
|
||||
if (_monitorThreads && serverThreads.isLowOnThreads())
|
||||
{
|
||||
reasons=low(reasons,"Low on threads: "+_server.getThreadPool());
|
||||
cause+="T";
|
||||
reasons=low(reasons,"Server low on threads: "+serverThreads);
|
||||
cause+="S";
|
||||
}
|
||||
|
||||
for(Connector connector : getMonitoredOrServerConnectors())
|
||||
|
@ -266,12 +267,12 @@ public class LowResourceMonitor extends AbstractLifeCycle
|
|||
connections+=connector.getConnectedEndPoints().size();
|
||||
|
||||
Executor executor = connector.getExecutor();
|
||||
if (executor instanceof ThreadPool && executor!=_server.getThreadPool())
|
||||
if (executor instanceof ThreadPool && executor!=serverThreads)
|
||||
{
|
||||
ThreadPool threadpool=(ThreadPool) executor;
|
||||
if (_monitorThreads && threadpool.isLowOnThreads())
|
||||
ThreadPool connectorThreads=(ThreadPool)executor;
|
||||
if (_monitorThreads && connectorThreads.isLowOnThreads())
|
||||
{
|
||||
reasons=low(reasons,"Low on threads: "+threadpool);
|
||||
reasons=low(reasons,"Connector low on threads: "+connectorThreads);
|
||||
cause+="T";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ public class ProduceConsume implements ExecutionStrategy, Runnable
|
|||
|
||||
private final Producer _producer;
|
||||
private final Executor _executor;
|
||||
private State _state = State.IDLE;
|
||||
|
||||
public ProduceConsume(Producer producer, Executor executor)
|
||||
{
|
||||
|
@ -44,16 +45,31 @@ public class ProduceConsume implements ExecutionStrategy, Runnable
|
|||
@Override
|
||||
public void execute()
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
_state = _state == State.IDLE ? State.PRODUCE : State.EXECUTE;
|
||||
if (_state == State.EXECUTE)
|
||||
return;
|
||||
}
|
||||
|
||||
// Iterate until we are complete.
|
||||
while (true)
|
||||
{
|
||||
// Produce a task.
|
||||
Runnable task = _producer.produce();
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.debug("{} produced {}", this, task);
|
||||
LOG.debug("{} produced {}", _producer, task);
|
||||
|
||||
if (task == null)
|
||||
break;
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
_state = _state == State.PRODUCE ? State.IDLE : State.PRODUCE;
|
||||
if (_state == State.PRODUCE)
|
||||
continue;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Run the task.
|
||||
task.run();
|
||||
|
@ -80,4 +96,9 @@ public class ProduceConsume implements ExecutionStrategy, Runnable
|
|||
return new ProduceConsume(producer, executor);
|
||||
}
|
||||
}
|
||||
|
||||
private enum State
|
||||
{
|
||||
IDLE, PRODUCE, EXECUTE
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@ public class ProduceExecuteConsume implements ExecutionStrategy
|
|||
|
||||
private final Producer _producer;
|
||||
private final Executor _executor;
|
||||
private State _state = State.IDLE;
|
||||
|
||||
public ProduceExecuteConsume(Producer producer, Executor executor)
|
||||
{
|
||||
|
@ -45,6 +46,13 @@ public class ProduceExecuteConsume implements ExecutionStrategy
|
|||
@Override
|
||||
public void execute()
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
_state = _state == State.IDLE ? State.PRODUCE : State.EXECUTE;
|
||||
if (_state == State.EXECUTE)
|
||||
return;
|
||||
}
|
||||
|
||||
// Iterate until we are complete.
|
||||
while (true)
|
||||
{
|
||||
|
@ -54,7 +62,15 @@ public class ProduceExecuteConsume implements ExecutionStrategy
|
|||
LOG.debug("{} produced {}", _producer, task);
|
||||
|
||||
if (task == null)
|
||||
break;
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
_state = _state == State.PRODUCE ? State.IDLE : State.PRODUCE;
|
||||
if (_state == State.PRODUCE)
|
||||
continue;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Execute the task.
|
||||
try
|
||||
|
@ -94,4 +110,9 @@ public class ProduceExecuteConsume implements ExecutionStrategy
|
|||
return new ProduceExecuteConsume(producer, executor);
|
||||
}
|
||||
}
|
||||
|
||||
private enum State
|
||||
{
|
||||
IDLE, PRODUCE, EXECUTE
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,10 +19,6 @@
|
|||
package org.eclipse.jetty.util.thread.strategy;
|
||||
|
||||
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
@ -36,60 +32,46 @@ import org.junit.Assert;
|
|||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ExecuteProduceRunTest
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
public class ExecuteProduceConsumeTest
|
||||
{
|
||||
private final Runnable NULLTASK = new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
}
|
||||
};
|
||||
private static final Runnable NULLTASK = () -> {};
|
||||
|
||||
|
||||
ExecuteProduceConsume _ewyk;
|
||||
final BlockingQueue<Runnable> _produce = new BlockingArrayQueue<>();
|
||||
final Queue<Runnable> _executions = new ConcurrentArrayQueue<>();
|
||||
volatile Thread _producer;
|
||||
private final BlockingQueue<Runnable> _produce = new BlockingArrayQueue<>();
|
||||
private final Queue<Runnable> _executions = new ConcurrentArrayQueue<>();
|
||||
private ExecuteProduceConsume _ewyk;
|
||||
private volatile Thread _producer;
|
||||
|
||||
@Before
|
||||
public void before()
|
||||
{
|
||||
_executions.clear();
|
||||
|
||||
Producer producer = new Producer()
|
||||
Producer producer = () ->
|
||||
{
|
||||
@Override
|
||||
public Runnable produce()
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
_producer=Thread.currentThread();
|
||||
Runnable task= _produce.take();
|
||||
if (task==NULLTASK)
|
||||
return null;
|
||||
return task;
|
||||
}
|
||||
catch(InterruptedException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
_producer=Thread.currentThread();
|
||||
Runnable task= _produce.take();
|
||||
if (task==NULLTASK)
|
||||
return null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_producer=null;
|
||||
}
|
||||
return task;
|
||||
}
|
||||
catch(InterruptedException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_producer=null;
|
||||
}
|
||||
};
|
||||
|
||||
Executor executor = new Executor()
|
||||
{
|
||||
@Override
|
||||
public void execute(Runnable task)
|
||||
{
|
||||
_executions.add(task);
|
||||
}
|
||||
};
|
||||
Executor executor = _executions::add;
|
||||
|
||||
_ewyk = new ExecuteProduceConsume(producer,executor);
|
||||
}
|
||||
|
@ -123,19 +105,18 @@ public class ExecuteProduceRunTest
|
|||
@Test
|
||||
public void testProduceManyNonBlockingTask()
|
||||
{
|
||||
Task[] t = new Task[10];
|
||||
for (int i=0;i<t.length;i++)
|
||||
Task[] tasks = new Task[10];
|
||||
for (int i=0;i<tasks.length;i++)
|
||||
{
|
||||
t[i]=new Task();
|
||||
_produce.add(t[i]);
|
||||
tasks[i]=new Task();
|
||||
_produce.add(tasks[i]);
|
||||
}
|
||||
_produce.add(NULLTASK);
|
||||
_ewyk.execute();
|
||||
|
||||
for (int i=0;i<t.length;i++)
|
||||
assertThat(t[i].hasRun(),equalTo(true));
|
||||
for (Task task : tasks)
|
||||
assertThat(task.hasRun(), equalTo(true));
|
||||
Assert.assertEquals(_ewyk,_executions.poll());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -331,12 +312,11 @@ public class ExecuteProduceRunTest
|
|||
thread0.join();
|
||||
}
|
||||
|
||||
|
||||
public static class Task implements Runnable
|
||||
private static class Task implements Runnable
|
||||
{
|
||||
final CountDownLatch _block = new CountDownLatch(1);
|
||||
final CountDownLatch _run = new CountDownLatch(1);
|
||||
volatile Thread _thread;
|
||||
private final CountDownLatch _block = new CountDownLatch(1);
|
||||
private final CountDownLatch _run = new CountDownLatch(1);
|
||||
private volatile Thread _thread;
|
||||
|
||||
public Task()
|
||||
{
|
Loading…
Reference in New Issue