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)