Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2013-11-04 05:16:54 +0000
committerGreg Wilkins2013-11-04 05:16:54 +0000
commit74272663e6c2af40b81789a9401ed41a53a62596 (patch)
tree9d729ef81ba371ca8999e19cdbcef37d59c449bc /jetty-server
parentf567bddad931094157496dda77d3e952603bd99e (diff)
downloadorg.eclipse.jetty.project-74272663e6c2af40b81789a9401ed41a53a62596.tar.gz
org.eclipse.jetty.project-74272663e6c2af40b81789a9401ed41a53a62596.tar.xz
org.eclipse.jetty.project-74272663e6c2af40b81789a9401ed41a53a62596.zip
420359 - Support 0 acceptors for ServerConnector
Diffstat (limited to 'jetty-server')
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java2
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java8
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/Server.java39
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java56
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/SelectChannelServerTest.java3
5 files changed, 76 insertions, 32 deletions
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java
index 0747b01c52..aeb54b472f 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java
@@ -189,7 +189,7 @@ public abstract class AbstractConnector extends ContainerLifeCycle implements Co
for (ConnectionFactory factory:factories)
addConnectionFactory(factory);
- if (acceptors<=0)
+ if (acceptors<0)
acceptors=Math.max(1,(Runtime.getRuntime().availableProcessors()) / 2);
if (acceptors > 2 * Runtime.getRuntime().availableProcessors())
LOG.warn("Acceptors should be <= 2*availableProcessors: " + this);
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java
index e336cb34ac..3dc634b1cd 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java
@@ -47,22 +47,22 @@ public class LocalConnector extends AbstractConnector
public LocalConnector(Server server)
{
- this(server, null, null, null, 0, new HttpConnectionFactory());
+ this(server, null, null, null, -1, new HttpConnectionFactory());
}
public LocalConnector(Server server, SslContextFactory sslContextFactory)
{
- this(server, null, null, null, 0,AbstractConnectionFactory.getFactories(sslContextFactory,new HttpConnectionFactory()));
+ this(server, null, null, null, -1,AbstractConnectionFactory.getFactories(sslContextFactory,new HttpConnectionFactory()));
}
public LocalConnector(Server server, ConnectionFactory connectionFactory)
{
- this(server, null, null, null, 0, connectionFactory);
+ this(server, null, null, null, -1, connectionFactory);
}
public LocalConnector(Server server, ConnectionFactory connectionFactory, SslContextFactory sslContextFactory)
{
- this(server, null, null, null, 0, AbstractConnectionFactory.getFactories(sslContextFactory,connectionFactory));
+ this(server, null, null, null, -1, AbstractConnectionFactory.getFactories(sslContextFactory,connectionFactory));
}
@Override
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java
index 40293b210b..45563e61f9 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java
@@ -61,6 +61,7 @@ import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.util.thread.ShutdownThread;
import org.eclipse.jetty.util.thread.ThreadPool;
+import org.eclipse.jetty.util.thread.ThreadPool.SizedThreadPool;
/* ------------------------------------------------------------ */
/** Jetty HTTP Servlet Server.
@@ -300,6 +301,24 @@ public class Server extends HandlerWrapper implements Attributes
HttpGenerator.setJettyVersion(HttpConfiguration.SERVER_VERSION);
MultiException mex=new MultiException();
+ // check size of thread pool
+ SizedThreadPool pool = getBean(SizedThreadPool.class);
+ int max=pool==null?-1:pool.getMaxThreads();
+ int needed=1;
+ if (mex.size()==0)
+ {
+ for (Connector connector : _connectors)
+ {
+ if (connector instanceof AbstractConnector)
+ needed+=((AbstractConnector)connector).getAcceptors();
+ if (connector instanceof ServerConnector)
+ needed+=((ServerConnector)connector).getSelectorManager().getSelectorCount();
+ }
+ }
+
+ if (max>0 && needed>=max)
+ throw new IllegalStateException("Insufficient max threads in ThreadPool: max="+max+" < needed="+needed);
+
try
{
super.doStart();
@@ -309,21 +328,19 @@ public class Server extends HandlerWrapper implements Attributes
mex.add(e);
}
- if (mex.size()==0)
+ // start connectors last
+ for (Connector connector : _connectors)
{
- for (Connector _connector : _connectors)
+ try
+ {
+ connector.start();
+ }
+ catch(Throwable e)
{
- try
- {
- _connector.start();
- }
- catch (Throwable e)
- {
- mex.add(e);
- }
+ mex.add(e);
}
}
-
+
if (isDumpAfterStart())
dumpStdErr();
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java
index 7fedc13f42..c6d3977a96 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java
@@ -96,7 +96,7 @@ public class ServerConnector extends AbstractNetworkConnector
public ServerConnector(
@Name("server") Server server)
{
- this(server,null,null,null,0,0,new HttpConnectionFactory());
+ this(server,null,null,null,-1,-1,new HttpConnectionFactory());
}
/* ------------------------------------------------------------ */
@@ -104,9 +104,10 @@ public class ServerConnector extends AbstractNetworkConnector
* <p>Construct a ServerConnector with a private instance of {@link HttpConnectionFactory} as the only factory.</p>
* @param server The {@link Server} this connector will accept connection for.
* @param acceptors
- * the number of acceptor threads to use, or 0 for a default value. Acceptors accept new TCP/IP connections.
+ * the number of acceptor threads to use, or -1 for a default value. Acceptors accept new TCP/IP connections. If 0, then
+ * the selector threads are used to accept connections.
* @param selectors
- * the number of selector threads, or 0 for a default value. Selectors notice and schedule established connection that can make IO progress.
+ * the number of selector threads, or -1 for a default value. Selectors notice and schedule established connection that can make IO progress.
*/
public ServerConnector(
@Name("server") Server server,
@@ -126,7 +127,7 @@ public class ServerConnector extends AbstractNetworkConnector
@Name("server") Server server,
@Name("factories") ConnectionFactory... factories)
{
- this(server,null,null,null,0,0,factories);
+ this(server,null,null,null,-1,-1,factories);
}
/* ------------------------------------------------------------ */
@@ -140,7 +141,7 @@ public class ServerConnector extends AbstractNetworkConnector
@Name("server") Server server,
@Name("sslContextFactory") SslContextFactory sslContextFactory)
{
- this(server,null,null,null,0,0,AbstractConnectionFactory.getFactories(sslContextFactory,new HttpConnectionFactory()));
+ this(server,null,null,null,-1,-1,AbstractConnectionFactory.getFactories(sslContextFactory,new HttpConnectionFactory()));
}
/* ------------------------------------------------------------ */
@@ -150,9 +151,10 @@ public class ServerConnector extends AbstractNetworkConnector
* @param sslContextFactory If non null, then a {@link SslConnectionFactory} is instantiated and prepended to the
* list of HTTP Connection Factory.
* @param acceptors
- * the number of acceptor threads to use, or 0 for a default value. Acceptors accept new TCP/IP connections.
+ * the number of acceptor threads to use, or -1 for a default value. Acceptors accept new TCP/IP connections. If 0, then
+ * the selector threads are used to accept connections.
* @param selectors
- * the number of selector threads, or 0 for a default value. Selectors notice and schedule established connection that can make IO progress.
+ * the number of selector threads, or -1 for a default value. Selectors notice and schedule established connection that can make IO progress.
*/
public ServerConnector(
@Name("server") Server server,
@@ -175,7 +177,7 @@ public class ServerConnector extends AbstractNetworkConnector
@Name("sslContextFactory") SslContextFactory sslContextFactory,
@Name("factories") ConnectionFactory... factories)
{
- this(server,null,null,null,0,0,AbstractConnectionFactory.getFactories(sslContextFactory,factories));
+ this(server,null,null,null,-1,-1,AbstractConnectionFactory.getFactories(sslContextFactory,factories));
}
/** Generic Server Connection.
@@ -189,9 +191,10 @@ public class ServerConnector extends AbstractNetworkConnector
* @param bufferPool
* A ByteBuffer pool used to allocate buffers. If null then create a private pool with default configuration.
* @param acceptors
- * the number of acceptor threads to use, or 0 for a default value. Acceptors accept new TCP/IP connections.
+ * the number of acceptor threads to use, or -1 for a default value. Acceptors accept new TCP/IP connections. If 0, then
+ * the selector threads are used to accept connections.
* @param selectors
- * the number of selector threads, or 0 for a default value. Selectors notice and schedule established connection that can make IO progress.
+ * the number of selector threads, or -1 for a default value. Selectors notice and schedule established connection that can make IO progress.
* @param factories
* Zero or more {@link ConnectionFactory} instances used to create and configure connections.
*/
@@ -205,11 +208,23 @@ public class ServerConnector extends AbstractNetworkConnector
@Name("factories") ConnectionFactory... factories)
{
super(server,executor,scheduler,bufferPool,acceptors,factories);
- _manager = new ServerConnectorManager(getExecutor(), getScheduler(), selectors > 0 ? selectors : Runtime.getRuntime().availableProcessors());
+ _manager = new ServerConnectorManager(getExecutor(), getScheduler(), selectors >= 0 ? selectors : Runtime.getRuntime().availableProcessors());
addBean(_manager, true);
}
@Override
+ protected void doStart() throws Exception
+ {
+ super.doStart();
+
+ if (getAcceptors()==0)
+ {
+ _acceptChannel.configureBlocking(false);
+ _manager.acceptor(_acceptChannel);
+ }
+ }
+
+ @Override
public boolean isOpen()
{
ServerSocketChannel channel = _acceptChannel;
@@ -319,12 +334,17 @@ public class ServerConnector extends AbstractNetworkConnector
if (serverChannel != null && serverChannel.isOpen())
{
SocketChannel channel = serverChannel.accept();
- channel.configureBlocking(false);
- Socket socket = channel.socket();
- configure(socket);
- _manager.accept(channel);
+ accepted(channel);
}
}
+
+ private void accepted(SocketChannel channel) throws IOException
+ {
+ channel.configureBlocking(false);
+ Socket socket = channel.socket();
+ configure(socket);
+ _manager.accept(channel);
+ }
protected void configure(Socket socket)
{
@@ -427,6 +447,12 @@ public class ServerConnector extends AbstractNetworkConnector
}
@Override
+ protected void accepted(SocketChannel channel) throws IOException
+ {
+ ServerConnector.this.accepted(channel);
+ }
+
+ @Override
protected SelectChannelEndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey selectionKey) throws IOException
{
return ServerConnector.this.newEndPoint(channel, selectSet, selectionKey);
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/SelectChannelServerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/SelectChannelServerTest.java
index 396a60d907..b23c355d39 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/SelectChannelServerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/SelectChannelServerTest.java
@@ -28,6 +28,7 @@ public class SelectChannelServerTest extends HttpServerTestBase
@Before
public void init() throws Exception
{
- startServer(new ServerConnector(_server,1,1));
+ // Run this test with 0 acceptors. Other tests already check the acceptors >0
+ startServer(new ServerConnector(_server,0,1));
}
}

Back to the top