From 0471fe03a1ee027753987d1857fb9f26a1aefee8 Mon Sep 17 00:00:00 2001 From: Ludovic Orban Date: Wed, 15 Jun 2022 16:16:02 +0200 Subject: [PATCH] #8161 make RetainableByteBufferPool a 1st class citizen in the API Signed-off-by: Ludovic Orban --- .../client/ClientConnectorDocs.java | 3 +- .../org/eclipse/jetty/client/HttpClient.java | 10 +++++- .../client/http/HttpReceiverOverHTTP.java | 2 +- .../jetty/client/HttpClientTLSTest.java | 30 ++++++++-------- .../jetty/client/ssl/SslBytesServerTest.java | 2 +- .../jetty/client/ssl/SslConnectionTest.java | 5 ++- .../client/http/HttpConnectionOverFCGI.java | 2 +- .../fcgi/server/ServerFCGIConnection.java | 2 +- .../jetty/http2/client/HTTP2Client.java | 8 ++++- .../client/HTTP2ClientConnectionFactory.java | 2 +- .../AbstractHTTP2ServerConnectionFactory.java | 2 +- .../internal/ClientHTTP3StreamConnection.java | 2 +- .../http3/internal/HTTP3StreamConnection.java | 5 ++- .../http3/server/HTTP3ServerConnector.java | 10 ++++-- .../internal/ServerHTTP3StreamConnection.java | 2 +- .../org/eclipse/jetty/io/ClientConnector.java | 16 +++++++++ .../io/ssl/SslClientConnectionFactory.java | 15 ++++++-- .../eclipse/jetty/io/ssl/SslConnection.java | 10 ++---- .../jetty/io/SocketChannelEndPointTest.java | 3 +- .../eclipse/jetty/io/SslConnectionTest.java | 3 +- .../maven/plugin/MavenServerConnector.java | 7 ++++ .../quic/client/ClientQuicConnection.java | 4 +-- .../jetty/quic/client/ClientQuicSession.java | 5 +-- .../jetty/quic/common/QuicConnection.java | 10 +++++- .../jetty/quic/common/QuicSession.java | 10 +++++- .../quic/server/QuicServerConnector.java | 7 ++-- .../quic/server/ServerQuicConnection.java | 4 +-- .../jetty/quic/server/ServerQuicSession.java | 5 +-- .../SpnegoAuthenticatorTest.java | 2 +- .../jetty/server/AbstractConnector.java | 36 +++++++++++++++++-- .../server/AbstractNetworkConnector.java | 8 ++++- .../org/eclipse/jetty/server/Connector.java | 9 +++++ .../eclipse/jetty/server/HttpConnection.java | 2 +- .../eclipse/jetty/server/LocalConnector.java | 26 ++++++++------ .../server/NetworkTrafficServerConnector.java | 8 ++++- .../eclipse/jetty/server/ServerConnector.java | 28 ++++++++++++++- .../jetty/server/SslConnectionFactory.java | 2 +- .../eclipse/jetty/server/MockConnector.java | 2 +- .../jetty/server/ProxyConnectionTest.java | 2 +- .../eclipse/jetty/server/ResponseTest.java | 2 +- .../jetty/server/ssl/SSLEngineTest.java | 2 +- .../jetty/servlet/CacheControlHeaderTest.java | 2 +- .../servlet/ComplianceViolations2616Test.java | 2 +- .../server/UnixDomainServerConnector.java | 8 ++++- .../server/UnixSocketConnector.java | 2 +- .../core/client/CoreClientUpgradeRequest.java | 2 +- .../websocket/core/WebSocketComponents.java | 23 +++++++----- .../server/WebSocketServerComponents.java | 19 ++++++---- .../server/internal/RFC6455Handshaker.java | 2 +- .../server/internal/RFC8441Handshaker.java | 2 +- .../jetty/http/client/HttpClientLoadTest.java | 5 ++- .../http/client/HttpClientTimeoutTest.java | 7 ++-- 52 files changed, 283 insertions(+), 106 deletions(-) diff --git a/documentation/jetty-documentation/src/main/java/org/eclipse/jetty/docs/programming/client/ClientConnectorDocs.java b/documentation/jetty-documentation/src/main/java/org/eclipse/jetty/docs/programming/client/ClientConnectorDocs.java index e75148d384b4..8dec978bd9ac 100644 --- a/documentation/jetty-documentation/src/main/java/org/eclipse/jetty/docs/programming/client/ClientConnectorDocs.java +++ b/documentation/jetty-documentation/src/main/java/org/eclipse/jetty/docs/programming/client/ClientConnectorDocs.java @@ -387,7 +387,8 @@ public void writeLine(String line, Callback callback) // Wrap the "telnet" ClientConnectionFactory with the SslClientConnectionFactory. connectionFactory = new SslClientConnectionFactory(clientConnector.getSslContextFactory(), - clientConnector.getByteBufferPool(), clientConnector.getExecutor(), connectionFactory); + clientConnector.getByteBufferPool(), clientConnector.getRetainableByteBufferPool(), + clientConnector.getExecutor(), connectionFactory); // We will obtain a SslConnection now. CompletableFuture connectionPromise = new Promise.Completable<>(); diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java index 93c5ea5c3ee2..4dafede59d73 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java @@ -627,6 +627,14 @@ public ByteBufferPool getByteBufferPool() return connector.getByteBufferPool(); } + /** + * @return the {@link RetainableByteBufferPool} of this HttpClient + */ + public RetainableByteBufferPool getRetainableByteBufferPool() + { + return connector.getRetainableByteBufferPool(); + } + /** * @param byteBufferPool the {@link ByteBufferPool} of this HttpClient */ @@ -1157,7 +1165,7 @@ protected ClientConnectionFactory newSslClientConnectionFactory(SslContextFactor { if (sslContextFactory == null) sslContextFactory = getSslContextFactory(); - return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getExecutor(), connectionFactory); + return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getRetainableByteBufferPool(), getExecutor(), connectionFactory); } private class ContentDecoderFactorySet implements Set diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java index b54115ea365d..574a05b27f8d 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpReceiverOverHTTP.java @@ -64,7 +64,7 @@ public HttpReceiverOverHTTP(HttpChannelOverHTTP channel) parser.setHeaderCacheCaseSensitive(httpTransport.isHeaderCacheCaseSensitive()); } - this.retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(httpClient, httpClient.getByteBufferPool()); + this.retainableByteBufferPool = httpClient.getRetainableByteBufferPool(); } @Override diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTLSTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTLSTest.java index e4d5358cf78d..c90ea1d82d3a 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTLSTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTLSTest.java @@ -633,7 +633,7 @@ public void testNeverUsedConnectionThenServerIdleTimeout() throws Exception @Override protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) + return new SslConnection(connector.getRetainableByteBufferPool(), connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) { @Override protected int networkFill(ByteBuffer input) throws IOException @@ -667,12 +667,12 @@ protected ClientConnectionFactory newSslClientConnectionFactory(SslContextFactor { if (sslContextFactory == null) sslContextFactory = getSslContextFactory(); - return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getExecutor(), connectionFactory) + return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getRetainableByteBufferPool(), getExecutor(), connectionFactory) { @Override - protected SslConnection newSslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) + protected SslConnection newSslConnection(RetainableByteBufferPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(byteBufferPool, executor, endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) + return new SslConnection(retainableByteBufferPool, byteBufferPool, executor, endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) { @Override protected int networkFill(ByteBuffer input) throws IOException @@ -1017,7 +1017,7 @@ public void testNeverUsedConnectionThenClientIdleTimeout() throws Exception @Override protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) + return new SslConnection(connector.getRetainableByteBufferPool(), connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) { @Override protected int networkFill(ByteBuffer input) throws IOException @@ -1052,12 +1052,12 @@ protected ClientConnectionFactory newSslClientConnectionFactory(SslContextFactor { if (sslContextFactory == null) sslContextFactory = getSslContextFactory(); - return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getExecutor(), connectionFactory) + return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getRetainableByteBufferPool(), getExecutor(), connectionFactory) { @Override - protected SslConnection newSslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) + protected SslConnection newSslConnection(RetainableByteBufferPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(byteBufferPool, executor, endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) + return new SslConnection(retainableByteBufferPool, byteBufferPool, executor, endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) { @Override protected int networkFill(ByteBuffer input) throws IOException @@ -1114,12 +1114,12 @@ protected ClientConnectionFactory newSslClientConnectionFactory(SslContextFactor { if (sslContextFactory == null) sslContextFactory = getSslContextFactory(); - return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getExecutor(), connectionFactory) + return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getRetainableByteBufferPool(), getExecutor(), connectionFactory) { @Override - protected SslConnection newSslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) + protected SslConnection newSslConnection(RetainableByteBufferPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(byteBufferPool, executor, endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) + return new SslConnection(retainableByteBufferPool, byteBufferPool, executor, endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) { @Override protected SSLEngineResult wrap(SSLEngine sslEngine, ByteBuffer[] input, ByteBuffer output) throws SSLException @@ -1158,7 +1158,7 @@ public void testTLSLargeFragments() throws Exception @Override protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) + return new SslConnection(connector.getRetainableByteBufferPool(), connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) { @Override protected SSLEngineResult unwrap(SSLEngine sslEngine, ByteBuffer input, ByteBuffer output) throws SSLException @@ -1194,12 +1194,12 @@ protected ClientConnectionFactory newSslClientConnectionFactory(SslContextFactor { if (sslContextFactory == null) sslContextFactory = getSslContextFactory(); - return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getExecutor(), connectionFactory) + return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getRetainableByteBufferPool(), getExecutor(), connectionFactory) { @Override - protected SslConnection newSslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) + protected SslConnection newSslConnection(RetainableByteBufferPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(byteBufferPool, executor, endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) + return new SslConnection(retainableByteBufferPool, byteBufferPool, executor, endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) { @Override protected SSLEngineResult wrap(SSLEngine sslEngine, ByteBuffer[] input, ByteBuffer output) throws SSLException diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesServerTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesServerTest.java index 76af5814b82c..e848245810fc 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesServerTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesServerTest.java @@ -157,7 +157,7 @@ protected boolean onReadTimeout(Throwable timeout) @Override protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine) + return new SslConnection(connector.getRetainableByteBufferPool(), connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine) { @Override protected DecryptedEndPoint newDecryptedEndPoint() diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslConnectionTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslConnectionTest.java index b519f1af452e..fbb10d7b2436 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslConnectionTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslConnectionTest.java @@ -19,10 +19,12 @@ import javax.net.ssl.SSLHandshakeException; import org.eclipse.jetty.io.AbstractConnection; +import org.eclipse.jetty.io.ArrayRetainableByteBufferPool; import org.eclipse.jetty.io.ByteArrayEndPoint; import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.io.MappedByteBufferPool; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.io.ssl.SslConnection; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.util.BufferUtil; @@ -44,12 +46,13 @@ public void testSslConnectionClosedBeforeFill() throws Exception sslContextFactory.start(); ByteBufferPool byteBufferPool = new MappedByteBufferPool(); + RetainableByteBufferPool retainableByteBufferPool = new ArrayRetainableByteBufferPool(); QueuedThreadPool threadPool = new QueuedThreadPool(); threadPool.start(); ByteArrayEndPoint endPoint = new ByteArrayEndPoint(); SSLEngine sslEngine = sslContextFactory.newSSLEngine(); sslEngine.setUseClientMode(false); - SslConnection sslConnection = new SslConnection(byteBufferPool, threadPool, endPoint, sslEngine); + SslConnection sslConnection = new SslConnection(retainableByteBufferPool, byteBufferPool, threadPool, endPoint, sslEngine); EndPoint sslEndPoint = sslConnection.getDecryptedEndPoint(); sslEndPoint.setConnection(new AbstractConnection(sslEndPoint, threadPool) { diff --git a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java index 796483ef5ff5..59da3455bcf8 100644 --- a/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java +++ b/jetty-fcgi/fcgi-client/src/main/java/org/eclipse/jetty/fcgi/client/http/HttpConnectionOverFCGI.java @@ -79,7 +79,7 @@ public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, Pr this.parser = new ClientParser(new ResponseListener()); requests.addLast(0); HttpClient client = destination.getHttpClient(); - this.networkByteBufferPool = RetainableByteBufferPool.findOrAdapt(client, client.getByteBufferPool()); + this.networkByteBufferPool = client.getRetainableByteBufferPool(); } public HttpDestination getHttpDestination() diff --git a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/ServerFCGIConnection.java b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/ServerFCGIConnection.java index 8c31d1e0a527..4a9579689311 100644 --- a/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/ServerFCGIConnection.java +++ b/jetty-fcgi/fcgi-server/src/main/java/org/eclipse/jetty/fcgi/server/ServerFCGIConnection.java @@ -50,7 +50,7 @@ public ServerFCGIConnection(Connector connector, EndPoint endPoint, HttpConfigur { super(endPoint, connector.getExecutor()); this.connector = connector; - this.networkByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, connector.getByteBufferPool()); + this.networkByteBufferPool = connector.getRetainableByteBufferPool(); this.flusher = new Flusher(endPoint); this.configuration = configuration; this.sendStatus200 = sendStatus200; diff --git a/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2Client.java b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2Client.java index 93cdebf12865..6185317814dc 100644 --- a/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2Client.java +++ b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2Client.java @@ -31,6 +31,7 @@ import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.ClientConnectionFactory; import org.eclipse.jetty.io.ClientConnector; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.io.ssl.SslClientConnectionFactory; import org.eclipse.jetty.util.Promise; import org.eclipse.jetty.util.annotation.ManagedAttribute; @@ -158,6 +159,11 @@ public ByteBufferPool getByteBufferPool() return connector.getByteBufferPool(); } + public RetainableByteBufferPool getRetainableByteBufferPool() + { + return connector.getRetainableByteBufferPool(); + } + public void setByteBufferPool(ByteBufferPool bufferPool) { connector.setByteBufferPool(bufferPool); @@ -437,7 +443,7 @@ private ClientConnectionFactory newClientConnectionFactory(SslContextFactory ssl { if (isUseALPN()) factory = new ALPNClientConnectionFactory(getExecutor(), factory, getProtocols()); - factory = new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getExecutor(), factory); + factory = new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getRetainableByteBufferPool(), getExecutor(), factory); } return factory; } diff --git a/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientConnectionFactory.java b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientConnectionFactory.java index d8ac8861dd4f..8386410022a0 100644 --- a/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientConnectionFactory.java +++ b/jetty-http2/http2-client/src/main/java/org/eclipse/jetty/http2/client/HTTP2ClientConnectionFactory.java @@ -68,7 +68,7 @@ public Connection newConnection(EndPoint endPoint, Map context) parser.setMaxFrameLength(client.getMaxFrameLength()); parser.setMaxSettingsKeys(client.getMaxSettingsKeys()); - RetainableByteBufferPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(client, byteBufferPool); + RetainableByteBufferPool retainableByteBufferPool = client.getRetainableByteBufferPool(); HTTP2ClientConnection connection = new HTTP2ClientConnection(client, retainableByteBufferPool, executor, endPoint, parser, session, client.getInputBufferSize(), promise, listener); diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/AbstractHTTP2ServerConnectionFactory.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/AbstractHTTP2ServerConnectionFactory.java index ae180edf9e12..ab4886328732 100644 --- a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/AbstractHTTP2ServerConnectionFactory.java +++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/AbstractHTTP2ServerConnectionFactory.java @@ -280,7 +280,7 @@ public Connection newConnection(Connector connector, EndPoint endPoint) parser.setMaxFrameLength(getMaxFrameLength()); parser.setMaxSettingsKeys(getMaxSettingsKeys()); - RetainableByteBufferPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, connector.getByteBufferPool()); + RetainableByteBufferPool retainableByteBufferPool = connector.getRetainableByteBufferPool(); HTTP2Connection connection = new HTTP2ServerConnection(retainableByteBufferPool, connector.getExecutor(), endPoint, httpConfiguration, parser, session, getInputBufferSize(), listener); diff --git a/jetty-http3/http3-client/src/main/java/org/eclipse/jetty/http3/client/internal/ClientHTTP3StreamConnection.java b/jetty-http3/http3-client/src/main/java/org/eclipse/jetty/http3/client/internal/ClientHTTP3StreamConnection.java index 4ea7f4c93dc0..0f1e962ebd57 100644 --- a/jetty-http3/http3-client/src/main/java/org/eclipse/jetty/http3/client/internal/ClientHTTP3StreamConnection.java +++ b/jetty-http3/http3-client/src/main/java/org/eclipse/jetty/http3/client/internal/ClientHTTP3StreamConnection.java @@ -23,7 +23,7 @@ public class ClientHTTP3StreamConnection extends HTTP3StreamConnection public ClientHTTP3StreamConnection(QuicStreamEndPoint endPoint, ClientHTTP3Session session, MessageParser parser) { - super(endPoint, session.getQuicSession().getExecutor(), session.getQuicSession().getByteBufferPool(), parser); + super(endPoint, session.getQuicSession().getExecutor(), session.getQuicSession().getRetainableByteBufferPool(), parser); this.session = session; } diff --git a/jetty-http3/http3-common/src/main/java/org/eclipse/jetty/http3/internal/HTTP3StreamConnection.java b/jetty-http3/http3-common/src/main/java/org/eclipse/jetty/http3/internal/HTTP3StreamConnection.java index d7d3de5e3df7..fb916775abae 100644 --- a/jetty-http3/http3-common/src/main/java/org/eclipse/jetty/http3/internal/HTTP3StreamConnection.java +++ b/jetty-http3/http3-common/src/main/java/org/eclipse/jetty/http3/internal/HTTP3StreamConnection.java @@ -26,7 +26,6 @@ import org.eclipse.jetty.http3.internal.parser.MessageParser; import org.eclipse.jetty.http3.internal.parser.ParserListener; import org.eclipse.jetty.io.AbstractConnection; -import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.RetainableByteBuffer; import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.quic.common.QuicStreamEndPoint; @@ -54,10 +53,10 @@ public abstract class HTTP3StreamConnection extends AbstractConnection private boolean noData; private boolean remotelyClosed; - public HTTP3StreamConnection(QuicStreamEndPoint endPoint, Executor executor, ByteBufferPool byteBufferPool, MessageParser parser) + public HTTP3StreamConnection(QuicStreamEndPoint endPoint, Executor executor, RetainableByteBufferPool retainableByteBufferPool, MessageParser parser) { super(endPoint, executor); - this.buffers = RetainableByteBufferPool.findOrAdapt(null, byteBufferPool); + this.buffers = retainableByteBufferPool; this.parser = parser; parser.init(MessageListener::new); } diff --git a/jetty-http3/http3-server/src/main/java/org/eclipse/jetty/http3/server/HTTP3ServerConnector.java b/jetty-http3/http3-server/src/main/java/org/eclipse/jetty/http3/server/HTTP3ServerConnector.java index b8aa6230be2f..15ab8d8bc8b3 100644 --- a/jetty-http3/http3-server/src/main/java/org/eclipse/jetty/http3/server/HTTP3ServerConnector.java +++ b/jetty-http3/http3-server/src/main/java/org/eclipse/jetty/http3/server/HTTP3ServerConnector.java @@ -19,6 +19,7 @@ import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.PreEncodedHttpField; import org.eclipse.jetty.io.ByteBufferPool; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.quic.server.QuicServerConnector; import org.eclipse.jetty.server.ConnectionFactory; import org.eclipse.jetty.server.Server; @@ -41,12 +42,17 @@ public class HTTP3ServerConnector extends QuicServerConnector public HTTP3ServerConnector(Server server, SslContextFactory.Server sslContextFactory, ConnectionFactory... factories) { - this(server, null, null, null, sslContextFactory, factories); + this(server, null, null, null, null, sslContextFactory, factories); } public HTTP3ServerConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool bufferPool, SslContextFactory.Server sslContextFactory, ConnectionFactory... factories) { - super(server, executor, scheduler, bufferPool, sslContextFactory, factories); + this(server, executor, scheduler, bufferPool, null, sslContextFactory, factories); + } + + public HTTP3ServerConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool bufferPool, RetainableByteBufferPool retainableBufferPool, SslContextFactory.Server sslContextFactory, ConnectionFactory... factories) + { + super(server, executor, scheduler, bufferPool, retainableBufferPool, sslContextFactory, factories); // Max concurrent streams that a client can open. getQuicConfiguration().setMaxBidirectionalRemoteStreams(128); // HTTP/3 requires a few mandatory unidirectional streams. diff --git a/jetty-http3/http3-server/src/main/java/org/eclipse/jetty/http3/server/internal/ServerHTTP3StreamConnection.java b/jetty-http3/http3-server/src/main/java/org/eclipse/jetty/http3/server/internal/ServerHTTP3StreamConnection.java index 51f1403a2aac..a54dc1936696 100644 --- a/jetty-http3/http3-server/src/main/java/org/eclipse/jetty/http3/server/internal/ServerHTTP3StreamConnection.java +++ b/jetty-http3/http3-server/src/main/java/org/eclipse/jetty/http3/server/internal/ServerHTTP3StreamConnection.java @@ -31,7 +31,7 @@ public class ServerHTTP3StreamConnection extends HTTP3StreamConnection public ServerHTTP3StreamConnection(Connector connector, HttpConfiguration httpConfiguration, QuicStreamEndPoint endPoint, ServerHTTP3Session session, MessageParser parser) { - super(endPoint, connector.getExecutor(), connector.getByteBufferPool(), parser); + super(endPoint, connector.getExecutor(), connector.getRetainableByteBufferPool(), parser); this.connector = connector; this.httpConfiguration = httpConfiguration; this.session = session; diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ClientConnector.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ClientConnector.java index a58277262153..97802d770426 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ClientConnector.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ClientConnector.java @@ -95,6 +95,7 @@ public static ClientConnector forUnixDomain(Path path) private Executor executor; private Scheduler scheduler; private ByteBufferPool byteBufferPool; + private RetainableByteBufferPool retainableByteBufferPool; private SslContextFactory.Client sslContextFactory; private SelectorManager selectorManager; private int selectors = 1; @@ -160,6 +161,11 @@ public ByteBufferPool getByteBufferPool() return byteBufferPool; } + public RetainableByteBufferPool getRetainableByteBufferPool() + { + return retainableByteBufferPool; + } + public void setByteBufferPool(ByteBufferPool byteBufferPool) { if (isStarted()) @@ -168,6 +174,14 @@ public void setByteBufferPool(ByteBufferPool byteBufferPool) this.byteBufferPool = byteBufferPool; } + public void setRetainableByteBufferPool(RetainableByteBufferPool retainableByteBufferPool) + { + if (isStarted()) + throw new IllegalStateException(); + updateBean(this.retainableByteBufferPool, retainableByteBufferPool); + this.retainableByteBufferPool = retainableByteBufferPool; + } + public SslContextFactory.Client getSslContextFactory() { return sslContextFactory; @@ -368,6 +382,8 @@ protected void doStart() throws Exception setScheduler(new ScheduledExecutorScheduler(String.format("client-scheduler@%x", hashCode()), false)); if (byteBufferPool == null) setByteBufferPool(new MappedByteBufferPool()); + if (retainableByteBufferPool == null) + setRetainableByteBufferPool(new ArrayRetainableByteBufferPool()); if (sslContextFactory == null) setSslContextFactory(newSslContextFactory()); selectorManager = newSelectorManager(); diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java index 9e166e495503..c6c616cf45d3 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslClientConnectionFactory.java @@ -29,6 +29,7 @@ import org.eclipse.jetty.io.ClientConnector; import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.EndPoint; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.ssl.SslContextFactory; @@ -41,16 +42,24 @@ public class SslClientConnectionFactory implements ClientConnectionFactory private final SslContextFactory sslContextFactory; private final ByteBufferPool byteBufferPool; + private final RetainableByteBufferPool retainableByteBufferPool; private final Executor executor; private final ClientConnectionFactory connectionFactory; private boolean _directBuffersForEncryption = true; private boolean _directBuffersForDecryption = true; private boolean _requireCloseMessage; + @Deprecated public SslClientConnectionFactory(SslContextFactory sslContextFactory, ByteBufferPool byteBufferPool, Executor executor, ClientConnectionFactory connectionFactory) + { + this(sslContextFactory, byteBufferPool, RetainableByteBufferPool.findOrAdapt(null, byteBufferPool), executor, connectionFactory); + } + + public SslClientConnectionFactory(SslContextFactory sslContextFactory, ByteBufferPool byteBufferPool, RetainableByteBufferPool retainableByteBufferPool, Executor executor, ClientConnectionFactory connectionFactory) { this.sslContextFactory = Objects.requireNonNull(sslContextFactory, "Missing SslContextFactory"); this.byteBufferPool = byteBufferPool; + this.retainableByteBufferPool = retainableByteBufferPool; this.executor = executor; this.connectionFactory = connectionFactory; } @@ -119,7 +128,7 @@ public org.eclipse.jetty.io.Connection newConnection(EndPoint endPoint, Map context) { - super(connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), endPoint); + super(connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), connector.getRetainableByteBufferPool(), endPoint); this.connector = connector; this.context = context; } @@ -97,7 +97,7 @@ public void onOpen() LOG.debug("connecting to {} with protocols {}", remoteAddress, protocols); QuicheConnection quicheConnection = QuicheConnection.connect(quicheConfig, remoteAddress); - ClientQuicSession session = new ClientQuicSession(getExecutor(), getScheduler(), getByteBufferPool(), quicheConnection, this, remoteAddress, context); + ClientQuicSession session = new ClientQuicSession(getExecutor(), getScheduler(), getByteBufferPool(), getRetainableByteBufferPool(), quicheConnection, this, remoteAddress, context); pendingSessions.put(remoteAddress, session); if (LOG.isDebugEnabled()) LOG.debug("created {}", session); diff --git a/jetty-quic/quic-client/src/main/java/org/eclipse/jetty/quic/client/ClientQuicSession.java b/jetty-quic/quic-client/src/main/java/org/eclipse/jetty/quic/client/ClientQuicSession.java index 80ca5833cbbf..4698ad32a687 100644 --- a/jetty-quic/quic-client/src/main/java/org/eclipse/jetty/quic/client/ClientQuicSession.java +++ b/jetty-quic/quic-client/src/main/java/org/eclipse/jetty/quic/client/ClientQuicSession.java @@ -23,6 +23,7 @@ import org.eclipse.jetty.io.ClientConnectionFactory; import org.eclipse.jetty.io.ClientConnector; import org.eclipse.jetty.io.Connection; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.io.RuntimeIOException; import org.eclipse.jetty.quic.common.ProtocolSession; import org.eclipse.jetty.quic.common.QuicConnection; @@ -43,9 +44,9 @@ public class ClientQuicSession extends QuicSession private final Map context; private final AtomicReference task = new AtomicReference<>(); - protected ClientQuicSession(Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, QuicheConnection quicheConnection, QuicConnection connection, InetSocketAddress remoteAddress, Map context) + protected ClientQuicSession(Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, RetainableByteBufferPool retainableByteBufferPool, QuicheConnection quicheConnection, QuicConnection connection, InetSocketAddress remoteAddress, Map context) { - super(executor, scheduler, byteBufferPool, quicheConnection, connection, remoteAddress); + super(executor, scheduler, byteBufferPool, retainableByteBufferPool, quicheConnection, connection, remoteAddress); this.context = context; } diff --git a/jetty-quic/quic-common/src/main/java/org/eclipse/jetty/quic/common/QuicConnection.java b/jetty-quic/quic-common/src/main/java/org/eclipse/jetty/quic/common/QuicConnection.java index 94ed2bca2113..e6188e682548 100644 --- a/jetty-quic/quic-common/src/main/java/org/eclipse/jetty/quic/common/QuicConnection.java +++ b/jetty-quic/quic-common/src/main/java/org/eclipse/jetty/quic/common/QuicConnection.java @@ -31,6 +31,7 @@ import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.DatagramChannelEndPoint; import org.eclipse.jetty.io.EndPoint; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.quic.common.internal.QuicErrorCode; import org.eclipse.jetty.quic.quiche.QuicheConnectionId; import org.eclipse.jetty.util.BufferUtil; @@ -60,6 +61,7 @@ public abstract class QuicConnection extends AbstractConnection private final AtomicBoolean closed = new AtomicBoolean(); private final Scheduler scheduler; private final ByteBufferPool byteBufferPool; + private final RetainableByteBufferPool retainableByteBufferPool; private final AdaptiveExecutionStrategy strategy; private final Flusher flusher = new Flusher(); private final Callback fillableCallback = new FillableCallback(); @@ -67,13 +69,14 @@ public abstract class QuicConnection extends AbstractConnection private boolean useInputDirectByteBuffers = true; private boolean useOutputDirectByteBuffers = true; - protected QuicConnection(Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, EndPoint endPoint) + protected QuicConnection(Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, RetainableByteBufferPool retainableByteBufferPool, EndPoint endPoint) { super(endPoint, executor); if (!(endPoint instanceof DatagramChannelEndPoint)) throw new IllegalArgumentException("EndPoint must be a " + DatagramChannelEndPoint.class.getSimpleName()); this.scheduler = scheduler; this.byteBufferPool = byteBufferPool; + this.retainableByteBufferPool = retainableByteBufferPool; this.strategy = new AdaptiveExecutionStrategy(new QuicProducer(), getExecutor()); } @@ -93,6 +96,11 @@ public ByteBufferPool getByteBufferPool() return byteBufferPool; } + public RetainableByteBufferPool getRetainableByteBufferPool() + { + return retainableByteBufferPool; + } + public int getOutputBufferSize() { return outputBufferSize; diff --git a/jetty-quic/quic-common/src/main/java/org/eclipse/jetty/quic/common/QuicSession.java b/jetty-quic/quic-common/src/main/java/org/eclipse/jetty/quic/common/QuicSession.java index 0cef4b6c6b71..dc97ffa8be92 100644 --- a/jetty-quic/quic-common/src/main/java/org/eclipse/jetty/quic/common/QuicSession.java +++ b/jetty-quic/quic-common/src/main/java/org/eclipse/jetty/quic/common/QuicSession.java @@ -34,6 +34,7 @@ import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.CyclicTimeout; import org.eclipse.jetty.io.EndPoint; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.quic.common.internal.QuicErrorCode; import org.eclipse.jetty.quic.quiche.QuicheConnection; import org.eclipse.jetty.quic.quiche.QuicheConnectionId; @@ -66,6 +67,7 @@ public abstract class QuicSession extends ContainerLifeCycle private final Executor executor; private final Scheduler scheduler; private final ByteBufferPool byteBufferPool; + private final RetainableByteBufferPool retainableByteBufferPool; private final QuicheConnection quicheConnection; private final QuicConnection connection; private final Flusher flusher; @@ -74,11 +76,12 @@ public abstract class QuicSession extends ContainerLifeCycle private QuicheConnectionId quicheConnectionId; private long idleTimeout; - protected QuicSession(Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, QuicheConnection quicheConnection, QuicConnection connection, SocketAddress remoteAddress) + protected QuicSession(Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, RetainableByteBufferPool retainableByteBufferPool, QuicheConnection quicheConnection, QuicConnection connection, SocketAddress remoteAddress) { this.executor = executor; this.scheduler = scheduler; this.byteBufferPool = byteBufferPool; + this.retainableByteBufferPool = retainableByteBufferPool; this.quicheConnection = quicheConnection; this.connection = connection; this.flusher = new Flusher(scheduler); @@ -154,6 +157,11 @@ public ByteBufferPool getByteBufferPool() return byteBufferPool; } + public RetainableByteBufferPool getRetainableByteBufferPool() + { + return retainableByteBufferPool; + } + public ProtocolSession getProtocolSession() { return protocolSession; diff --git a/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/QuicServerConnector.java b/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/QuicServerConnector.java index a2d3c1ffe5da..4e4d8e0398de 100644 --- a/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/QuicServerConnector.java +++ b/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/QuicServerConnector.java @@ -31,6 +31,7 @@ import org.eclipse.jetty.io.DatagramChannelEndPoint; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.io.ManagedSelector; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.io.SelectorManager; import org.eclipse.jetty.quic.common.QuicConfiguration; import org.eclipse.jetty.quic.common.QuicSession; @@ -71,12 +72,12 @@ public class QuicServerConnector extends AbstractNetworkConnector public QuicServerConnector(Server server, SslContextFactory.Server sslContextFactory, ConnectionFactory... factories) { - this(server, null, null, null, sslContextFactory, factories); + this(server, null, null, null, null, sslContextFactory, factories); } - public QuicServerConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool bufferPool, SslContextFactory.Server sslContextFactory, ConnectionFactory... factories) + public QuicServerConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool bufferPool, RetainableByteBufferPool retainableBufferPool, SslContextFactory.Server sslContextFactory, ConnectionFactory... factories) { - super(server, executor, scheduler, bufferPool, 0, factories); + super(server, executor, scheduler, bufferPool, retainableBufferPool, 0, factories); this.selectorManager = new ServerDatagramSelectorManager(getExecutor(), getScheduler(), 1); addBean(this.selectorManager); this.sslContextFactory = sslContextFactory; diff --git a/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/ServerQuicConnection.java b/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/ServerQuicConnection.java index 7b485d6d8361..e88d2cbc28c2 100644 --- a/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/ServerQuicConnection.java +++ b/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/ServerQuicConnection.java @@ -45,7 +45,7 @@ public class ServerQuicConnection extends QuicConnection protected ServerQuicConnection(QuicServerConnector connector, EndPoint endPoint) { - super(connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), endPoint); + super(connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), connector.getRetainableByteBufferPool(), endPoint); this.connector = connector; this.sessionTimeouts = new SessionTimeouts(connector.getScheduler()); } @@ -84,7 +84,7 @@ protected QuicSession createSession(SocketAddress remoteAddress, ByteBuffer ciph } else { - QuicSession session = new ServerQuicSession(getExecutor(), getScheduler(), byteBufferPool, quicheConnection, this, remoteAddress, connector); + QuicSession session = new ServerQuicSession(getExecutor(), getScheduler(), byteBufferPool, getRetainableByteBufferPool(), quicheConnection, this, remoteAddress, connector); // Send the response packet(s) that tryAccept() generated. session.flush(); return session; diff --git a/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/ServerQuicSession.java b/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/ServerQuicSession.java index 791732fce2ee..3f7476a5f6aa 100644 --- a/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/ServerQuicSession.java +++ b/jetty-quic/quic-server/src/main/java/org/eclipse/jetty/quic/server/ServerQuicSession.java @@ -23,6 +23,7 @@ import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.CyclicTimeouts; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.io.RuntimeIOException; import org.eclipse.jetty.quic.common.ProtocolSession; import org.eclipse.jetty.quic.common.QuicConnection; @@ -45,9 +46,9 @@ public class ServerQuicSession extends QuicSession implements CyclicTimeouts.Exp private final Connector connector; private long expireNanoTime; - protected ServerQuicSession(Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, QuicheConnection quicheConnection, QuicConnection connection, SocketAddress remoteAddress, Connector connector) + protected ServerQuicSession(Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, RetainableByteBufferPool retainableByteBufferPool, QuicheConnection quicheConnection, QuicConnection connection, SocketAddress remoteAddress, Connector connector) { - super(executor, scheduler, byteBufferPool, quicheConnection, connection, remoteAddress); + super(executor, scheduler, byteBufferPool, retainableByteBufferPool, quicheConnection, connection, remoteAddress); this.connector = connector; } diff --git a/jetty-security/src/test/java/org/eclipse/jetty/security/authentication/SpnegoAuthenticatorTest.java b/jetty-security/src/test/java/org/eclipse/jetty/security/authentication/SpnegoAuthenticatorTest.java index 18a6c43c7676..acef5ad979ab 100644 --- a/jetty-security/src/test/java/org/eclipse/jetty/security/authentication/SpnegoAuthenticatorTest.java +++ b/jetty-security/src/test/java/org/eclipse/jetty/security/authentication/SpnegoAuthenticatorTest.java @@ -185,7 +185,7 @@ class MockConnector extends AbstractConnector { public MockConnector() { - super(new Server(), null, null, null, 0); + super(new Server(), null, null, null,null, 0); } @Override 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 9ea4af80201d..f74c33b6243f 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 @@ -147,6 +147,7 @@ public abstract class AbstractConnector extends ContainerLifeCycle implements Co private final Executor _executor; private final Scheduler _scheduler; private final ByteBufferPool _byteBufferPool; + private final RetainableByteBufferPool _retainableByteBufferPool; private final Thread[] _acceptors; private final Set _endpoints = Collections.newSetFromMap(new ConcurrentHashMap<>()); private final Set _immutableEndPoints = Collections.unmodifiableSet(_endpoints); @@ -162,6 +163,7 @@ public abstract class AbstractConnector extends ContainerLifeCycle implements Co private boolean _accepting = true; private ThreadPoolBudget.Lease _lease; + /** * @param server The server this connector will be added to. Must not be null. * @param executor An executor for this connector or null to use the servers executor @@ -170,6 +172,7 @@ public abstract class AbstractConnector extends ContainerLifeCycle implements Co * @param acceptors the number of acceptor threads to use, or -1 for a default value. If 0, then no acceptor threads will be launched and some other mechanism will need to be used to accept new connections. * @param factories The Connection Factories to use. */ + @Deprecated public AbstractConnector( Server server, Executor executor, @@ -177,6 +180,27 @@ public AbstractConnector( ByteBufferPool pool, int acceptors, ConnectionFactory... factories) + { + this(server, executor, scheduler, pool, null, acceptors, factories); + } + + /** + * @param server The server this connector will be added to. Must not be null. + * @param executor An executor for this connector or null to use the servers executor + * @param scheduler A scheduler for this connector or null to either a {@link Scheduler} set as a server bean or if none set, then a new {@link ScheduledExecutorScheduler} instance. + * @param pool A buffer pool for this connector or null to either a {@link ByteBufferPool} set as a server bean or none set, the new {@link ArrayByteBufferPool} instance. + * @param retainablePool A retainable buffer pool for this connector or null to either a {@link RetainableByteBufferPool} set as a server bean or none set, the new {@link ArrayRetainableByteBufferPool} instance. + * @param acceptors the number of acceptor threads to use, or -1 for a default value. If 0, then no acceptor threads will be launched and some other mechanism will need to be used to accept new connections. + * @param factories The Connection Factories to use. + */ + public AbstractConnector( + Server server, + Executor executor, + Scheduler scheduler, + ByteBufferPool pool, + RetainableByteBufferPool retainablePool, + int acceptors, + ConnectionFactory... factories) { _server = server; _executor = executor != null ? executor : _server.getThreadPool(); @@ -191,8 +215,10 @@ public AbstractConnector( pool = _server.getBean(ByteBufferPool.class); _byteBufferPool = pool != null ? pool : new ArrayByteBufferPool(); addBean(_byteBufferPool); - RetainableByteBufferPool retainableByteBufferPool = _server.getBean(RetainableByteBufferPool.class); - addBean(retainableByteBufferPool == null ? new ArrayRetainableByteBufferPool() : retainableByteBufferPool, retainableByteBufferPool == null); + if (retainablePool == null) + retainablePool = _server.getBean(RetainableByteBufferPool.class); + _retainableByteBufferPool = retainablePool != null ? retainablePool : new ArrayRetainableByteBufferPool(); + addBean(retainablePool); addEventListener(new Container.Listener() { @@ -260,6 +286,12 @@ public ByteBufferPool getByteBufferPool() return _byteBufferPool; } + @Override + public RetainableByteBufferPool getRetainableByteBufferPool() + { + return _retainableByteBufferPool; + } + @Override @ManagedAttribute("The connection idle timeout in milliseconds") public long getIdleTimeout() diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetworkConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetworkConnector.java index 679262ec1d17..af8a3e874eb1 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetworkConnector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetworkConnector.java @@ -18,6 +18,7 @@ import java.util.concurrent.Executor; import org.eclipse.jetty.io.ByteBufferPool; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedObject; import org.eclipse.jetty.util.thread.Scheduler; @@ -35,7 +36,12 @@ public abstract class AbstractNetworkConnector extends AbstractConnector impleme public AbstractNetworkConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, int acceptors, ConnectionFactory... factories) { - super(server, executor, scheduler, pool, acceptors, factories); + this(server, executor, scheduler, pool, null, acceptors, factories); + } + + public AbstractNetworkConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, RetainableByteBufferPool retainablePool, int acceptors, ConnectionFactory... factories) + { + super(server, executor, scheduler, pool, retainablePool, acceptors, factories); } public void setHost(String host) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java index 4f6e72ba719e..659fea679cc0 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java @@ -19,6 +19,7 @@ import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.EndPoint; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedObject; @@ -55,6 +56,14 @@ public interface Connector extends LifeCycle, Container, Graceful */ public ByteBufferPool getByteBufferPool(); + /** + * @return the {@link RetainableByteBufferPool} to acquire retainable buffers from and release retainable buffers to + */ + public default RetainableByteBufferPool getRetainableByteBufferPool() + { + return RetainableByteBufferPool.findOrAdapt(this, getByteBufferPool()); + } + /** * @param nextProtocol the next protocol * @return the {@link ConnectionFactory} associated with the protocol name diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java index aaf11cf501c8..a7644335b60e 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java @@ -97,7 +97,7 @@ public HttpConnection(HttpConfiguration config, Connector connector, EndPoint en _config = config; _connector = connector; _bufferPool = _connector.getByteBufferPool(); - _retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, _bufferPool); + _retainableByteBufferPool = connector.getRetainableByteBufferPool(); _generator = newHttpGenerator(); _channel = newHttpChannel(); _input = _channel.getRequest().getHttpInput(); 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 61451b12e378..f9de65706c0a 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 @@ -27,6 +27,7 @@ import org.eclipse.jetty.io.ByteArrayEndPoint; import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.Connection; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.ByteArrayOutputStream2; import org.eclipse.jetty.util.ssl.SslContextFactory; @@ -45,30 +46,35 @@ public class LocalConnector extends AbstractConnector { private final BlockingQueue _connects = new LinkedBlockingQueue<>(); - public LocalConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, int acceptors, ConnectionFactory... factories) - { - super(server, executor, scheduler, pool, acceptors, factories); - setIdleTimeout(30000); - } - public LocalConnector(Server server) { - this(server, null, null, null, -1, new HttpConnectionFactory()); + this(server, null, null, null, null, -1, new HttpConnectionFactory()); } public LocalConnector(Server server, SslContextFactory.Server sslContextFactory) { - this(server, null, null, null, -1, AbstractConnectionFactory.getFactories(sslContextFactory, new HttpConnectionFactory())); + this(server, null, null, null, null,-1, AbstractConnectionFactory.getFactories(sslContextFactory, new HttpConnectionFactory())); } public LocalConnector(Server server, ConnectionFactory connectionFactory) { - this(server, null, null, null, -1, connectionFactory); + this(server, null, null, null, null,-1, connectionFactory); } public LocalConnector(Server server, ConnectionFactory connectionFactory, SslContextFactory.Server sslContextFactory) { - this(server, null, null, null, -1, AbstractConnectionFactory.getFactories(sslContextFactory, connectionFactory)); + this(server, null, null, null, null,-1, AbstractConnectionFactory.getFactories(sslContextFactory, connectionFactory)); + } + + public LocalConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, int acceptors, ConnectionFactory... factories) + { + this(server, executor, scheduler, pool, null, acceptors, factories); + } + + public LocalConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, RetainableByteBufferPool retainablePool, int acceptors, ConnectionFactory... factories) + { + super(server, executor, scheduler, pool, retainablePool, acceptors, factories); + setIdleTimeout(30000); } @Override diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkTrafficServerConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkTrafficServerConnector.java index d0fdb50c5a5b..b751ce314bc8 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkTrafficServerConnector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkTrafficServerConnector.java @@ -21,6 +21,7 @@ import org.eclipse.jetty.io.ManagedSelector; import org.eclipse.jetty.io.NetworkTrafficListener; import org.eclipse.jetty.io.NetworkTrafficSocketChannelEndPoint; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.io.SocketChannelEndPoint; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.thread.Scheduler; @@ -36,7 +37,7 @@ public class NetworkTrafficServerConnector extends ServerConnector public NetworkTrafficServerConnector(Server server) { - this(server, null, null, null, 0, 0, new HttpConnectionFactory()); + this(server, null, null, null, null, 0, 0, new HttpConnectionFactory()); } public NetworkTrafficServerConnector(Server server, ConnectionFactory connectionFactory, SslContextFactory.Server sslContextFactory) @@ -54,6 +55,11 @@ public NetworkTrafficServerConnector(Server server, Executor executor, Scheduler super(server, executor, scheduler, pool, acceptors, selectors, factories); } + public NetworkTrafficServerConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, RetainableByteBufferPool retainablePool, int acceptors, int selectors, ConnectionFactory... factories) + { + super(server, executor, scheduler, pool, retainablePool, acceptors, selectors, factories); + } + public NetworkTrafficServerConnector(Server server, SslContextFactory.Server sslContextFactory) { super(server, sslContextFactory); 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 b27351b7d7cc..8bbf877f2f1f 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 @@ -33,6 +33,7 @@ import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.io.ManagedSelector; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.io.SelectorManager; import org.eclipse.jetty.io.SocketChannelEndPoint; import org.eclipse.jetty.util.IO; @@ -208,7 +209,32 @@ public ServerConnector( @Name("selectors") int selectors, @Name("factories") ConnectionFactory... factories) { - super(server, executor, scheduler, bufferPool, acceptors, factories); + this(server, executor, scheduler, bufferPool, null, acceptors, selectors, factories); + } + + /** + * @param server The server this connector will be accept connection for. + * @param executor An executor used to run tasks for handling requests, acceptors and selectors. + * If null then use the servers executor + * @param scheduler A scheduler used to schedule timeouts. If null then use the servers scheduler + * @param bufferPool A ByteBuffer pool used to allocate buffers. If null then create a private pool with default configuration. + * @param retainableBufferPool A RetainableByteBuffer pool used to allocate buffers. If null then create a private retainable pool with default configuration. + * @param acceptors 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. + * @param factories Zero or more {@link ConnectionFactory} instances used to create and configure connections. + */ + public ServerConnector( + @Name("server") Server server, + @Name("executor") Executor executor, + @Name("scheduler") Scheduler scheduler, + @Name("bufferPool") ByteBufferPool bufferPool, + @Name("retainableBufferPool") RetainableByteBufferPool retainableBufferPool, + @Name("acceptors") int acceptors, + @Name("selectors") int selectors, + @Name("factories") ConnectionFactory... factories) + { + super(server, executor, scheduler, bufferPool, retainableBufferPool, acceptors, factories); _manager = newSelectorManager(getExecutor(), getScheduler(), selectors); addBean(_manager, true); setAcceptorPriorityDelta(-2); diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java index 0d44be120c35..5b2392e1a4b1 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java @@ -168,7 +168,7 @@ public Connection newConnection(Connector connector, EndPoint endPoint) protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine) { ByteBufferPool byteBufferPool = connector.getByteBufferPool(); - RetainableByteBufferPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, byteBufferPool); + RetainableByteBufferPool retainableByteBufferPool = connector.getRetainableByteBufferPool(); return new SslConnection(retainableByteBufferPool, byteBufferPool, connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()); } diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/MockConnector.java b/jetty-server/src/test/java/org/eclipse/jetty/server/MockConnector.java index 26accc2dd5d0..f641f73bcd9d 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/MockConnector.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/MockConnector.java @@ -19,7 +19,7 @@ class MockConnector extends AbstractConnector { public MockConnector() { - super(new Server(), null, null, null, 0); + super(new Server(), null, null, null, null, 0); } @Override diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyConnectionTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyConnectionTest.java index 15ac6bb2690f..2345ecc2f638 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyConnectionTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ProxyConnectionTest.java @@ -320,7 +320,7 @@ public RequestProcessor() http.getHttpConfiguration().setResponseHeaderSize(1024); ProxyConnectionFactory proxy = new ProxyConnectionFactory(HttpVersion.HTTP_1_1.asString()); - _connector = new LocalConnector(_server, null, null, null, 1, proxy, http); + _connector = new LocalConnector(_server, null, null, null, null, 1, proxy, http); _connector.setIdleTimeout(1000); _server.addConnector(_connector); _server.setHandler(new DumpHandler()); diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java index 2e9b9fcb27cf..b3bda1ae2e77 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java @@ -102,7 +102,7 @@ public void init() throws Exception _server = new Server(); Scheduler scheduler = new TimerScheduler(); HttpConfiguration config = new HttpConfiguration(); - LocalConnector connector = new LocalConnector(_server, null, scheduler, null, 1, new HttpConnectionFactory(config)); + LocalConnector connector = new LocalConnector(_server, null, scheduler, null, null, 1, new HttpConnectionFactory(config)); _server.addConnector(connector); _server.setHandler(new DumpHandler()); _server.start(); diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLEngineTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLEngineTest.java index b46ba6d44422..4785c8373356 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLEngineTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLEngineTest.java @@ -209,7 +209,7 @@ public void testInvalidLargeTLSFrame() throws Exception @Override protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) + return new SslConnection(connector.getRetainableByteBufferPool(), connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption()) { @Override protected SSLEngineResult unwrap(SSLEngine sslEngine, ByteBuffer input, ByteBuffer output) throws SSLException diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/CacheControlHeaderTest.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/CacheControlHeaderTest.java index 329670c1a7d6..af45f20a6b71 100644 --- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/CacheControlHeaderTest.java +++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/CacheControlHeaderTest.java @@ -86,7 +86,7 @@ public void startServer(boolean forceFilter, boolean forceWrapping) throws Excep server = new Server(); HttpConnectionFactory httpConnectionFactory = new HttpConnectionFactory(new HttpConfiguration()); - connector = new LocalConnector(server, null, null, null, -1, httpConnectionFactory); + connector = new LocalConnector(server, null, null, null, null, -1, httpConnectionFactory); ServletContextHandler context = new ServletContextHandler(); diff --git a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ComplianceViolations2616Test.java b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ComplianceViolations2616Test.java index 71bac7f01042..1a2ef7b2e093 100644 --- a/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ComplianceViolations2616Test.java +++ b/jetty-servlet/src/test/java/org/eclipse/jetty/servlet/ComplianceViolations2616Test.java @@ -107,7 +107,7 @@ public static void startServer() throws Exception HttpConnectionFactory httpConnectionFactory = new HttpConnectionFactory(config); httpConnectionFactory.setRecordHttpComplianceViolations(true); - connector = new LocalConnector(server, null, null, null, -1, httpConnectionFactory); + connector = new LocalConnector(server, null, null, null, null,-1, httpConnectionFactory); ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/"); diff --git a/jetty-unixdomain-server/src/main/java/org/eclipse/jetty/unixdomain/server/UnixDomainServerConnector.java b/jetty-unixdomain-server/src/main/java/org/eclipse/jetty/unixdomain/server/UnixDomainServerConnector.java index 34900f42f372..da4bc4b85c64 100644 --- a/jetty-unixdomain-server/src/main/java/org/eclipse/jetty/unixdomain/server/UnixDomainServerConnector.java +++ b/jetty-unixdomain-server/src/main/java/org/eclipse/jetty/unixdomain/server/UnixDomainServerConnector.java @@ -33,6 +33,7 @@ import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.io.ManagedSelector; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.io.SelectorManager; import org.eclipse.jetty.io.SocketChannelEndPoint; import org.eclipse.jetty.server.AbstractConnector; @@ -81,7 +82,12 @@ public UnixDomainServerConnector(Server server, int acceptors, int selectors, Co public UnixDomainServerConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, int acceptors, int selectors, ConnectionFactory... factories) { - super(server, executor, scheduler, pool, acceptors, factories.length > 0 ? factories : new ConnectionFactory[]{new HttpConnectionFactory()}); + this(server, executor, scheduler, pool, null, acceptors, selectors, factories); + } + + public UnixDomainServerConnector(Server server, Executor executor, Scheduler scheduler, ByteBufferPool pool, RetainableByteBufferPool retainablePool, int acceptors, int selectors, ConnectionFactory... factories) + { + super(server, executor, scheduler, pool, retainablePool, acceptors, factories.length > 0 ? factories : new ConnectionFactory[]{new HttpConnectionFactory()}); selectorManager = newSelectorManager(getExecutor(), getScheduler(), selectors); addBean(selectorManager, true); } diff --git a/jetty-unixsocket/jetty-unixsocket-server/src/main/java/org/eclipse/jetty/unixsocket/server/UnixSocketConnector.java b/jetty-unixsocket/jetty-unixsocket-server/src/main/java/org/eclipse/jetty/unixsocket/server/UnixSocketConnector.java index 212c423d68f4..e90577c40612 100644 --- a/jetty-unixsocket/jetty-unixsocket-server/src/main/java/org/eclipse/jetty/unixsocket/server/UnixSocketConnector.java +++ b/jetty-unixsocket/jetty-unixsocket-server/src/main/java/org/eclipse/jetty/unixsocket/server/UnixSocketConnector.java @@ -158,7 +158,7 @@ public UnixSocketConnector(@Name("server") Server server, @Name("sslContextFacto */ public UnixSocketConnector(@Name("server") Server server, @Name("executor") Executor executor, @Name("scheduler") Scheduler scheduler, @Name("bufferPool") ByteBufferPool bufferPool, @Name("selectors") int selectors, @Name("factories") ConnectionFactory... factories) { - super(server, executor, scheduler, bufferPool, 0, factories); + super(server, executor, scheduler, bufferPool, null, 0, factories); _manager = newSelectorManager(getExecutor(), getScheduler(), selectors > 0 ? selectors : 1); addBean(_manager, true); } diff --git a/jetty-websocket/websocket-core-client/src/main/java/org/eclipse/jetty/websocket/core/client/CoreClientUpgradeRequest.java b/jetty-websocket/websocket-core-client/src/main/java/org/eclipse/jetty/websocket/core/client/CoreClientUpgradeRequest.java index 2008c5b91f83..b8a14177c2c6 100644 --- a/jetty-websocket/websocket-core-client/src/main/java/org/eclipse/jetty/websocket/core/client/CoreClientUpgradeRequest.java +++ b/jetty-websocket/websocket-core-client/src/main/java/org/eclipse/jetty/websocket/core/client/CoreClientUpgradeRequest.java @@ -440,7 +440,7 @@ else if (values.length == 1) HttpClient httpClient = wsClient.getHttpClient(); ByteBufferPool bufferPool = wsClient.getWebSocketComponents().getBufferPool(); - RetainableByteBufferPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(wsClient.getWebSocketComponents(), bufferPool); + RetainableByteBufferPool retainableByteBufferPool = wsClient.getWebSocketComponents().getRetainableBufferPool(); WebSocketConnection wsConnection = new WebSocketConnection(endPoint, httpClient.getExecutor(), httpClient.getScheduler(), bufferPool, retainableByteBufferPool, coreSession); wsClient.getEventListeners().forEach(wsConnection::addEventListener); coreSession.setWebSocketConnection(wsConnection); diff --git a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/WebSocketComponents.java b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/WebSocketComponents.java index 7d609e0a9627..4f7ed5ec8522 100644 --- a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/WebSocketComponents.java +++ b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/WebSocketComponents.java @@ -16,8 +16,10 @@ import java.util.concurrent.Executor; import java.util.zip.Deflater; +import org.eclipse.jetty.io.ArrayRetainableByteBufferPool; import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.MappedByteBufferPool; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.util.DecoratedObjectFactory; import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.compression.CompressionPool; @@ -27,7 +29,8 @@ /** * A collection of components which are the resources needed for websockets such as - * {@link ByteBufferPool}, {@link WebSocketExtensionRegistry}, and {@link DecoratedObjectFactory}. + * {@link ByteBufferPool}, {@link RetainableByteBufferPool}, {@link WebSocketExtensionRegistry}, + * and {@link DecoratedObjectFactory}. */ public class WebSocketComponents extends ContainerLifeCycle { @@ -35,26 +38,23 @@ public class WebSocketComponents extends ContainerLifeCycle private final WebSocketExtensionRegistry _extensionRegistry; private final Executor _executor; private final ByteBufferPool _bufferPool; + private final RetainableByteBufferPool _retainableBufferPool; private final InflaterPool _inflaterPool; private final DeflaterPool _deflaterPool; public WebSocketComponents() { - this(null, null, null, null, null); + this(null, null, null, null, null, null, null); } public WebSocketComponents(WebSocketExtensionRegistry extensionRegistry, DecoratedObjectFactory objectFactory, - ByteBufferPool bufferPool, InflaterPool inflaterPool, DeflaterPool deflaterPool) - { - this (extensionRegistry, objectFactory, bufferPool, inflaterPool, deflaterPool, null); - } - - public WebSocketComponents(WebSocketExtensionRegistry extensionRegistry, DecoratedObjectFactory objectFactory, - ByteBufferPool bufferPool, InflaterPool inflaterPool, DeflaterPool deflaterPool, Executor executor) + ByteBufferPool bufferPool, RetainableByteBufferPool retainableBufferPool, + InflaterPool inflaterPool, DeflaterPool deflaterPool, Executor executor) { _extensionRegistry = (extensionRegistry == null) ? new WebSocketExtensionRegistry() : extensionRegistry; _objectFactory = (objectFactory == null) ? new DecoratedObjectFactory() : objectFactory; _bufferPool = (bufferPool == null) ? new MappedByteBufferPool() : bufferPool; + _retainableBufferPool = (retainableBufferPool == null) ? new ArrayRetainableByteBufferPool() : retainableBufferPool; _inflaterPool = (inflaterPool == null) ? new InflaterPool(CompressionPool.DEFAULT_CAPACITY, true) : inflaterPool; _deflaterPool = (deflaterPool == null) ? new DeflaterPool(CompressionPool.DEFAULT_CAPACITY, Deflater.DEFAULT_COMPRESSION, true) : deflaterPool; @@ -82,6 +82,11 @@ public ByteBufferPool getBufferPool() return _bufferPool; } + public RetainableByteBufferPool getRetainableBufferPool() + { + return _retainableBufferPool; + } + public Executor getExecutor() { return _executor; diff --git a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/WebSocketServerComponents.java b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/WebSocketServerComponents.java index 5972fc130d5d..c881769de517 100644 --- a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/WebSocketServerComponents.java +++ b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/WebSocketServerComponents.java @@ -18,6 +18,7 @@ import javax.servlet.ServletContext; import org.eclipse.jetty.io.ByteBufferPool; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.util.DecoratedObjectFactory; @@ -40,10 +41,11 @@ public class WebSocketServerComponents extends WebSocketComponents public static final String WEBSOCKET_INFLATER_POOL_ATTRIBUTE = "jetty.websocket.inflater"; public static final String WEBSOCKET_DEFLATER_POOL_ATTRIBUTE = "jetty.websocket.deflater"; public static final String WEBSOCKET_BUFFER_POOL_ATTRIBUTE = "jetty.websocket.bufferPool"; + public static final String WEBSOCKET_RETAINABLE_BUFFER_POOL_ATTRIBUTE = "jetty.websocket.retainableBufferPool"; - WebSocketServerComponents(InflaterPool inflaterPool, DeflaterPool deflaterPool, ByteBufferPool bufferPool, DecoratedObjectFactory objectFactory, Executor executor) + WebSocketServerComponents(InflaterPool inflaterPool, DeflaterPool deflaterPool, ByteBufferPool bufferPool, RetainableByteBufferPool retainableBufferPool, DecoratedObjectFactory objectFactory, Executor executor) { - super(null, objectFactory, bufferPool, inflaterPool, deflaterPool, executor); + super(null, objectFactory, bufferPool, retainableBufferPool, inflaterPool, deflaterPool, executor); } /** @@ -54,9 +56,10 @@ public class WebSocketServerComponents extends WebSocketComponents * This should be called when the server is starting, usually by a {@link javax.servlet.ServletContainerInitializer}. *

*

- * Servlet context attributes can be set with {@link #WEBSOCKET_BUFFER_POOL_ATTRIBUTE}, {@link #WEBSOCKET_INFLATER_POOL_ATTRIBUTE} - * and {@link #WEBSOCKET_DEFLATER_POOL_ATTRIBUTE} to override the {@link ByteBufferPool}, {@link DeflaterPool} or - * {@link InflaterPool} used by the components, otherwise this will try to use the pools shared on the {@link Server}. + * Servlet context attributes can be set with {@link #WEBSOCKET_BUFFER_POOL_ATTRIBUTE}, {@link #WEBSOCKET_RETAINABLE_BUFFER_POOL_ATTRIBUTE}, + * {@link #WEBSOCKET_INFLATER_POOL_ATTRIBUTE} and {@link #WEBSOCKET_DEFLATER_POOL_ATTRIBUTE} to override the {@link ByteBufferPool}, + * {@link RetainableByteBufferPool}, {@link DeflaterPool} or {@link InflaterPool} used by the components, otherwise this will try to use + * the pools shared on the {@link Server}. *

* @param server the server. * @param servletContext the ServletContext. @@ -80,12 +83,16 @@ public static WebSocketComponents ensureWebSocketComponents(Server server, Servl if (bufferPool == null) bufferPool = server.getBean(ByteBufferPool.class); + RetainableByteBufferPool retainableBufferPool = (RetainableByteBufferPool)servletContext.getAttribute(WEBSOCKET_RETAINABLE_BUFFER_POOL_ATTRIBUTE); + if (retainableBufferPool == null) + retainableBufferPool = server.getBean(RetainableByteBufferPool.class); + Executor executor = (Executor)servletContext.getAttribute("org.eclipse.jetty.server.Executor"); if (executor == null) executor = server.getThreadPool(); DecoratedObjectFactory objectFactory = (DecoratedObjectFactory)servletContext.getAttribute(DecoratedObjectFactory.ATTR); - WebSocketComponents serverComponents = new WebSocketServerComponents(inflaterPool, deflaterPool, bufferPool, objectFactory, executor); + WebSocketComponents serverComponents = new WebSocketServerComponents(inflaterPool, deflaterPool, bufferPool, retainableBufferPool, objectFactory, executor); if (objectFactory != null) serverComponents.unmanage(objectFactory); diff --git a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC6455Handshaker.java b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC6455Handshaker.java index bca2538a1c3a..55a43853b249 100644 --- a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC6455Handshaker.java +++ b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC6455Handshaker.java @@ -97,7 +97,7 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web HttpChannel httpChannel = baseRequest.getHttpChannel(); Connector connector = httpChannel.getConnector(); ByteBufferPool byteBufferPool = connector.getByteBufferPool(); - RetainableByteBufferPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, byteBufferPool); + RetainableByteBufferPool retainableByteBufferPool = connector.getRetainableByteBufferPool(); return newWebSocketConnection(httpChannel.getEndPoint(), connector.getExecutor(), connector.getScheduler(), byteBufferPool, retainableByteBufferPool, coreSession); } diff --git a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC8441Handshaker.java b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC8441Handshaker.java index 83c79d5bd9e3..636907faf83b 100644 --- a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC8441Handshaker.java +++ b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/RFC8441Handshaker.java @@ -81,7 +81,7 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web Connector connector = httpChannel.getConnector(); EndPoint endPoint = httpChannel.getTunnellingEndPoint(); ByteBufferPool byteBufferPool = connector.getByteBufferPool(); - RetainableByteBufferPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, byteBufferPool); + RetainableByteBufferPool retainableByteBufferPool = connector.getRetainableByteBufferPool(); return newWebSocketConnection(endPoint, connector.getExecutor(), connector.getScheduler(), byteBufferPool, retainableByteBufferPool, coreSession); } diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientLoadTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientLoadTest.java index 0785020d1299..404046c6b342 100644 --- a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientLoadTest.java +++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientLoadTest.java @@ -41,9 +41,11 @@ import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.http3.server.HTTP3ServerConnector; import org.eclipse.jetty.io.ArrayByteBufferPool; +import org.eclipse.jetty.io.ArrayRetainableByteBufferPool; import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.LeakTrackingByteBufferPool; import org.eclipse.jetty.io.MappedByteBufferPool; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; @@ -386,6 +388,7 @@ public Connector newServerConnector(Server server) int selectors = Math.min(1, ProcessorUtils.availableProcessors() / 2); ByteBufferPool byteBufferPool = new ArrayByteBufferPool(); byteBufferPool = new LeakTrackingByteBufferPool(byteBufferPool); + RetainableByteBufferPool retainableByteBufferPool = new ArrayRetainableByteBufferPool(); switch (transport) { case HTTP: @@ -395,7 +398,7 @@ public Connector newServerConnector(Server server) case FCGI: return new ServerConnector(server, null, null, byteBufferPool, 1, selectors, provideServerConnectionFactory(transport)); case H3: - return new HTTP3ServerConnector(server, null, null, byteBufferPool, sslContextFactory, provideServerConnectionFactory(transport)); + return new HTTP3ServerConnector(server, null, null, byteBufferPool, retainableByteBufferPool, sslContextFactory, provideServerConnectionFactory(transport)); case UNIX_DOMAIN: UnixDomainServerConnector unixSocketConnector = new UnixDomainServerConnector(server, null, null, byteBufferPool, 1, selectors, provideServerConnectionFactory(transport)); unixSocketConnector.setUnixDomainPath(unixDomainPath); diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTimeoutTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTimeoutTest.java index 85acb26d3c59..3a8913cf8149 100644 --- a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTimeoutTest.java +++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTimeoutTest.java @@ -43,6 +43,7 @@ import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.ClientConnectionFactory; import org.eclipse.jetty.io.EndPoint; +import org.eclipse.jetty.io.RetainableByteBufferPool; import org.eclipse.jetty.io.ssl.SslClientConnectionFactory; import org.eclipse.jetty.io.ssl.SslConnection; import org.eclipse.jetty.server.handler.AbstractHandler; @@ -251,12 +252,12 @@ public ClientConnectionFactory newSslClientConnectionFactory(SslContextFactory.C { if (sslContextFactory == null) sslContextFactory = getSslContextFactory(); - return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getExecutor(), connectionFactory) + return new SslClientConnectionFactory(sslContextFactory, getByteBufferPool(), getRetainableByteBufferPool(), getExecutor(), connectionFactory) { @Override - protected SslConnection newSslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) + protected SslConnection newSslConnection(RetainableByteBufferPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine engine) { - return new SslConnection(byteBufferPool, executor, endPoint, engine) + return new SslConnection(retainableByteBufferPool, byteBufferPool, executor, endPoint, engine) { @Override protected boolean onReadTimeout(Throwable timeout)