From 03f4469ae955081bbbadef965306cc26d6826885 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Fri, 28 May 2021 11:51:57 +0200
Subject: [PATCH 01/75] use RetainableByteBuffer
Signed-off-by: Ludovic Orban
---
.../eclipse/jetty/server/HttpConnection.java | 76 +++++++++----------
1 file changed, 35 insertions(+), 41 deletions(-)
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 728214a75721..1562e15d5f56 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
@@ -17,7 +17,6 @@
import java.nio.ByteBuffer;
import java.nio.channels.WritePendingException;
import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.LongAdder;
import org.eclipse.jetty.http.BadMessageException;
@@ -35,6 +34,7 @@
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.EofException;
+import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -60,8 +60,7 @@ public class HttpConnection extends AbstractConnection implements Runnable, Http
private final HttpGenerator _generator;
private final HttpChannelOverHttp _channel;
private final HttpParser _parser;
- private final AtomicInteger _contentBufferReferences = new AtomicInteger();
- private volatile ByteBuffer _requestBuffer = null;
+ private volatile RetainableByteBuffer _retainableByteBuffer;
private final AsyncReadCallback _asyncReadCallback = new AsyncReadCallback();
private final SendCallback _sendCallback = new SendCallback();
private final boolean _recordHttpComplianceViolations;
@@ -198,10 +197,10 @@ public void setUseOutputDirectByteBuffers(boolean useOutputDirectByteBuffers)
@Override
public ByteBuffer onUpgradeFrom()
{
- if (BufferUtil.hasContent(_requestBuffer))
+ if (!isRequestBufferEmpty())
{
- ByteBuffer unconsumed = ByteBuffer.allocateDirect(_requestBuffer.remaining());
- unconsumed.put(_requestBuffer);
+ ByteBuffer unconsumed = ByteBuffer.allocateDirect(_retainableByteBuffer.remaining());
+ unconsumed.put(_retainableByteBuffer.getBuffer());
unconsumed.flip();
releaseRequestBuffer();
return unconsumed;
@@ -225,36 +224,41 @@ public void onFlushed(long bytes) throws IOException
void releaseRequestBuffer()
{
- if (_requestBuffer != null && !_requestBuffer.hasRemaining())
+ if (_retainableByteBuffer != null && !_retainableByteBuffer.hasRemaining())
{
if (LOG.isDebugEnabled())
LOG.debug("releaseRequestBuffer {}", this);
- ByteBuffer buffer = _requestBuffer;
- _requestBuffer = null;
- _bufferPool.release(buffer);
+ if (_retainableByteBuffer.release() == 0)
+ _retainableByteBuffer = null;
}
}
public ByteBuffer getRequestBuffer()
{
- if (_requestBuffer == null)
+ if (_retainableByteBuffer == null)
{
boolean useDirectByteBuffers = isUseInputDirectByteBuffers();
- _requestBuffer = _bufferPool.acquire(getInputBufferSize(), useDirectByteBuffers);
+ _retainableByteBuffer = new RetainableByteBuffer(_bufferPool, getInputBufferSize(), useDirectByteBuffers);
}
- return _requestBuffer;
+ return _retainableByteBuffer.getBuffer();
}
public boolean isRequestBufferEmpty()
{
- return BufferUtil.isEmpty(_requestBuffer);
+ return _retainableByteBuffer == null || _retainableByteBuffer.isEmpty();
+ }
+
+ private String toDetailString()
+ {
+ ByteBuffer buffer = _retainableByteBuffer == null ? null :_retainableByteBuffer.getBuffer();
+ return BufferUtil.toDetailString(buffer);
}
@Override
public void onFillable()
{
if (LOG.isDebugEnabled())
- LOG.debug("{} onFillable enter {} {}", this, _channel.getState(), BufferUtil.toDetailString(_requestBuffer));
+ LOG.debug("{} onFillable enter {} {}", this, _channel.getState(), toDetailString());
HttpConnection last = setCurrentConnection(this);
try
@@ -302,7 +306,6 @@ else if (filled < 0)
{
if (LOG.isDebugEnabled())
LOG.debug("{} caught exception {}", this, _channel.getState(), x);
- BufferUtil.clear(_requestBuffer);
releaseRequestBuffer();
getEndPoint().close(x);
}
@@ -310,7 +313,7 @@ else if (filled < 0)
{
setCurrentConnection(last);
if (LOG.isDebugEnabled())
- LOG.debug("{} onFillable exit {} {}", this, _channel.getState(), BufferUtil.toDetailString(_requestBuffer));
+ LOG.debug("{} onFillable exit {} {}", this, _channel.getState(), toDetailString());
}
}
@@ -338,22 +341,22 @@ void parseAndFillForContent()
private int fillRequestBuffer()
{
- if (_contentBufferReferences.get() > 0)
+ if (_retainableByteBuffer != null && _retainableByteBuffer.getReferences() > 1)
throw new IllegalStateException("fill with unconsumed content on " + this);
- if (BufferUtil.isEmpty(_requestBuffer))
+ if (isRequestBufferEmpty())
{
// Get a buffer
// We are not in a race here for the request buffer as we have not yet received a request,
// so there are not an possible legal threads calling #parseContent or #completed.
- _requestBuffer = getRequestBuffer();
+ ByteBuffer requestBuffer = getRequestBuffer();
// fill
try
{
- int filled = getEndPoint().fill(_requestBuffer);
+ int filled = getEndPoint().fill(requestBuffer);
if (filled == 0) // Do a retry on fill 0 (optimization for SSL connections)
- filled = getEndPoint().fill(_requestBuffer);
+ filled = getEndPoint().fill(requestBuffer);
if (filled > 0)
bytesIn.add(filled);
@@ -361,7 +364,7 @@ else if (filled < 0)
_parser.atEOF();
if (LOG.isDebugEnabled())
- LOG.debug("{} filled {} {}", this, filled, BufferUtil.toDetailString(_requestBuffer));
+ LOG.debug("{} filled {} {}", this, filled, toDetailString());
return filled;
}
@@ -379,15 +382,15 @@ else if (filled < 0)
private boolean parseRequestBuffer()
{
if (LOG.isDebugEnabled())
- LOG.debug("{} parse {}", this, BufferUtil.toDetailString(_requestBuffer));
+ LOG.debug("{} parse {}", this, toDetailString());
- boolean handle = _parser.parseNext(_requestBuffer == null ? BufferUtil.EMPTY_BUFFER : _requestBuffer);
+ boolean handle = _parser.parseNext(_retainableByteBuffer == null ? BufferUtil.EMPTY_BUFFER : _retainableByteBuffer.getBuffer());
if (LOG.isDebugEnabled())
LOG.debug("{} parsed {} {}", this, handle, _parser);
// recycle buffer ?
- if (_contentBufferReferences.get() == 0)
+ if (_retainableByteBuffer != null && _retainableByteBuffer.getReferences() == 1)
releaseRequestBuffer();
return handle;
@@ -406,15 +409,14 @@ private boolean upgrade()
_channel.recycle();
_parser.reset();
_generator.reset();
- if (_contentBufferReferences.get() == 0)
+ if (_retainableByteBuffer != null && _retainableByteBuffer.getReferences() == 1)
{
releaseRequestBuffer();
}
- else
+ else if (_retainableByteBuffer != null)
{
LOG.warn("{} lingering content references?!?!", this);
- _requestBuffer = null; // Not returned to pool!
- _contentBufferReferences.set(0);
+ _retainableByteBuffer = null; // Not returned to pool!
}
return true;
}
@@ -472,7 +474,7 @@ else if (_generator.isPersistent() && !complete)
if (_parser.isStart())
{
// if the buffer is empty
- if (BufferUtil.isEmpty(_requestBuffer))
+ if (isRequestBufferEmpty())
{
// look for more data
fillInterested();
@@ -629,21 +631,13 @@ private class Content extends HttpInput.Content
public Content(ByteBuffer content)
{
super(content);
- _contentBufferReferences.incrementAndGet();
+ _retainableByteBuffer.retain();
}
@Override
public void succeeded()
{
- int counter = _contentBufferReferences.decrementAndGet();
- if (counter == 0)
- releaseRequestBuffer();
- // TODO: this should do something (warn? fail?) if _contentBufferReferences goes below 0
- if (counter < 0)
- {
- LOG.warn("Content reference counting went below zero: {}", counter);
- _contentBufferReferences.incrementAndGet();
- }
+ _retainableByteBuffer.release();
}
@Override
From b22c8cb92ee87bb62877148fc922684ec601cc46 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Fri, 28 May 2021 12:23:44 +0200
Subject: [PATCH 02/75] fix checkstyle
Signed-off-by: Ludovic Orban
---
.../src/main/java/org/eclipse/jetty/server/HttpConnection.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 1562e15d5f56..2af284742449 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
@@ -250,7 +250,7 @@ public boolean isRequestBufferEmpty()
private String toDetailString()
{
- ByteBuffer buffer = _retainableByteBuffer == null ? null :_retainableByteBuffer.getBuffer();
+ ByteBuffer buffer = _retainableByteBuffer == null ? null : _retainableByteBuffer.getBuffer();
return BufferUtil.toDetailString(buffer);
}
From a093959d84d48b08a6f1b76c6222ec2e7ec727d4 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Tue, 1 Jun 2021 10:54:19 +0200
Subject: [PATCH 03/75] replace toDetailString with straight
RetainableByteBuffer.toString
Signed-off-by: Ludovic Orban
---
.../org/eclipse/jetty/server/HttpConnection.java | 14 ++++----------
1 file changed, 4 insertions(+), 10 deletions(-)
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 2af284742449..aeba8f15408a 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
@@ -248,17 +248,11 @@ public boolean isRequestBufferEmpty()
return _retainableByteBuffer == null || _retainableByteBuffer.isEmpty();
}
- private String toDetailString()
- {
- ByteBuffer buffer = _retainableByteBuffer == null ? null : _retainableByteBuffer.getBuffer();
- return BufferUtil.toDetailString(buffer);
- }
-
@Override
public void onFillable()
{
if (LOG.isDebugEnabled())
- LOG.debug("{} onFillable enter {} {}", this, _channel.getState(), toDetailString());
+ LOG.debug("{} onFillable enter {} {}", this, _channel.getState(), _retainableByteBuffer);
HttpConnection last = setCurrentConnection(this);
try
@@ -313,7 +307,7 @@ else if (filled < 0)
{
setCurrentConnection(last);
if (LOG.isDebugEnabled())
- LOG.debug("{} onFillable exit {} {}", this, _channel.getState(), toDetailString());
+ LOG.debug("{} onFillable exit {} {}", this, _channel.getState(), _retainableByteBuffer);
}
}
@@ -364,7 +358,7 @@ else if (filled < 0)
_parser.atEOF();
if (LOG.isDebugEnabled())
- LOG.debug("{} filled {} {}", this, filled, toDetailString());
+ LOG.debug("{} filled {} {}", this, filled, _retainableByteBuffer);
return filled;
}
@@ -382,7 +376,7 @@ else if (filled < 0)
private boolean parseRequestBuffer()
{
if (LOG.isDebugEnabled())
- LOG.debug("{} parse {}", this, toDetailString());
+ LOG.debug("{} parse {}", this, _retainableByteBuffer);
boolean handle = _parser.parseNext(_retainableByteBuffer == null ? BufferUtil.EMPTY_BUFFER : _retainableByteBuffer.getBuffer());
From 4c5404de42ee3ae302f0b95d60bd959ed78627f4 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Tue, 1 Jun 2021 11:22:27 +0200
Subject: [PATCH 04/75] use RetainableByteBuffer for encrypted input buffer
Signed-off-by: Ludovic Orban
---
.../eclipse/jetty/io/ssl/SslConnection.java | 29 ++++++++++---------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
index 24bc59c19b4e..82a996c7ac70 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
@@ -35,6 +35,7 @@
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -110,7 +111,7 @@ private enum FlushState
private final SSLEngine _sslEngine;
private final DecryptedEndPoint _decryptedEndPoint;
private ByteBuffer _decryptedInput;
- private ByteBuffer _encryptedInput;
+ private RetainableByteBuffer _encryptedInput;
private ByteBuffer _encryptedOutput;
private final boolean _encryptedDirectBuffers;
private final boolean _decryptedDirectBuffers;
@@ -326,7 +327,7 @@ private int getBufferSize(ToIntFunction bufferSizeFn)
private void acquireEncryptedInput()
{
if (_encryptedInput == null)
- _encryptedInput = _bufferPool.acquire(getPacketBufferSize(), _encryptedDirectBuffers);
+ _encryptedInput = new RetainableByteBuffer(_bufferPool, getPacketBufferSize(), _encryptedDirectBuffers);
}
private void acquireEncryptedOutput()
@@ -339,7 +340,7 @@ private void acquireEncryptedOutput()
public void onUpgradeTo(ByteBuffer buffer)
{
acquireEncryptedInput();
- BufferUtil.append(_encryptedInput, buffer);
+ BufferUtil.append(_encryptedInput.getBuffer(), buffer);
}
@Override
@@ -409,7 +410,7 @@ protected SSLEngineResult unwrap(SSLEngine sslEngine, ByteBuffer input, ByteBuff
@Override
public String toConnectionString()
{
- ByteBuffer b = _encryptedInput;
+ ByteBuffer b = _encryptedInput == null ? null : _encryptedInput.getBuffer();
int ei = b == null ? -1 : b.remaining();
b = _encryptedOutput;
int eo = b == null ? -1 : b.remaining();
@@ -431,7 +432,7 @@ private void releaseEncryptedInputBuffer()
{
if (_encryptedInput != null && !_encryptedInput.hasRemaining())
{
- _bufferPool.release(_encryptedInput);
+ _encryptedInput.release();
_encryptedInput = null;
}
}
@@ -672,14 +673,14 @@ public int fill(ByteBuffer buffer) throws IOException
}
// Let's try reading some encrypted data... even if we have some already.
- int netFilled = networkFill(_encryptedInput);
+ int netFilled = networkFill(_encryptedInput.getBuffer());
if (netFilled > 0)
_bytesIn.addAndGet(netFilled);
if (LOG.isDebugEnabled())
LOG.debug("net filled={}", netFilled);
// Workaround for Java 11 behavior.
- if (netFilled < 0 && isHandshakeInitial() && BufferUtil.isEmpty(_encryptedInput))
+ if (netFilled < 0 && isHandshakeInitial() && (_encryptedInput == null || _encryptedInput.isEmpty()))
closeInbound();
if (netFilled > 0 && !isHandshakeComplete() && isOutboundDone())
@@ -698,7 +699,7 @@ public int fill(ByteBuffer buffer) throws IOException
try
{
_underflown = false;
- unwrapResult = SslConnection.this.unwrap(_sslEngine, _encryptedInput, appIn);
+ unwrapResult = SslConnection.this.unwrap(_sslEngine, _encryptedInput.getBuffer(), appIn);
}
finally
{
@@ -708,7 +709,7 @@ public int fill(ByteBuffer buffer) throws IOException
LOG.debug("unwrap net_filled={} {} encryptedBuffer={} unwrapBuffer={} appBuffer={}",
netFilled,
StringUtil.replace(unwrapResult.toString(), '\n', ' '),
- BufferUtil.toSummaryString(_encryptedInput),
+ _encryptedInput,
BufferUtil.toDetailString(appIn),
BufferUtil.toDetailString(buffer));
@@ -729,13 +730,13 @@ public int fill(ByteBuffer buffer) throws IOException
case BUFFER_UNDERFLOW:
// Continue if we can compact?
- if (BufferUtil.compact(_encryptedInput))
+ if (BufferUtil.compact(_encryptedInput.getBuffer()))
continue;
// Are we out of space?
- if (BufferUtil.space(_encryptedInput) == 0)
+ if (BufferUtil.space(_encryptedInput.getBuffer()) == 0)
{
- BufferUtil.clear(_encryptedInput);
+ BufferUtil.clear(_encryptedInput.getBuffer());
throw new SSLHandshakeException("Encrypted buffer max length exceeded");
}
@@ -847,7 +848,7 @@ protected void needsFillInterest()
_flushState,
_fillState,
_underflown,
- BufferUtil.toDetailString(_encryptedInput),
+ _encryptedInput,
BufferUtil.toDetailString(_decryptedInput),
SslConnection.this);
@@ -855,7 +856,7 @@ protected void needsFillInterest()
return;
// Fillable if we have decrypted input OR enough encrypted input.
- fillable = BufferUtil.hasContent(_decryptedInput) || (BufferUtil.hasContent(_encryptedInput) && !_underflown);
+ fillable = BufferUtil.hasContent(_decryptedInput) || (_encryptedInput != null && _encryptedInput.hasRemaining() && !_underflown);
HandshakeStatus status = _sslEngine.getHandshakeStatus();
switch (status)
From 36794d9c86dc14ad4cf4adbba6f31bb8c35deaeb Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Mon, 7 Jun 2021 10:50:45 +0200
Subject: [PATCH 05/75] add managed attributes
Signed-off-by: Ludovic Orban
---
.../org/eclipse/jetty/io/AbstractByteBufferPool.java | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractByteBufferPool.java
index db6cb7ed56c0..886d22025508 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractByteBufferPool.java
@@ -90,6 +90,18 @@ public long getHeapMemory()
return getMemory(false);
}
+ @ManagedAttribute("The maximum bytes retained by direct ByteBuffers")
+ public long getMaxDirectMemory()
+ {
+ return _maxDirectMemory;
+ }
+
+ @ManagedAttribute("The maximum bytes retained by heap ByteBuffers")
+ public long getMaxHeapMemory()
+ {
+ return _maxHeapMemory;
+ }
+
public long getMemory(boolean direct)
{
AtomicLong memory = direct ? _directMemory : _heapMemory;
From 9e58a2abb5d4bd671b198c9d02c1d0c75de5d047 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Mon, 7 Jun 2021 12:45:24 +0200
Subject: [PATCH 06/75] add a bit more monitoring to ArrayByteBufferPool
Signed-off-by: Ludovic Orban
---
.../eclipse/jetty/io/ArrayByteBufferPool.java | 51 +++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java
index 7b37401be5a7..4670b4094d0d 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java
@@ -14,8 +14,11 @@
package org.eclipse.jetty.io;
import java.nio.ByteBuffer;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
import java.util.Objects;
+import java.util.concurrent.atomic.LongAdder;
import java.util.function.IntFunction;
import org.eclipse.jetty.util.BufferUtil;
@@ -38,6 +41,8 @@ public class ArrayByteBufferPool extends AbstractByteBufferPool
private final int _minCapacity;
private final ByteBufferPool.Bucket[] _direct;
private final ByteBufferPool.Bucket[] _indirect;
+ private final LongAdder _newDirectByteBuffersCount = new LongAdder();
+ private final LongAdder _newIndirectByteBuffersCount = new LongAdder();
/**
* Creates a new ArrayByteBufferPool with a default configuration.
@@ -100,6 +105,52 @@ public ArrayByteBufferPool(int minCapacity, int factor, int maxCapacity, int max
_indirect = new ByteBufferPool.Bucket[length];
}
+ @Override
+ public ByteBuffer newByteBuffer(int capacity, boolean direct)
+ {
+ if (direct)
+ _newDirectByteBuffersCount.increment();
+ else
+ _newIndirectByteBuffersCount.increment();
+ return super.newByteBuffer(capacity, direct);
+ }
+
+ @ManagedAttribute("The number of times a new direct byte buffer got allocated")
+ public long getNewDirectByteBuffersCount()
+ {
+ return _newDirectByteBuffersCount.sum();
+ }
+
+ @ManagedAttribute("The number of times a new indirect byte buffer got allocated")
+ public long getNewIndirectByteBuffersCount()
+ {
+ return _newIndirectByteBuffersCount.sum();
+ }
+
+ @ManagedAttribute("direct buffers buckets")
+ public List getDirect()
+ {
+ List set = new ArrayList<>();
+ for (Bucket bucket : _direct)
+ {
+ if (bucket != null)
+ set.add(bucket.toString());
+ }
+ return set;
+ }
+
+ @ManagedAttribute("indirect buffers buckets")
+ public List getIndirect()
+ {
+ List set = new ArrayList<>();
+ for (Bucket bucket : _indirect)
+ {
+ if (bucket != null)
+ set.add(bucket.toString());
+ }
+ return set;
+ }
+
@Override
public ByteBuffer acquire(int size, boolean direct)
{
From ea19cae890bf5e51bfa9f5590dfdfc9cfc98949e Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Mon, 7 Jun 2021 17:25:06 +0200
Subject: [PATCH 07/75] modify SslConnectionFactory to add ability to use
Pool for encrypted input
Signed-off-by: Ludovic Orban
---
.../jetty/io/RetainableByteBuffer.java | 20 +++++++++---
.../eclipse/jetty/io/ssl/SslConnection.java | 32 ++++++++++++++++++-
.../jetty/server/SslConnectionFactory.java | 4 ++-
3 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
index 1ab6d1ffb2ed..62b02357cf1a 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
@@ -39,8 +39,17 @@ public RetainableByteBuffer(ByteBufferPool pool, int size)
public RetainableByteBuffer(ByteBufferPool pool, int size, boolean direct)
{
this.pool = pool;
- this.buffer = pool.acquire(size, direct);
- this.references = new AtomicInteger(1);
+ if (pool != null)
+ {
+ this.buffer = pool.acquire(size, direct);
+ this.references = new AtomicInteger(1);
+ }
+ else
+ {
+ this.buffer = direct ? ByteBuffer.allocateDirect(size) : ByteBuffer.allocate(size);
+ BufferUtil.clear(this.buffer);
+ this.references = new AtomicInteger(0);
+ }
}
public ByteBuffer getBuffer()
@@ -59,7 +68,7 @@ public void retain()
while (true)
{
int r = references.get();
- if (r == 0)
+ if (r == 0 && pool != null)
throw new IllegalStateException("released " + this);
if (references.compareAndSet(r, r + 1))
break;
@@ -70,7 +79,10 @@ public int release()
{
int ref = references.decrementAndGet();
if (ref == 0)
- pool.release(buffer);
+ if (pool != null)
+ pool.release(buffer);
+ else
+ BufferUtil.clear(buffer);
else if (ref < 0)
throw new IllegalStateException("already released " + this);
return ref;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
index 82a996c7ac70..a4854d8ed7f9 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
@@ -39,6 +39,7 @@
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.Pool;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.thread.AutoLock;
import org.eclipse.jetty.util.thread.Invocable;
@@ -108,10 +109,12 @@ private enum FlushState
private final AtomicLong _bytesIn = new AtomicLong();
private final AtomicLong _bytesOut = new AtomicLong();
private final ByteBufferPool _bufferPool;
+ private final Pool _retainableBufferPool;
private final SSLEngine _sslEngine;
private final DecryptedEndPoint _decryptedEndPoint;
private ByteBuffer _decryptedInput;
private RetainableByteBuffer _encryptedInput;
+ private Pool.Entry _encryptedInputEntry;
private ByteBuffer _encryptedOutput;
private final boolean _encryptedDirectBuffers;
private final boolean _decryptedDirectBuffers;
@@ -188,11 +191,18 @@ public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint
public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
boolean useDirectBuffersForEncryption, boolean useDirectBuffersForDecryption)
+ {
+ this(null, byteBufferPool, executor, endPoint, sslEngine, useDirectBuffersForEncryption, useDirectBuffersForDecryption);
+ }
+
+ public SslConnection(Pool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
+ boolean useDirectBuffersForEncryption, boolean useDirectBuffersForDecryption)
{
// This connection does not execute calls to onFillable(), so they will be called by the selector thread.
// onFillable() does not block and will only wakeup another thread to do the actual reading and handling.
super(endPoint, executor);
this._bufferPool = byteBufferPool;
+ this._retainableBufferPool = retainableByteBufferPool;
this._sslEngine = sslEngine;
this._decryptedEndPoint = newDecryptedEndPoint();
this._encryptedDirectBuffers = useDirectBuffersForEncryption;
@@ -327,7 +337,22 @@ private int getBufferSize(ToIntFunction bufferSizeFn)
private void acquireEncryptedInput()
{
if (_encryptedInput == null)
- _encryptedInput = new RetainableByteBuffer(_bufferPool, getPacketBufferSize(), _encryptedDirectBuffers);
+ {
+ if (_retainableBufferPool == null)
+ _encryptedInput = new RetainableByteBuffer(_bufferPool, getPacketBufferSize(), _encryptedDirectBuffers);
+ else
+ {
+ _encryptedInputEntry = _retainableBufferPool.acquire();
+ if (_encryptedInputEntry == null)
+ {
+ LOG.warn("pool is depleted");
+ _encryptedInput = new RetainableByteBuffer(_bufferPool, getPacketBufferSize(), _encryptedDirectBuffers);
+ return;
+ }
+ _encryptedInput = _encryptedInputEntry.getPooled();
+ _encryptedInput.retain();
+ }
+ }
}
private void acquireEncryptedOutput()
@@ -433,6 +458,11 @@ private void releaseEncryptedInputBuffer()
if (_encryptedInput != null && !_encryptedInput.hasRemaining())
{
_encryptedInput.release();
+ if (_retainableBufferPool != null)
+ {
+ _retainableBufferPool.release(_encryptedInputEntry);
+ _encryptedInputEntry = null;
+ }
_encryptedInput = null;
}
}
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 e97d82f442b6..90b1192aea36 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
@@ -23,6 +23,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.io.ssl.SslHandshakeListener;
+import org.eclipse.jetty.util.Pool;
import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.ssl.SslContextFactory;
@@ -160,7 +161,8 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine)
{
- return new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption());
+ Pool pool = connector.getBean(Pool.class);
+ return new SslConnection(pool, connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption());
}
@Override
From 2ed875c7d7d2064319aff71556b33b58e768395a Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 09:08:47 +0200
Subject: [PATCH 08/75] remove unneeded counters
Signed-off-by: Ludovic Orban
---
.../eclipse/jetty/io/ArrayByteBufferPool.java | 24 -------------------
1 file changed, 24 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java
index 4670b4094d0d..bb09b2be2976 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java
@@ -41,8 +41,6 @@ public class ArrayByteBufferPool extends AbstractByteBufferPool
private final int _minCapacity;
private final ByteBufferPool.Bucket[] _direct;
private final ByteBufferPool.Bucket[] _indirect;
- private final LongAdder _newDirectByteBuffersCount = new LongAdder();
- private final LongAdder _newIndirectByteBuffersCount = new LongAdder();
/**
* Creates a new ArrayByteBufferPool with a default configuration.
@@ -105,28 +103,6 @@ public ArrayByteBufferPool(int minCapacity, int factor, int maxCapacity, int max
_indirect = new ByteBufferPool.Bucket[length];
}
- @Override
- public ByteBuffer newByteBuffer(int capacity, boolean direct)
- {
- if (direct)
- _newDirectByteBuffersCount.increment();
- else
- _newIndirectByteBuffersCount.increment();
- return super.newByteBuffer(capacity, direct);
- }
-
- @ManagedAttribute("The number of times a new direct byte buffer got allocated")
- public long getNewDirectByteBuffersCount()
- {
- return _newDirectByteBuffersCount.sum();
- }
-
- @ManagedAttribute("The number of times a new indirect byte buffer got allocated")
- public long getNewIndirectByteBuffersCount()
- {
- return _newIndirectByteBuffersCount.sum();
- }
-
@ManagedAttribute("direct buffers buckets")
public List getDirect()
{
From 2e2a90c88b9f93e75e2f88d3a4d4b12e69d8d8e6 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 09:09:32 +0200
Subject: [PATCH 09/75] first shot at RetainableByteBuffer pool
Signed-off-by: Ludovic Orban
---
.../jetty/io/RetainableByteBuffer.java | 26 ++-
.../jetty/io/RetainableByteBufferPool.java | 178 ++++++++++++++++++
.../io/RetainableByteBufferPoolTest.java | 59 ++++++
3 files changed, 262 insertions(+), 1 deletion(-)
create mode 100644 jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
create mode 100644 jetty-io/src/test/java/org/eclipse/jetty/io/RetainableByteBufferPoolTest.java
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
index 62b02357cf1a..02dd30d6fa97 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
@@ -16,6 +16,7 @@
import java.nio.ByteBuffer;
import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jetty.util.Attachable;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Retainable;
@@ -25,11 +26,12 @@
* initially 1, incremented with {@link #retain()} and decremented with {@link #release()}. The buffer
* is released to the pool when the reference count is decremented to 0.
*/
-public class RetainableByteBuffer implements Retainable
+public class RetainableByteBuffer implements Retainable, Attachable
{
private final ByteBufferPool pool;
private final ByteBuffer buffer;
private final AtomicInteger references;
+ private Object attachment;
public RetainableByteBuffer(ByteBufferPool pool, int size)
{
@@ -52,6 +54,23 @@ public RetainableByteBuffer(ByteBufferPool pool, int size, boolean direct)
}
}
+ public int capacity()
+ {
+ return buffer.capacity();
+ }
+
+ @Override
+ public Object getAttachment()
+ {
+ return attachment;
+ }
+
+ @Override
+ public void setAttachment(Object attachment)
+ {
+ this.attachment = attachment;
+ }
+
public ByteBuffer getBuffer()
{
return buffer;
@@ -62,6 +81,11 @@ public int getReferences()
return references.get();
}
+ public boolean isDirect()
+ {
+ return buffer.isDirect();
+ }
+
@Override
public void retain()
{
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
new file mode 100644
index 000000000000..f2a277d93c95
--- /dev/null
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
@@ -0,0 +1,178 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2021 Mort Bay Consulting Pty Ltd and others.
+//
+// This program and the accompanying materials are made available under the
+// terms of the Eclipse Public License v. 2.0 which is available at
+// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+// which is available at https://www.apache.org/licenses/LICENSE-2.0.
+//
+// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+// ========================================================================
+//
+
+package org.eclipse.jetty.io;
+
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.function.Supplier;
+
+import org.eclipse.jetty.util.Pool;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@ManagedObject
+public class RetainableByteBufferPool
+{
+ private static final Logger LOG = LoggerFactory.getLogger(RetainableByteBufferPool.class);
+
+ private final Pool[] _direct;
+ private final Pool[] _indirect;
+ private final int _factor;
+ private final int _maxQueueLength;
+ private final int _minCapacity;
+
+ public RetainableByteBufferPool()
+ {
+ this(1024, 1024, 65536, Integer.MAX_VALUE);
+ }
+
+ public RetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, int maxQueueLength)
+ {
+ _factor = factor <= 0 ? 1024 : factor;
+ _maxQueueLength = maxQueueLength;
+ if (minCapacity <= 0)
+ minCapacity = 0;
+ _minCapacity = minCapacity;
+ if (maxCapacity <= 0)
+ maxCapacity = 64 * 1024;
+ if ((maxCapacity % _factor) != 0 || _factor >= maxCapacity)
+ throw new IllegalArgumentException("The capacity factor must be a divisor of maxCapacity");
+
+ int length = maxCapacity / _factor;
+
+ @SuppressWarnings("unchecked")
+ Pool[] directArray = new Pool[length];
+ _direct = directArray;
+ @SuppressWarnings("unchecked")
+ Pool[] indirectArray = new Pool[length];
+ _indirect = indirectArray;
+ }
+
+ public RetainableByteBuffer acquire(int size, boolean direct)
+ {
+ int capacity = (bucketFor(size) + 1) * _factor;
+ Pool bucket = bucketFor(capacity, direct, null);
+ if (bucket == null)
+ return newRetainableByteBuffer(capacity, direct);
+ Pool.Entry entry = bucket.acquire();
+ if (entry == null)
+ return newRetainableByteBuffer(capacity, direct);
+ RetainableByteBuffer buffer = entry.getPooled();
+ buffer.retain();
+ return buffer;
+ }
+
+ public void release(RetainableByteBuffer buffer)
+ {
+ if (buffer == null)
+ return;
+
+ int capacity = buffer.capacity();
+ // Validate that this buffer is from this pool.
+ if ((capacity % _factor) != 0)
+ {
+ if (LOG.isDebugEnabled())
+ LOG.debug("RetainableByteBuffer {} does not belong to this pool, discarding it", buffer);
+ return;
+ }
+
+ Object attachment = buffer.getAttachment();
+ if (attachment != null && !(attachment instanceof Pool.Entry))
+ {
+ if (LOG.isDebugEnabled())
+ LOG.debug("RetainableByteBuffer {} does not belong to this pool, discarding it", buffer);
+ return;
+ }
+
+ buffer.release();
+
+ @SuppressWarnings("unchecked")
+ Pool.Entry entry = (Pool.Entry)attachment;
+ if (entry != null)
+ {
+ entry.release();
+ }
+ else
+ {
+ Pool bucket = bucketFor(capacity, buffer.isDirect(), this::newBucket);
+ if (bucket != null)
+ {
+ Pool.Entry reservedEntry = bucket.reserve();
+ if (reservedEntry != null)
+ {
+ buffer.setAttachment(reservedEntry);
+ reservedEntry.enable(buffer, false);
+ }
+ }
+ }
+ }
+
+ private Pool bucketFor(int capacity, boolean direct, Supplier> newBucket)
+ {
+ if (capacity < _minCapacity)
+ return null;
+ int b = bucketFor(capacity);
+ if (b >= _direct.length)
+ return null;
+ Pool[] buckets = bucketsFor(direct);
+ Pool bucket = buckets[b];
+ if (bucket == null && newBucket != null)
+ buckets[b] = bucket = newBucket.get();
+ return bucket;
+ }
+
+ private int bucketFor(int capacity)
+ {
+ return (capacity - 1) / _factor;
+ }
+
+ private Pool[] bucketsFor(boolean direct)
+ {
+ return direct ? _direct : _indirect;
+ }
+
+ private Pool newBucket()
+ {
+ return new Pool<>(Pool.StrategyType.THREAD_ID, _maxQueueLength);
+ }
+
+ private RetainableByteBuffer newRetainableByteBuffer(int capacity, boolean direct)
+ {
+ RetainableByteBuffer retainableByteBuffer = new RetainableByteBuffer(null, capacity, direct);
+ retainableByteBuffer.retain();
+ return retainableByteBuffer;
+ }
+
+ @ManagedAttribute("The number of pooled direct ByteBuffers")
+ public long getDirectByteBufferCount()
+ {
+ return getByteBufferCount(true);
+ }
+
+ @ManagedAttribute("The number of pooled heap ByteBuffers")
+ public long getHeapByteBufferCount()
+ {
+ return getByteBufferCount(false);
+ }
+
+ private long getByteBufferCount(boolean direct)
+ {
+ return Arrays.stream(bucketsFor(direct))
+ .filter(Objects::nonNull)
+ .mapToLong(Pool::size)
+ .sum();
+ }
+}
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/RetainableByteBufferPoolTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/RetainableByteBufferPoolTest.java
new file mode 100644
index 000000000000..12ff9f04490c
--- /dev/null
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/RetainableByteBufferPoolTest.java
@@ -0,0 +1,59 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2021 Mort Bay Consulting Pty Ltd and others.
+//
+// This program and the accompanying materials are made available under the
+// terms of the Eclipse Public License v. 2.0 which is available at
+// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+// which is available at https://www.apache.org/licenses/LICENSE-2.0.
+//
+// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+// ========================================================================
+//
+
+package org.eclipse.jetty.io;
+
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.core.Is.is;
+
+public class RetainableByteBufferPoolTest
+{
+ @Test
+ public void testAcquireRelease()
+ {
+ RetainableByteBufferPool pool = new RetainableByteBufferPool();
+
+ for (int i = 0; i < 10; i++)
+ {
+ {
+ RetainableByteBuffer buffer = pool.acquire(10, true);
+ assertThat(buffer, is(notNullValue()));
+ RetainableByteBuffer buffer2 = pool.acquire(10, true);
+ assertThat(buffer2, is(notNullValue()));
+ pool.release(buffer);
+ pool.release(buffer2);
+ }
+ {
+ RetainableByteBuffer buffer = pool.acquire(16385, true);
+ assertThat(buffer, is(notNullValue()));
+ pool.release(buffer);
+ }
+ {
+ RetainableByteBuffer buffer = pool.acquire(32768, true);
+ assertThat(buffer, is(notNullValue()));
+ pool.release(buffer);
+ }
+ {
+ RetainableByteBuffer buffer = pool.acquire(32768, false);
+ assertThat(buffer, is(notNullValue()));
+ pool.release(buffer);
+ }
+ }
+
+ assertThat(pool.getDirectByteBufferCount(), is(4L));
+ assertThat(pool.getHeapByteBufferCount(), is(1L));
+ }
+}
From 45a9b598f5bd91bd0bbdd7e3bc5b1ff92487c0ac Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 09:31:55 +0200
Subject: [PATCH 10/75] cleanup acquire/retain mechanism
Signed-off-by: Ludovic Orban
---
.../jetty/io/RetainableByteBuffer.java | 23 +++---
.../jetty/io/RetainableByteBufferPool.java | 82 ++++++-------------
2 files changed, 36 insertions(+), 69 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
index 02dd30d6fa97..a8e23815b01c 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
@@ -18,6 +18,7 @@
import org.eclipse.jetty.util.Attachable;
import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Pool;
import org.eclipse.jetty.util.Retainable;
/**
@@ -31,12 +32,7 @@ public class RetainableByteBuffer implements Retainable, Attachable
private final ByteBufferPool pool;
private final ByteBuffer buffer;
private final AtomicInteger references;
- private Object attachment;
-
- public RetainableByteBuffer(ByteBufferPool pool, int size)
- {
- this(pool, size, false);
- }
+ private Pool.Entry entry;
public RetainableByteBuffer(ByteBufferPool pool, int size, boolean direct)
{
@@ -44,14 +40,13 @@ public RetainableByteBuffer(ByteBufferPool pool, int size, boolean direct)
if (pool != null)
{
this.buffer = pool.acquire(size, direct);
- this.references = new AtomicInteger(1);
}
else
{
this.buffer = direct ? ByteBuffer.allocateDirect(size) : ByteBuffer.allocate(size);
BufferUtil.clear(this.buffer);
- this.references = new AtomicInteger(0);
}
+ this.references = new AtomicInteger(1);
}
public int capacity()
@@ -62,13 +57,15 @@ public int capacity()
@Override
public Object getAttachment()
{
- return attachment;
+ return entry;
}
@Override
public void setAttachment(Object attachment)
{
- this.attachment = attachment;
+ @SuppressWarnings("unchecked")
+ Pool.Entry entry = (Pool.Entry)attachment;
+ this.entry = entry;
}
public ByteBuffer getBuffer()
@@ -104,9 +101,15 @@ public int release()
int ref = references.decrementAndGet();
if (ref == 0)
if (pool != null)
+ {
pool.release(buffer);
+ }
else
+ {
BufferUtil.clear(buffer);
+ if (entry != null)
+ entry.release();
+ }
else if (ref < 0)
throw new IllegalStateException("already released " + this);
return ref;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
index f2a277d93c95..059b9a31322e 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
@@ -20,29 +20,25 @@
import org.eclipse.jetty.util.Pool;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
@ManagedObject
public class RetainableByteBufferPool
{
- private static final Logger LOG = LoggerFactory.getLogger(RetainableByteBufferPool.class);
-
private final Pool[] _direct;
private final Pool[] _indirect;
private final int _factor;
- private final int _maxQueueLength;
+ private final int _maxBucketSize;
private final int _minCapacity;
public RetainableByteBufferPool()
{
- this(1024, 1024, 65536, Integer.MAX_VALUE);
+ this(0, 1024, 65536, Integer.MAX_VALUE);
}
- public RetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, int maxQueueLength)
+ public RetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, int maxBucketSize)
{
_factor = factor <= 0 ? 1024 : factor;
- _maxQueueLength = maxQueueLength;
+ _maxBucketSize = maxBucketSize;
if (minCapacity <= 0)
minCapacity = 0;
_minCapacity = minCapacity;
@@ -64,14 +60,27 @@ public RetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, in
public RetainableByteBuffer acquire(int size, boolean direct)
{
int capacity = (bucketFor(size) + 1) * _factor;
- Pool bucket = bucketFor(capacity, direct, null);
+ Pool bucket = bucketFor(size, direct, this::newBucket);
if (bucket == null)
- return newRetainableByteBuffer(capacity, direct);
+ return new RetainableByteBuffer(null, capacity, direct);
Pool.Entry entry = bucket.acquire();
+
+ RetainableByteBuffer buffer;
if (entry == null)
- return newRetainableByteBuffer(capacity, direct);
- RetainableByteBuffer buffer = entry.getPooled();
- buffer.retain();
+ {
+ buffer = new RetainableByteBuffer(null, capacity, direct);
+ Pool.Entry reservedEntry = bucket.reserve();
+ if (reservedEntry != null)
+ {
+ buffer.setAttachment(reservedEntry);
+ reservedEntry.enable(buffer, true);
+ }
+ }
+ else
+ {
+ buffer = entry.getPooled();
+ buffer.retain();
+ }
return buffer;
}
@@ -79,45 +88,7 @@ public void release(RetainableByteBuffer buffer)
{
if (buffer == null)
return;
-
- int capacity = buffer.capacity();
- // Validate that this buffer is from this pool.
- if ((capacity % _factor) != 0)
- {
- if (LOG.isDebugEnabled())
- LOG.debug("RetainableByteBuffer {} does not belong to this pool, discarding it", buffer);
- return;
- }
-
- Object attachment = buffer.getAttachment();
- if (attachment != null && !(attachment instanceof Pool.Entry))
- {
- if (LOG.isDebugEnabled())
- LOG.debug("RetainableByteBuffer {} does not belong to this pool, discarding it", buffer);
- return;
- }
-
buffer.release();
-
- @SuppressWarnings("unchecked")
- Pool.Entry entry = (Pool.Entry)attachment;
- if (entry != null)
- {
- entry.release();
- }
- else
- {
- Pool bucket = bucketFor(capacity, buffer.isDirect(), this::newBucket);
- if (bucket != null)
- {
- Pool.Entry reservedEntry = bucket.reserve();
- if (reservedEntry != null)
- {
- buffer.setAttachment(reservedEntry);
- reservedEntry.enable(buffer, false);
- }
- }
- }
}
private Pool bucketFor(int capacity, boolean direct, Supplier> newBucket)
@@ -146,14 +117,7 @@ private Pool[] bucketsFor(boolean direct)
private Pool newBucket()
{
- return new Pool<>(Pool.StrategyType.THREAD_ID, _maxQueueLength);
- }
-
- private RetainableByteBuffer newRetainableByteBuffer(int capacity, boolean direct)
- {
- RetainableByteBuffer retainableByteBuffer = new RetainableByteBuffer(null, capacity, direct);
- retainableByteBuffer.retain();
- return retainableByteBuffer;
+ return new Pool<>(Pool.StrategyType.THREAD_ID, _maxBucketSize);
}
@ManagedAttribute("The number of pooled direct ByteBuffers")
From 2ad1c63b32e4d689e51c39a22296e6c45ee74d9e Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 09:33:21 +0200
Subject: [PATCH 11/75] use pool-specific ctor
Signed-off-by: Ludovic Orban
---
.../main/java/org/eclipse/jetty/io/RetainableByteBuffer.java | 5 +++++
.../java/org/eclipse/jetty/io/RetainableByteBufferPool.java | 4 ++--
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
index a8e23815b01c..29048f65abb6 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
@@ -34,6 +34,11 @@ public class RetainableByteBuffer implements Retainable, Attachable
private final AtomicInteger references;
private Pool.Entry entry;
+ RetainableByteBuffer(int size, boolean direct)
+ {
+ this(null, size, direct);
+ }
+
public RetainableByteBuffer(ByteBufferPool pool, int size, boolean direct)
{
this.pool = pool;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
index 059b9a31322e..7e2f0a02dff7 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
@@ -62,13 +62,13 @@ public RetainableByteBuffer acquire(int size, boolean direct)
int capacity = (bucketFor(size) + 1) * _factor;
Pool bucket = bucketFor(size, direct, this::newBucket);
if (bucket == null)
- return new RetainableByteBuffer(null, capacity, direct);
+ return new RetainableByteBuffer(capacity, direct);
Pool.Entry entry = bucket.acquire();
RetainableByteBuffer buffer;
if (entry == null)
{
- buffer = new RetainableByteBuffer(null, capacity, direct);
+ buffer = new RetainableByteBuffer(capacity, direct);
Pool.Entry reservedEntry = bucket.reserve();
if (reservedEntry != null)
{
From 8eb2284dc901f3a9f0d8ce303192e5ad99a0cfbc Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 09:53:10 +0200
Subject: [PATCH 12/75] add optional ability to use RetainableByteBufferPool on
the server
Signed-off-by: Ludovic Orban
---
.../eclipse/jetty/http2/HTTP2Connection.java | 10 +++++-
.../eclipse/jetty/io/ssl/SslConnection.java | 24 +++----------
.../eclipse/jetty/server/HttpConnection.java | 9 +++--
.../core/internal/WebSocketConnection.java | 35 +++++++++++++++++--
4 files changed, 53 insertions(+), 25 deletions(-)
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
index 5b9a7b691fb5..9e792794fb85 100644
--- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
@@ -27,6 +27,7 @@
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -50,6 +51,7 @@ public class HTTP2Connection extends AbstractConnection implements WriteFlusher.
private final HTTP2Producer producer = new HTTP2Producer();
private final AtomicLong bytesIn = new AtomicLong();
private final ByteBufferPool byteBufferPool;
+ private final RetainableByteBufferPool retainableByteBufferPool;
private final Parser parser;
private final ISession session;
private final int bufferSize;
@@ -58,9 +60,15 @@ public class HTTP2Connection extends AbstractConnection implements WriteFlusher.
private boolean useOutputDirectByteBuffers;
public HTTP2Connection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
+ {
+ this(byteBufferPool, null, executor, endPoint, parser, session, bufferSize);
+ }
+
+ public HTTP2Connection(ByteBufferPool byteBufferPool, RetainableByteBufferPool retainableByteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
{
super(endPoint, executor);
this.byteBufferPool = byteBufferPool;
+ this.retainableByteBufferPool = retainableByteBufferPool;
this.parser = parser;
this.session = session;
this.bufferSize = bufferSize;
@@ -425,7 +433,7 @@ private class NetworkBuffer extends RetainableByteBuffer implements Callback
{
private NetworkBuffer()
{
- super(byteBufferPool, bufferSize, isUseInputDirectByteBuffers());
+ super(retainableByteBufferPool == null ? byteBufferPool : null, bufferSize, isUseInputDirectByteBuffers());
}
private void put(ByteBuffer source)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
index a4854d8ed7f9..472d44c596d1 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
@@ -36,10 +36,10 @@
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
-import org.eclipse.jetty.util.Pool;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.thread.AutoLock;
import org.eclipse.jetty.util.thread.Invocable;
@@ -109,12 +109,11 @@ private enum FlushState
private final AtomicLong _bytesIn = new AtomicLong();
private final AtomicLong _bytesOut = new AtomicLong();
private final ByteBufferPool _bufferPool;
- private final Pool _retainableBufferPool;
+ private final RetainableByteBufferPool _retainableBufferPool;
private final SSLEngine _sslEngine;
private final DecryptedEndPoint _decryptedEndPoint;
private ByteBuffer _decryptedInput;
private RetainableByteBuffer _encryptedInput;
- private Pool.Entry _encryptedInputEntry;
private ByteBuffer _encryptedOutput;
private final boolean _encryptedDirectBuffers;
private final boolean _decryptedDirectBuffers;
@@ -195,7 +194,7 @@ public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint
this(null, byteBufferPool, executor, endPoint, sslEngine, useDirectBuffersForEncryption, useDirectBuffersForDecryption);
}
- public SslConnection(Pool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
+ public SslConnection(RetainableByteBufferPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
boolean useDirectBuffersForEncryption, boolean useDirectBuffersForDecryption)
{
// This connection does not execute calls to onFillable(), so they will be called by the selector thread.
@@ -341,17 +340,7 @@ private void acquireEncryptedInput()
if (_retainableBufferPool == null)
_encryptedInput = new RetainableByteBuffer(_bufferPool, getPacketBufferSize(), _encryptedDirectBuffers);
else
- {
- _encryptedInputEntry = _retainableBufferPool.acquire();
- if (_encryptedInputEntry == null)
- {
- LOG.warn("pool is depleted");
- _encryptedInput = new RetainableByteBuffer(_bufferPool, getPacketBufferSize(), _encryptedDirectBuffers);
- return;
- }
- _encryptedInput = _encryptedInputEntry.getPooled();
- _encryptedInput.retain();
- }
+ _encryptedInput = _retainableBufferPool.acquire(getPacketBufferSize(), _encryptedDirectBuffers);
}
}
@@ -458,11 +447,6 @@ private void releaseEncryptedInputBuffer()
if (_encryptedInput != null && !_encryptedInput.hasRemaining())
{
_encryptedInput.release();
- if (_retainableBufferPool != null)
- {
- _retainableBufferPool.release(_encryptedInputEntry);
- _encryptedInputEntry = null;
- }
_encryptedInput = null;
}
}
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 aeba8f15408a..661b96f570d2 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
@@ -35,6 +35,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.EofException;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -56,6 +57,7 @@ public class HttpConnection extends AbstractConnection implements Runnable, Http
private final HttpConfiguration _config;
private final Connector _connector;
private final ByteBufferPool _bufferPool;
+ private final RetainableByteBufferPool _retainableBufferPool;
private final HttpInput _input;
private final HttpGenerator _generator;
private final HttpChannelOverHttp _channel;
@@ -95,6 +97,7 @@ public HttpConnection(HttpConfiguration config, Connector connector, EndPoint en
_config = config;
_connector = connector;
_bufferPool = _connector.getByteBufferPool();
+ _retainableBufferPool = connector.getBean(RetainableByteBufferPool.class);
_generator = newHttpGenerator();
_channel = newHttpChannel();
_input = _channel.getRequest().getHttpInput();
@@ -237,8 +240,10 @@ public ByteBuffer getRequestBuffer()
{
if (_retainableByteBuffer == null)
{
- boolean useDirectByteBuffers = isUseInputDirectByteBuffers();
- _retainableByteBuffer = new RetainableByteBuffer(_bufferPool, getInputBufferSize(), useDirectByteBuffers);
+ if (_retainableBufferPool == null)
+ _retainableByteBuffer = new RetainableByteBuffer(_bufferPool, getInputBufferSize(), isUseInputDirectByteBuffers());
+ else
+ _retainableByteBuffer = _retainableBufferPool.acquire(getInputBufferSize(), isUseInputDirectByteBuffers());
}
return _retainableByteBuffer.getBuffer();
}
diff --git a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
index 927c7a763a1f..dde000d362f3 100644
--- a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
+++ b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
@@ -27,6 +27,7 @@
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.component.Dumpable;
@@ -52,6 +53,7 @@ public class WebSocketConnection extends AbstractConnection implements Connectio
private final AutoLock lock = new AutoLock();
private final ByteBufferPool bufferPool;
+ private final RetainableByteBufferPool retainableByteBufferPool;
private final Generator generator;
private final Parser parser;
private final WebSocketCoreSession coreSession;
@@ -79,7 +81,7 @@ public WebSocketConnection(EndPoint endp,
ByteBufferPool bufferPool,
WebSocketCoreSession coreSession)
{
- this(endp, executor, scheduler, bufferPool, coreSession, null);
+ this(endp, executor, scheduler, bufferPool, null, coreSession, null);
}
/**
@@ -101,6 +103,31 @@ public WebSocketConnection(EndPoint endp,
ByteBufferPool bufferPool,
WebSocketCoreSession coreSession,
Random randomMask)
+ {
+ this(endp, executor, scheduler, bufferPool, null, coreSession, randomMask);
+ }
+
+ /**
+ * Create a WSConnection.
+ *
+ * It is assumed that the WebSocket Upgrade Handshake has already
+ * completed successfully before creating this connection.
+ *
+ * @param endp The endpoint ever which Websockot is sent/received
+ * @param executor A thread executor to use for WS callbacks.
+ * @param scheduler A scheduler to use for timeouts
+ * @param bufferPool A pool of buffers to use.
+ * @param retainableByteBufferPool A pool of retainable buffers to use.
+ * @param coreSession The WC core session to which frames are delivered.
+ * @param randomMask A Random used to mask frames. If null then SecureRandom will be created if needed.
+ */
+ public WebSocketConnection(EndPoint endp,
+ Executor executor,
+ Scheduler scheduler,
+ ByteBufferPool bufferPool,
+ RetainableByteBufferPool retainableByteBufferPool,
+ WebSocketCoreSession coreSession,
+ Random randomMask)
{
super(endp, executor);
@@ -110,6 +137,7 @@ public WebSocketConnection(EndPoint endp,
Objects.requireNonNull(bufferPool, "ByteBufferPool");
this.bufferPool = bufferPool;
+ this.retainableByteBufferPool = retainableByteBufferPool;
this.coreSession = coreSession;
this.generator = new Generator();
this.parser = new Parser(bufferPool, coreSession);
@@ -283,7 +311,10 @@ private void reacquireNetworkBuffer()
private RetainableByteBuffer newNetworkBuffer(int capacity)
{
- return new RetainableByteBuffer(bufferPool, capacity, isUseInputDirectByteBuffers());
+ if (retainableByteBufferPool == null)
+ return new RetainableByteBuffer(bufferPool, capacity, isUseInputDirectByteBuffers());
+ else
+ return retainableByteBufferPool.acquire(capacity, isUseInputDirectByteBuffers());
}
private void releaseNetworkBuffer()
From 9b2001d0d7ed97c14fe228de0a6b0689de13acd8 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 09:57:30 +0200
Subject: [PATCH 13/75] revert old ByteBufferPool changes
Signed-off-by: Ludovic Orban
---
.../jetty/io/AbstractByteBufferPool.java | 12 ---------
.../eclipse/jetty/io/ArrayByteBufferPool.java | 27 -------------------
2 files changed, 39 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractByteBufferPool.java
index 886d22025508..db6cb7ed56c0 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AbstractByteBufferPool.java
@@ -90,18 +90,6 @@ public long getHeapMemory()
return getMemory(false);
}
- @ManagedAttribute("The maximum bytes retained by direct ByteBuffers")
- public long getMaxDirectMemory()
- {
- return _maxDirectMemory;
- }
-
- @ManagedAttribute("The maximum bytes retained by heap ByteBuffers")
- public long getMaxHeapMemory()
- {
- return _maxHeapMemory;
- }
-
public long getMemory(boolean direct)
{
AtomicLong memory = direct ? _directMemory : _heapMemory;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java
index bb09b2be2976..7b37401be5a7 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ArrayByteBufferPool.java
@@ -14,11 +14,8 @@
package org.eclipse.jetty.io;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.List;
import java.util.Objects;
-import java.util.concurrent.atomic.LongAdder;
import java.util.function.IntFunction;
import org.eclipse.jetty.util.BufferUtil;
@@ -103,30 +100,6 @@ public ArrayByteBufferPool(int minCapacity, int factor, int maxCapacity, int max
_indirect = new ByteBufferPool.Bucket[length];
}
- @ManagedAttribute("direct buffers buckets")
- public List getDirect()
- {
- List set = new ArrayList<>();
- for (Bucket bucket : _direct)
- {
- if (bucket != null)
- set.add(bucket.toString());
- }
- return set;
- }
-
- @ManagedAttribute("indirect buffers buckets")
- public List getIndirect()
- {
- List set = new ArrayList<>();
- for (Bucket bucket : _indirect)
- {
- if (bucket != null)
- set.add(bucket.toString());
- }
- return set;
- }
-
@Override
public ByteBuffer acquire(int size, boolean direct)
{
From 914a932794458dea3d716d4c8a5d9da4c78b27d5 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 10:22:16 +0200
Subject: [PATCH 14/75] fix compilation error
Signed-off-by: Ludovic Orban
---
.../java/org/eclipse/jetty/server/SslConnectionFactory.java | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
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 90b1192aea36..6b523ccf58fe 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
@@ -21,9 +21,9 @@
import org.eclipse.jetty.io.AbstractConnection;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.io.ssl.SslHandshakeListener;
-import org.eclipse.jetty.util.Pool;
import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.ssl.SslContextFactory;
@@ -161,8 +161,7 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine)
{
- Pool pool = connector.getBean(Pool.class);
- return new SslConnection(pool, connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption());
+ return new SslConnection(connector.getBean(RetainableByteBufferPool.class), connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption());
}
@Override
From d2ead6563937b1519a5b001ace60ca5cbb3c5af3 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 10:22:52 +0200
Subject: [PATCH 15/75] register RetainableByteBufferPool bean in
AbstractConnector
Signed-off-by: Ludovic Orban
---
.../java/org/eclipse/jetty/server/AbstractConnector.java | 5 +++++
1 file changed, 5 insertions(+)
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 7903f7f65ab5..eb3ffeccce31 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
@@ -34,6 +34,7 @@
import org.eclipse.jetty.io.ArrayByteBufferPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.StringUtil;
@@ -145,6 +146,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);
@@ -188,6 +190,9 @@ public AbstractConnector(
pool = _server.getBean(ByteBufferPool.class);
_byteBufferPool = pool != null ? pool : new ArrayByteBufferPool();
addBean(_byteBufferPool);
+ RetainableByteBufferPool retainableByteBufferPool = _server.getBean(RetainableByteBufferPool.class);
+ _retainableByteBufferPool = retainableByteBufferPool != null ? retainableByteBufferPool : new RetainableByteBufferPool();
+ addBean(_retainableByteBufferPool);
addEventListener(new Container.Listener()
{
From 01b86c03801bfedf07967af49786bd4aff8905c2 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 10:37:50 +0200
Subject: [PATCH 16/75] add RetainableByteBufferPool registration use in
websocket
Signed-off-by: Ludovic Orban
---
.../websocket/core/internal/WebSocketConnection.java | 12 +++---------
.../core/server/internal/AbstractHandshaker.java | 5 +++--
.../core/server/internal/RFC6455Handshaker.java | 3 ++-
.../core/server/internal/RFC8441Handshaker.java | 3 ++-
4 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
index dde000d362f3..88bfcccfb0b7 100644
--- a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
+++ b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
@@ -90,21 +90,15 @@ public WebSocketConnection(EndPoint endp,
* It is assumed that the WebSocket Upgrade Handshake has already
* completed successfully before creating this connection.
*
- * @param endp The endpoint ever which Websockot is sent/received
- * @param executor A thread executor to use for WS callbacks.
- * @param scheduler A scheduler to use for timeouts
- * @param bufferPool A pool of buffers to use.
- * @param coreSession The WC core session to which frames are delivered.
- * @param randomMask A Random used to mask frames. If null then SecureRandom will be created if needed.
*/
public WebSocketConnection(EndPoint endp,
Executor executor,
Scheduler scheduler,
ByteBufferPool bufferPool,
- WebSocketCoreSession coreSession,
- Random randomMask)
+ RetainableByteBufferPool retainableByteBufferPool,
+ WebSocketCoreSession coreSession)
{
- this(endp, executor, scheduler, bufferPool, null, coreSession, randomMask);
+ this(endp, executor, scheduler, bufferPool, retainableByteBufferPool, coreSession, null);
}
/**
diff --git a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/AbstractHandshaker.java b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/AbstractHandshaker.java
index a28c98983f61..734091f247e9 100644
--- a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/AbstractHandshaker.java
+++ b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/AbstractHandshaker.java
@@ -24,6 +24,7 @@
import org.eclipse.jetty.http.PreEncodedHttpField;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpTransport;
@@ -216,9 +217,9 @@ protected void handle(Runnable runnable)
protected abstract WebSocketConnection createWebSocketConnection(Request baseRequest, WebSocketCoreSession coreSession);
- protected WebSocketConnection newWebSocketConnection(EndPoint endPoint, Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, WebSocketCoreSession coreSession)
+ protected WebSocketConnection newWebSocketConnection(EndPoint endPoint, Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, RetainableByteBufferPool retainableByteBufferPool, WebSocketCoreSession coreSession)
{
- return new WebSocketConnection(endPoint, executor, scheduler, byteBufferPool, coreSession);
+ return new WebSocketConnection(endPoint, executor, scheduler, byteBufferPool, retainableByteBufferPool, coreSession);
}
protected abstract void prepareResponse(Response response, WebSocketNegotiation negotiation);
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 041b19e92525..ee09b8660e5b 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
@@ -23,6 +23,7 @@
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.PreEncodedHttpField;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.Request;
@@ -94,7 +95,7 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web
{
HttpChannel httpChannel = baseRequest.getHttpChannel();
Connector connector = httpChannel.getConnector();
- return newWebSocketConnection(httpChannel.getEndPoint(), connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), coreSession);
+ return newWebSocketConnection(httpChannel.getEndPoint(), connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), connector.getBean(RetainableByteBufferPool.class), coreSession);
}
@Override
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 05892c948dc8..af080fead85d 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
@@ -20,6 +20,7 @@
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.Request;
@@ -78,7 +79,7 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web
HttpChannel httpChannel = baseRequest.getHttpChannel();
Connector connector = httpChannel.getConnector();
EndPoint endPoint = httpChannel.getTunnellingEndPoint();
- return newWebSocketConnection(endPoint, connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), coreSession);
+ return newWebSocketConnection(endPoint, connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), connector.getBean(RetainableByteBufferPool.class), coreSession);
}
@Override
From dac025c7b2a8f08e2a84f43b503b264f72d4556d Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 10:38:12 +0200
Subject: [PATCH 17/75] add RetainableByteBufferPool registration use in client
Signed-off-by: Ludovic Orban
---
.../jetty/client/http/HttpReceiverOverHTTP.java | 13 +++++++++++--
.../fcgi/client/http/HttpConnectionOverFCGI.java | 13 +++++++++++--
2 files changed, 22 insertions(+), 4 deletions(-)
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 04b4843775d5..78b24bfbb992 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
@@ -32,6 +32,7 @@
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.slf4j.Logger;
@@ -111,9 +112,17 @@ private void reacquireNetworkBuffer()
private RetainableByteBuffer newNetworkBuffer()
{
HttpClient client = getHttpDestination().getHttpClient();
- ByteBufferPool bufferPool = client.getByteBufferPool();
boolean direct = client.isUseInputDirectByteBuffers();
- return new RetainableByteBuffer(bufferPool, client.getResponseBufferSize(), direct);
+ RetainableByteBufferPool retainableByteBufferPool = client.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ {
+ ByteBufferPool bufferPool = client.getByteBufferPool();
+ return new RetainableByteBuffer(bufferPool, client.getResponseBufferSize(), direct);
+ }
+ else
+ {
+ return retainableByteBufferPool.acquire(client.getResponseBufferSize(), direct);
+ }
}
private void releaseNetworkBuffer()
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 19ee20518dc5..1516c85056ee 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
@@ -47,6 +47,7 @@
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Attachable;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -135,8 +136,16 @@ private void reacquireNetworkBuffer()
private RetainableByteBuffer newNetworkBuffer()
{
HttpClient client = destination.getHttpClient();
- ByteBufferPool bufferPool = client.getByteBufferPool();
- return new RetainableByteBuffer(bufferPool, client.getResponseBufferSize(), client.isUseInputDirectByteBuffers());
+ RetainableByteBufferPool retainableByteBufferPool = client.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ {
+ ByteBufferPool bufferPool = client.getByteBufferPool();
+ return new RetainableByteBuffer(bufferPool, client.getResponseBufferSize(), client.isUseInputDirectByteBuffers());
+ }
+ else
+ {
+ return retainableByteBufferPool.acquire(client.getResponseBufferSize(), client.isUseInputDirectByteBuffers());
+ }
}
private void releaseNetworkBuffer()
From 114418ebe23d13eef46f5ed398cd6d82462de8fe Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 10:43:55 +0200
Subject: [PATCH 18/75] add RetainableByteBufferPool registration use in
upgrade
Signed-off-by: Ludovic Orban
---
.../core/client/CoreClientUpgradeRequest.java | 4 +++-
.../core/internal/WebSocketConnection.java | 16 ----------------
2 files changed, 3 insertions(+), 17 deletions(-)
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 c665c7240dcb..d30ac0bad0f2 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
@@ -39,6 +39,7 @@
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.MultiException;
import org.eclipse.jetty.util.QuotedStringTokenizer;
@@ -447,7 +448,8 @@ else if (values.length == 1)
HttpClient httpClient = wsClient.getHttpClient();
ByteBufferPool bufferPool = wsClient.getWebSocketComponents().getBufferPool();
- WebSocketConnection wsConnection = new WebSocketConnection(endPoint, httpClient.getExecutor(), httpClient.getScheduler(), bufferPool, coreSession);
+ RetainableByteBufferPool retainableByteBufferPool = wsClient.getWebSocketComponents().getBean(RetainableByteBufferPool.class);
+ WebSocketConnection wsConnection = new WebSocketConnection(endPoint, httpClient.getExecutor(), httpClient.getScheduler(), bufferPool, retainableByteBufferPool, coreSession);
wsClient.getEventListeners().forEach(wsConnection::addEventListener);
coreSession.setWebSocketConnection(wsConnection);
Exception listenerError = notifyUpgradeListeners((listener) -> listener.onHandshakeResponse(this, response));
diff --git a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
index 88bfcccfb0b7..2fa708160409 100644
--- a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
+++ b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
@@ -68,22 +68,6 @@ public class WebSocketConnection extends AbstractConnection implements Connectio
private boolean useInputDirectByteBuffers;
private boolean useOutputDirectByteBuffers;
- /**
- * Create a WSConnection.
- *
- * It is assumed that the WebSocket Upgrade Handshake has already
- * completed successfully before creating this connection.
- *
- */
- public WebSocketConnection(EndPoint endp,
- Executor executor,
- Scheduler scheduler,
- ByteBufferPool bufferPool,
- WebSocketCoreSession coreSession)
- {
- this(endp, executor, scheduler, bufferPool, null, coreSession, null);
- }
-
/**
* Create a WSConnection.
*
From 8efd144d51a8366ab835b5dac9c375d4ad13fe31 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 11:09:43 +0200
Subject: [PATCH 19/75] make RetainableByteBufferPool never null
Signed-off-by: Ludovic Orban
---
.../client/http/HttpReceiverOverHTTP.java | 19 ++++++++-------
.../client/http/HttpConnectionOverFCGI.java | 20 ++++++++--------
.../eclipse/jetty/http2/HTTP2Connection.java | 5 ++--
.../eclipse/jetty/io/AdapterMemoryPool.java | 23 +++++++++++++++++++
.../org/eclipse/jetty/io/ByteBufferPool.java | 2 +-
.../java/org/eclipse/jetty/io/MemoryPool.java | 21 +++++++++++++++++
.../jetty/io/RetainableByteBufferPool.java | 4 +++-
.../eclipse/jetty/io/ssl/SslConnection.java | 15 ++++++------
.../jetty/server/AbstractConnector.java | 5 ++--
.../eclipse/jetty/server/HttpConnection.java | 16 ++++++-------
.../jetty/server/SslConnectionFactory.java | 10 +++++++-
.../core/client/CoreClientUpgradeRequest.java | 7 +++++-
.../core/internal/WebSocketConnection.java | 9 ++++----
.../server/internal/AbstractHandshaker.java | 5 ++--
.../server/internal/RFC6455Handshaker.java | 10 +++++++-
.../server/internal/RFC8441Handshaker.java | 10 +++++++-
16 files changed, 128 insertions(+), 53 deletions(-)
create mode 100644 jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
create mode 100644 jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
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 78b24bfbb992..7e05d2b4fbca 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
@@ -29,8 +29,10 @@
import org.eclipse.jetty.http.HttpParser;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.BufferUtil;
@@ -44,6 +46,7 @@ public class HttpReceiverOverHTTP extends HttpReceiver implements HttpParser.Res
private final LongAdder inMessages = new LongAdder();
private final HttpParser parser;
+ private final MemoryPool retainableByteBufferPool;
private RetainableByteBuffer networkBuffer;
private boolean shutdown;
private boolean complete;
@@ -62,6 +65,11 @@ public HttpReceiverOverHTTP(HttpChannelOverHTTP channel)
parser.setHeaderCacheSize(httpTransport.getHeaderCacheSize());
parser.setHeaderCacheCaseSensitive(httpTransport.isHeaderCacheCaseSensitive());
}
+
+ MemoryPool retainableByteBufferPool = httpClient.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(httpClient.getByteBufferPool());
+ this.retainableByteBufferPool = retainableByteBufferPool;
}
@Override
@@ -113,16 +121,7 @@ private RetainableByteBuffer newNetworkBuffer()
{
HttpClient client = getHttpDestination().getHttpClient();
boolean direct = client.isUseInputDirectByteBuffers();
- RetainableByteBufferPool retainableByteBufferPool = client.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- {
- ByteBufferPool bufferPool = client.getByteBufferPool();
- return new RetainableByteBuffer(bufferPool, client.getResponseBufferSize(), direct);
- }
- else
- {
- return retainableByteBufferPool.acquire(client.getResponseBufferSize(), direct);
- }
+ return retainableByteBufferPool.acquire(client.getResponseBufferSize(), direct);
}
private void releaseNetworkBuffer()
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 1516c85056ee..efa800b6cd2d 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
@@ -44,8 +44,10 @@
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpHeaderValue;
import org.eclipse.jetty.io.AbstractConnection;
+import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Attachable;
@@ -72,6 +74,7 @@ public class HttpConnectionOverFCGI extends AbstractConnection implements IConne
private final ClientParser parser;
private RetainableByteBuffer networkBuffer;
private Object attachment;
+ private final MemoryPool retainableByteBufferPool;
public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, Promise promise)
{
@@ -82,6 +85,12 @@ public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, Pr
this.delegate = new Delegate(destination);
this.parser = new ClientParser(new ResponseListener());
requests.addLast(0);
+
+ HttpClient client = destination.getHttpClient();
+ MemoryPool retainableByteBufferPool = client.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(client.getByteBufferPool());
+ this.retainableByteBufferPool = retainableByteBufferPool;
}
public HttpDestination getHttpDestination()
@@ -136,16 +145,7 @@ private void reacquireNetworkBuffer()
private RetainableByteBuffer newNetworkBuffer()
{
HttpClient client = destination.getHttpClient();
- RetainableByteBufferPool retainableByteBufferPool = client.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- {
- ByteBufferPool bufferPool = client.getByteBufferPool();
- return new RetainableByteBuffer(bufferPool, client.getResponseBufferSize(), client.isUseInputDirectByteBuffers());
- }
- else
- {
- return retainableByteBufferPool.acquire(client.getResponseBufferSize(), client.isUseInputDirectByteBuffers());
- }
+ return retainableByteBufferPool.acquire(client.getResponseBufferSize(), client.isUseInputDirectByteBuffers());
}
private void releaseNetworkBuffer()
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
index 9e792794fb85..b2b62a4499ee 100644
--- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
@@ -26,6 +26,7 @@
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
@@ -51,7 +52,7 @@ public class HTTP2Connection extends AbstractConnection implements WriteFlusher.
private final HTTP2Producer producer = new HTTP2Producer();
private final AtomicLong bytesIn = new AtomicLong();
private final ByteBufferPool byteBufferPool;
- private final RetainableByteBufferPool retainableByteBufferPool;
+ private final MemoryPool retainableByteBufferPool;
private final Parser parser;
private final ISession session;
private final int bufferSize;
@@ -64,7 +65,7 @@ public HTTP2Connection(ByteBufferPool byteBufferPool, Executor executor, EndPoin
this(byteBufferPool, null, executor, endPoint, parser, session, bufferSize);
}
- public HTTP2Connection(ByteBufferPool byteBufferPool, RetainableByteBufferPool retainableByteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
+ public HTTP2Connection(ByteBufferPool byteBufferPool, MemoryPool retainableByteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
{
super(endPoint, executor);
this.byteBufferPool = byteBufferPool;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
new file mode 100644
index 000000000000..624678559d79
--- /dev/null
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
@@ -0,0 +1,23 @@
+package org.eclipse.jetty.io;
+
+public class AdapterMemoryPool implements MemoryPool
+{
+ private final ByteBufferPool byteBufferPool;
+
+ public AdapterMemoryPool(ByteBufferPool byteBufferPool)
+ {
+ this.byteBufferPool = byteBufferPool;
+ }
+
+ @Override
+ public RetainableByteBuffer acquire(int size, boolean direct)
+ {
+ return new RetainableByteBuffer(byteBufferPool, size, direct);
+ }
+
+ @Override
+ public void release(RetainableByteBuffer buffer)
+ {
+ buffer.release();
+ }
+}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java
index 2c67e29fdc6a..6e3cb418cca2 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java
@@ -30,7 +30,7 @@
* if they are released, they may be recycled and reused, otherwise they will be garbage
* collected as usual.
*/
-public interface ByteBufferPool
+public interface ByteBufferPool extends MemoryPool
{
/**
* Requests a {@link ByteBuffer} of the given size.
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
new file mode 100644
index 000000000000..b4eee4194c90
--- /dev/null
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
@@ -0,0 +1,21 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2021 Mort Bay Consulting Pty Ltd and others.
+//
+// This program and the accompanying materials are made available under the
+// terms of the Eclipse Public License v. 2.0 which is available at
+// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+// which is available at https://www.apache.org/licenses/LICENSE-2.0.
+//
+// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+// ========================================================================
+//
+
+package org.eclipse.jetty.io;
+
+public interface MemoryPool
+{
+ T acquire(int size, boolean direct);
+
+ void release(T buffer);
+}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
index 7e2f0a02dff7..5c6bd414f715 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
@@ -22,7 +22,7 @@
import org.eclipse.jetty.util.annotation.ManagedObject;
@ManagedObject
-public class RetainableByteBufferPool
+public class RetainableByteBufferPool implements MemoryPool
{
private final Pool[] _direct;
private final Pool[] _indirect;
@@ -57,6 +57,7 @@ public RetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, in
_indirect = indirectArray;
}
+ @Override
public RetainableByteBuffer acquire(int size, boolean direct)
{
int capacity = (bucketFor(size) + 1) * _factor;
@@ -84,6 +85,7 @@ public RetainableByteBuffer acquire(int size, boolean direct)
return buffer;
}
+ @Override
public void release(RetainableByteBuffer buffer)
{
if (buffer == null)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
index 472d44c596d1..9eef1d4a339f 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
@@ -32,9 +32,11 @@
import org.eclipse.jetty.io.AbstractConnection;
import org.eclipse.jetty.io.AbstractEndPoint;
+import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
@@ -109,7 +111,7 @@ private enum FlushState
private final AtomicLong _bytesIn = new AtomicLong();
private final AtomicLong _bytesOut = new AtomicLong();
private final ByteBufferPool _bufferPool;
- private final RetainableByteBufferPool _retainableBufferPool;
+ private final MemoryPool _retainableBufferPool;
private final SSLEngine _sslEngine;
private final DecryptedEndPoint _decryptedEndPoint;
private ByteBuffer _decryptedInput;
@@ -194,13 +196,15 @@ public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint
this(null, byteBufferPool, executor, endPoint, sslEngine, useDirectBuffersForEncryption, useDirectBuffersForDecryption);
}
- public SslConnection(RetainableByteBufferPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
+ public SslConnection(MemoryPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
boolean useDirectBuffersForEncryption, boolean useDirectBuffersForDecryption)
{
// This connection does not execute calls to onFillable(), so they will be called by the selector thread.
// onFillable() does not block and will only wakeup another thread to do the actual reading and handling.
super(endPoint, executor);
this._bufferPool = byteBufferPool;
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
this._retainableBufferPool = retainableByteBufferPool;
this._sslEngine = sslEngine;
this._decryptedEndPoint = newDecryptedEndPoint();
@@ -336,12 +340,7 @@ private int getBufferSize(ToIntFunction bufferSizeFn)
private void acquireEncryptedInput()
{
if (_encryptedInput == null)
- {
- if (_retainableBufferPool == null)
- _encryptedInput = new RetainableByteBuffer(_bufferPool, getPacketBufferSize(), _encryptedDirectBuffers);
- else
- _encryptedInput = _retainableBufferPool.acquire(getPacketBufferSize(), _encryptedDirectBuffers);
- }
+ _encryptedInput = _retainableBufferPool.acquire(getPacketBufferSize(), _encryptedDirectBuffers);
}
private void acquireEncryptedOutput()
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 eb3ffeccce31..bc8f67235a17 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
@@ -146,7 +146,6 @@ 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);
@@ -191,8 +190,8 @@ public AbstractConnector(
_byteBufferPool = pool != null ? pool : new ArrayByteBufferPool();
addBean(_byteBufferPool);
RetainableByteBufferPool retainableByteBufferPool = _server.getBean(RetainableByteBufferPool.class);
- _retainableByteBufferPool = retainableByteBufferPool != null ? retainableByteBufferPool : new RetainableByteBufferPool();
- addBean(_retainableByteBufferPool);
+ retainableByteBufferPool = retainableByteBufferPool != null ? retainableByteBufferPool : new RetainableByteBufferPool();
+ addBean(retainableByteBufferPool);
addEventListener(new Container.Listener()
{
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 661b96f570d2..5c0182ad4584 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
@@ -30,10 +30,12 @@
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http.PreEncodedHttpField;
import org.eclipse.jetty.io.AbstractConnection;
+import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.EofException;
+import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
@@ -57,7 +59,7 @@ public class HttpConnection extends AbstractConnection implements Runnable, Http
private final HttpConfiguration _config;
private final Connector _connector;
private final ByteBufferPool _bufferPool;
- private final RetainableByteBufferPool _retainableBufferPool;
+ private final MemoryPool _retainableByteBufferPool;
private final HttpInput _input;
private final HttpGenerator _generator;
private final HttpChannelOverHttp _channel;
@@ -97,7 +99,10 @@ public HttpConnection(HttpConfiguration config, Connector connector, EndPoint en
_config = config;
_connector = connector;
_bufferPool = _connector.getByteBufferPool();
- _retainableBufferPool = connector.getBean(RetainableByteBufferPool.class);
+ MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(_bufferPool);
+ _retainableByteBufferPool = retainableByteBufferPool;
_generator = newHttpGenerator();
_channel = newHttpChannel();
_input = _channel.getRequest().getHttpInput();
@@ -239,12 +244,7 @@ void releaseRequestBuffer()
public ByteBuffer getRequestBuffer()
{
if (_retainableByteBuffer == null)
- {
- if (_retainableBufferPool == null)
- _retainableByteBuffer = new RetainableByteBuffer(_bufferPool, getInputBufferSize(), isUseInputDirectByteBuffers());
- else
- _retainableByteBuffer = _retainableBufferPool.acquire(getInputBufferSize(), isUseInputDirectByteBuffers());
- }
+ _retainableByteBuffer = _retainableByteBufferPool.acquire(getInputBufferSize(), isUseInputDirectByteBuffers());
return _retainableByteBuffer.getBuffer();
}
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 6b523ccf58fe..53de2b62fe41 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
@@ -19,8 +19,12 @@
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.io.AbstractConnection;
+import org.eclipse.jetty.io.AdapterMemoryPool;
+import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
+import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.io.ssl.SslHandshakeListener;
@@ -161,7 +165,11 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine)
{
- return new SslConnection(connector.getBean(RetainableByteBufferPool.class), connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption());
+ ByteBufferPool byteBufferPool = connector.getByteBufferPool();
+ MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+ return new SslConnection(retainableByteBufferPool, byteBufferPool, connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption());
}
@Override
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 d30ac0bad0f2..8d0bc921edec 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
@@ -37,8 +37,11 @@
import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
+import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.MultiException;
@@ -448,7 +451,9 @@ else if (values.length == 1)
HttpClient httpClient = wsClient.getHttpClient();
ByteBufferPool bufferPool = wsClient.getWebSocketComponents().getBufferPool();
- RetainableByteBufferPool retainableByteBufferPool = wsClient.getWebSocketComponents().getBean(RetainableByteBufferPool.class);
+ MemoryPool retainableByteBufferPool = wsClient.getWebSocketComponents().getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(bufferPool);
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/internal/WebSocketConnection.java b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
index 2fa708160409..01199ebf2c32 100644
--- a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
+++ b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
@@ -26,8 +26,8 @@
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.component.Dumpable;
@@ -53,7 +53,7 @@ public class WebSocketConnection extends AbstractConnection implements Connectio
private final AutoLock lock = new AutoLock();
private final ByteBufferPool bufferPool;
- private final RetainableByteBufferPool retainableByteBufferPool;
+ private final MemoryPool retainableByteBufferPool;
private final Generator generator;
private final Parser parser;
private final WebSocketCoreSession coreSession;
@@ -79,7 +79,7 @@ public WebSocketConnection(EndPoint endp,
Executor executor,
Scheduler scheduler,
ByteBufferPool bufferPool,
- RetainableByteBufferPool retainableByteBufferPool,
+ MemoryPool retainableByteBufferPool,
WebSocketCoreSession coreSession)
{
this(endp, executor, scheduler, bufferPool, retainableByteBufferPool, coreSession, null);
@@ -103,7 +103,7 @@ public WebSocketConnection(EndPoint endp,
Executor executor,
Scheduler scheduler,
ByteBufferPool bufferPool,
- RetainableByteBufferPool retainableByteBufferPool,
+ MemoryPool retainableByteBufferPool,
WebSocketCoreSession coreSession,
Random randomMask)
{
@@ -113,6 +113,7 @@ public WebSocketConnection(EndPoint endp,
Objects.requireNonNull(coreSession, "Session");
Objects.requireNonNull(executor, "Executor");
Objects.requireNonNull(bufferPool, "ByteBufferPool");
+ Objects.requireNonNull(retainableByteBufferPool, "MemoryPool");
this.bufferPool = bufferPool;
this.retainableByteBufferPool = retainableByteBufferPool;
diff --git a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/AbstractHandshaker.java b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/AbstractHandshaker.java
index 734091f247e9..5dc951564c5f 100644
--- a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/AbstractHandshaker.java
+++ b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/internal/AbstractHandshaker.java
@@ -24,7 +24,8 @@
import org.eclipse.jetty.http.PreEncodedHttpField;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.MemoryPool;
+import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpTransport;
@@ -217,7 +218,7 @@ protected void handle(Runnable runnable)
protected abstract WebSocketConnection createWebSocketConnection(Request baseRequest, WebSocketCoreSession coreSession);
- protected WebSocketConnection newWebSocketConnection(EndPoint endPoint, Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, RetainableByteBufferPool retainableByteBufferPool, WebSocketCoreSession coreSession)
+ protected WebSocketConnection newWebSocketConnection(EndPoint endPoint, Executor executor, Scheduler scheduler, ByteBufferPool byteBufferPool, MemoryPool retainableByteBufferPool, WebSocketCoreSession coreSession)
{
return new WebSocketConnection(endPoint, executor, scheduler, byteBufferPool, retainableByteBufferPool, coreSession);
}
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 ee09b8660e5b..04afa058c276 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
@@ -23,6 +23,10 @@
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.PreEncodedHttpField;
+import org.eclipse.jetty.io.AdapterMemoryPool;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.MemoryPool;
+import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
@@ -95,7 +99,11 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web
{
HttpChannel httpChannel = baseRequest.getHttpChannel();
Connector connector = httpChannel.getConnector();
- return newWebSocketConnection(httpChannel.getEndPoint(), connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), connector.getBean(RetainableByteBufferPool.class), coreSession);
+ ByteBufferPool byteBufferPool = connector.getByteBufferPool();
+ MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+ return newWebSocketConnection(httpChannel.getEndPoint(), connector.getExecutor(), connector.getScheduler(), byteBufferPool, retainableByteBufferPool, coreSession);
}
@Override
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 af080fead85d..ee5a88975444 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
@@ -19,7 +19,11 @@
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.io.AdapterMemoryPool;
+import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
+import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
@@ -79,7 +83,11 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web
HttpChannel httpChannel = baseRequest.getHttpChannel();
Connector connector = httpChannel.getConnector();
EndPoint endPoint = httpChannel.getTunnellingEndPoint();
- return newWebSocketConnection(endPoint, connector.getExecutor(), connector.getScheduler(), connector.getByteBufferPool(), connector.getBean(RetainableByteBufferPool.class), coreSession);
+ ByteBufferPool byteBufferPool = connector.getByteBufferPool();
+ MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+ return newWebSocketConnection(endPoint, connector.getExecutor(), connector.getScheduler(), byteBufferPool, retainableByteBufferPool, coreSession);
}
@Override
From db9ba6c419958a19dd916d7032ff5e4c28a73e87 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 11:13:54 +0200
Subject: [PATCH 20/75] make RetainableByteBufferPool never null
Signed-off-by: Ludovic Orban
---
.../jetty/websocket/core/internal/WebSocketConnection.java | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
index 01199ebf2c32..eaceb90a380e 100644
--- a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
+++ b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/internal/WebSocketConnection.java
@@ -290,10 +290,7 @@ private void reacquireNetworkBuffer()
private RetainableByteBuffer newNetworkBuffer(int capacity)
{
- if (retainableByteBufferPool == null)
- return new RetainableByteBuffer(bufferPool, capacity, isUseInputDirectByteBuffers());
- else
- return retainableByteBufferPool.acquire(capacity, isUseInputDirectByteBuffers());
+ return retainableByteBufferPool.acquire(capacity, isUseInputDirectByteBuffers());
}
private void releaseNetworkBuffer()
From f8314ef96a5bc52a5de66d5add22fda38a1ac8d2 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 11:22:14 +0200
Subject: [PATCH 21/75] make H2 connection use RetainableByteBuffer pool
Signed-off-by: Ludovic Orban
---
.../eclipse/jetty/http2/HTTP2Connection.java | 44 +++++++++++++++----
.../jetty/io/RetainableByteBuffer.java | 4 +-
2 files changed, 37 insertions(+), 11 deletions(-)
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
index b2b62a4499ee..092ac53b1e14 100644
--- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
@@ -23,12 +23,12 @@
import org.eclipse.jetty.http2.frames.DataFrame;
import org.eclipse.jetty.http2.parser.Parser;
import org.eclipse.jetty.io.AbstractConnection;
+import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -51,7 +51,6 @@ public class HTTP2Connection extends AbstractConnection implements WriteFlusher.
private final Queue tasks = new ArrayDeque<>();
private final HTTP2Producer producer = new HTTP2Producer();
private final AtomicLong bytesIn = new AtomicLong();
- private final ByteBufferPool byteBufferPool;
private final MemoryPool retainableByteBufferPool;
private final Parser parser;
private final ISession session;
@@ -62,13 +61,12 @@ public class HTTP2Connection extends AbstractConnection implements WriteFlusher.
public HTTP2Connection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
{
- this(byteBufferPool, null, executor, endPoint, parser, session, bufferSize);
+ this(new AdapterMemoryPool(byteBufferPool), executor, endPoint, parser, session, bufferSize);
}
- public HTTP2Connection(ByteBufferPool byteBufferPool, MemoryPool retainableByteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
+ public HTTP2Connection(MemoryPool retainableByteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
{
super(endPoint, executor);
- this.byteBufferPool = byteBufferPool;
this.retainableByteBufferPool = retainableByteBufferPool;
this.parser = parser;
this.session = session;
@@ -430,16 +428,44 @@ public void onConnectionFailure(int error, String reason)
}
}
- private class NetworkBuffer extends RetainableByteBuffer implements Callback
+ private class NetworkBuffer implements Callback
{
+
+ private final RetainableByteBuffer delegate;
+
private NetworkBuffer()
{
- super(retainableByteBufferPool == null ? byteBufferPool : null, bufferSize, isUseInputDirectByteBuffers());
+ delegate = retainableByteBufferPool.acquire(bufferSize, isUseInputDirectByteBuffers());
+ }
+
+ public ByteBuffer getBuffer()
+ {
+ return delegate.getBuffer();
+ }
+
+ public int getReferences()
+ {
+ return delegate.getReferences();
+ }
+
+ public boolean hasRemaining()
+ {
+ return delegate.hasRemaining();
+ }
+
+ public int release()
+ {
+ return delegate.release();
+ }
+
+ public void retain()
+ {
+ delegate.retain();
}
private void put(ByteBuffer source)
{
- BufferUtil.append(getBuffer(), source);
+ BufferUtil.append(delegate.getBuffer(), source);
}
@Override
@@ -456,7 +482,7 @@ public void failed(Throwable failure)
private void completed(Throwable failure)
{
- if (release() == 0)
+ if (delegate.release() == 0)
{
if (LOG.isDebugEnabled())
LOG.debug("Released retained {}", this, failure);
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
index 29048f65abb6..03248d6ce525 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
@@ -34,12 +34,12 @@ public class RetainableByteBuffer implements Retainable, Attachable
private final AtomicInteger references;
private Pool.Entry entry;
- RetainableByteBuffer(int size, boolean direct)
+ protected RetainableByteBuffer(int size, boolean direct)
{
this(null, size, direct);
}
- public RetainableByteBuffer(ByteBufferPool pool, int size, boolean direct)
+ RetainableByteBuffer(ByteBufferPool pool, int size, boolean direct)
{
this.pool = pool;
if (pool != null)
From 27a94dbbd18a627818924e1f39781f005333cfe4 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 11:43:17 +0200
Subject: [PATCH 22/75] make H2 connection use RetainableByteBuffer pool
Signed-off-by: Ludovic Orban
---
.../http2/client/HTTP2ClientConnectionFactory.java | 14 +++++++++++---
.../org/eclipse/jetty/http2/HTTP2Connection.java | 9 +--------
.../AbstractHTTP2ServerConnectionFactory.java | 10 +++++++++-
.../jetty/http2/server/HTTP2ServerConnection.java | 7 ++++---
4 files changed, 25 insertions(+), 15 deletions(-)
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 228267b308f6..ffcdd0240cb8 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
@@ -27,10 +27,14 @@
import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
import org.eclipse.jetty.http2.generator.Generator;
import org.eclipse.jetty.http2.parser.Parser;
+import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.ClientConnectionFactory;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
+import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.component.LifeCycle;
@@ -67,7 +71,11 @@ public Connection newConnection(EndPoint endPoint, Map context)
parser.setMaxFrameLength(client.getMaxFrameLength());
parser.setMaxSettingsKeys(client.getMaxSettingsKeys());
- HTTP2ClientConnection connection = new HTTP2ClientConnection(client, byteBufferPool, executor, endPoint,
+ MemoryPool retainableByteBufferPool = client.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+
+ HTTP2ClientConnection connection = new HTTP2ClientConnection(client, retainableByteBufferPool, executor, endPoint,
parser, session, client.getInputBufferSize(), promise, listener);
connection.setUseInputDirectByteBuffers(client.isUseInputDirectByteBuffers());
connection.setUseOutputDirectByteBuffers(client.isUseOutputDirectByteBuffers());
@@ -81,9 +89,9 @@ private static class HTTP2ClientConnection extends HTTP2Connection implements Ca
private final Promise promise;
private final Session.Listener listener;
- private HTTP2ClientConnection(HTTP2Client client, ByteBufferPool byteBufferPool, Executor executor, EndPoint endpoint, Parser parser, ISession session, int bufferSize, Promise promise, Session.Listener listener)
+ private HTTP2ClientConnection(HTTP2Client client, MemoryPool retainableByteBufferPool, Executor executor, EndPoint endpoint, Parser parser, ISession session, int bufferSize, Promise promise, Session.Listener listener)
{
- super(byteBufferPool, executor, endpoint, parser, session, bufferSize);
+ super(retainableByteBufferPool, executor, endpoint, parser, session, bufferSize);
this.client = client;
this.promise = promise;
this.listener = listener;
diff --git a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
index 092ac53b1e14..eee8161e998f 100644
--- a/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
+++ b/jetty-http2/http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Connection.java
@@ -23,8 +23,6 @@
import org.eclipse.jetty.http2.frames.DataFrame;
import org.eclipse.jetty.http2.parser.Parser;
import org.eclipse.jetty.io.AbstractConnection;
-import org.eclipse.jetty.io.AdapterMemoryPool;
-import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
@@ -59,12 +57,7 @@ public class HTTP2Connection extends AbstractConnection implements WriteFlusher.
private boolean useInputDirectByteBuffers;
private boolean useOutputDirectByteBuffers;
- public HTTP2Connection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
- {
- this(new AdapterMemoryPool(byteBufferPool), executor, endPoint, parser, session, bufferSize);
- }
-
- public HTTP2Connection(MemoryPool retainableByteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
+ protected HTTP2Connection(MemoryPool retainableByteBufferPool, Executor executor, EndPoint endPoint, Parser parser, ISession session, int bufferSize)
{
super(endPoint, executor);
this.retainableByteBufferPool = retainableByteBufferPool;
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 76b91c92776b..a1bcbe60187b 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
@@ -35,8 +35,12 @@
import org.eclipse.jetty.http2.parser.RateControl;
import org.eclipse.jetty.http2.parser.ServerParser;
import org.eclipse.jetty.http2.parser.WindowRateControl;
+import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
+import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.AbstractConnectionFactory;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
@@ -279,7 +283,11 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
parser.setMaxFrameLength(getMaxFrameLength());
parser.setMaxSettingsKeys(getMaxSettingsKeys());
- HTTP2Connection connection = new HTTP2ServerConnection(connector.getByteBufferPool(), connector.getExecutor(),
+ MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(connector.getByteBufferPool());
+
+ HTTP2Connection connection = new HTTP2ServerConnection(retainableByteBufferPool, connector.getExecutor(),
endPoint, httpConfiguration, parser, session, getInputBufferSize(), listener);
connection.setUseInputDirectByteBuffers(isUseInputDirectByteBuffers());
connection.setUseOutputDirectByteBuffers(isUseOutputDirectByteBuffers());
diff --git a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java
index f3037941374c..67063fba9e98 100644
--- a/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java
+++ b/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/HTTP2ServerConnection.java
@@ -45,8 +45,9 @@
import org.eclipse.jetty.http2.frames.SettingsFrame;
import org.eclipse.jetty.http2.parser.ServerParser;
import org.eclipse.jetty.http2.parser.SettingsBodyParser;
-import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.MemoryPool;
+import org.eclipse.jetty.io.RetainableByteBuffer;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.util.BufferUtil;
@@ -87,9 +88,9 @@ public static boolean isSupportedProtocol(String protocol)
private final HttpConfiguration httpConfig;
private boolean recycleHttpChannels = true;
- public HTTP2ServerConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, HttpConfiguration httpConfig, ServerParser parser, ISession session, int inputBufferSize, ServerSessionListener listener)
+ public HTTP2ServerConnection(MemoryPool retainableByteBufferPool, Executor executor, EndPoint endPoint, HttpConfiguration httpConfig, ServerParser parser, ISession session, int inputBufferSize, ServerSessionListener listener)
{
- super(byteBufferPool, executor, endPoint, parser, session, inputBufferSize);
+ super(retainableByteBufferPool, executor, endPoint, parser, session, inputBufferSize);
this.listener = listener;
this.httpConfig = httpConfig;
}
From c4377848de2d3b3edc522216bbab23d8b911688b Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 13:21:10 +0200
Subject: [PATCH 23/75] add missing header
Signed-off-by: Ludovic Orban
---
.../org/eclipse/jetty/io/AdapterMemoryPool.java | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
index 624678559d79..d80f409240f6 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
@@ -1,3 +1,16 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2021 Mort Bay Consulting Pty Ltd and others.
+//
+// This program and the accompanying materials are made available under the
+// terms of the Eclipse Public License v. 2.0 which is available at
+// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+// which is available at https://www.apache.org/licenses/LICENSE-2.0.
+//
+// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+// ========================================================================
+//
+
package org.eclipse.jetty.io;
public class AdapterMemoryPool implements MemoryPool
From 6eef227fe22ca7889d5914b1e72103d1f4db58ca Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 17:57:55 +0200
Subject: [PATCH 24/75] generalize RetainableByteBuffer
Signed-off-by: Ludovic Orban
---
.../eclipse/jetty/io/AdapterMemoryPool.java | 8 ++-
.../jetty/io/RetainableByteBuffer.java | 61 +++----------------
.../jetty/io/RetainableByteBufferPool.java | 23 ++++++-
3 files changed, 35 insertions(+), 57 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
index d80f409240f6..e422c0d3f0a0 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
@@ -13,19 +13,25 @@
package org.eclipse.jetty.io;
+import java.nio.ByteBuffer;
+import java.util.function.Consumer;
+
public class AdapterMemoryPool implements MemoryPool
{
private final ByteBufferPool byteBufferPool;
+ private final Consumer releaser;
public AdapterMemoryPool(ByteBufferPool byteBufferPool)
{
this.byteBufferPool = byteBufferPool;
+ this.releaser = byteBufferPool::release;
}
@Override
public RetainableByteBuffer acquire(int size, boolean direct)
{
- return new RetainableByteBuffer(byteBufferPool, size, direct);
+ ByteBuffer byteBuffer = byteBufferPool.acquire(size, direct);
+ return new RetainableByteBuffer(byteBuffer, releaser);
}
@Override
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
index 03248d6ce525..4d432714bc25 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
@@ -15,10 +15,9 @@
import java.nio.ByteBuffer;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
-import org.eclipse.jetty.util.Attachable;
import org.eclipse.jetty.util.BufferUtil;
-import org.eclipse.jetty.util.Pool;
import org.eclipse.jetty.util.Retainable;
/**
@@ -27,30 +26,16 @@
* initially 1, incremented with {@link #retain()} and decremented with {@link #release()}. The buffer
* is released to the pool when the reference count is decremented to 0.
*/
-public class RetainableByteBuffer implements Retainable, Attachable
+public class RetainableByteBuffer implements Retainable
{
- private final ByteBufferPool pool;
private final ByteBuffer buffer;
private final AtomicInteger references;
- private Pool.Entry entry;
+ private final Consumer releaser;
- protected RetainableByteBuffer(int size, boolean direct)
+ RetainableByteBuffer(ByteBuffer buffer, Consumer releaser)
{
- this(null, size, direct);
- }
-
- RetainableByteBuffer(ByteBufferPool pool, int size, boolean direct)
- {
- this.pool = pool;
- if (pool != null)
- {
- this.buffer = pool.acquire(size, direct);
- }
- else
- {
- this.buffer = direct ? ByteBuffer.allocateDirect(size) : ByteBuffer.allocate(size);
- BufferUtil.clear(this.buffer);
- }
+ this.releaser = releaser;
+ this.buffer = buffer;
this.references = new AtomicInteger(1);
}
@@ -59,20 +44,6 @@ public int capacity()
return buffer.capacity();
}
- @Override
- public Object getAttachment()
- {
- return entry;
- }
-
- @Override
- public void setAttachment(Object attachment)
- {
- @SuppressWarnings("unchecked")
- Pool.Entry entry = (Pool.Entry)attachment;
- this.entry = entry;
- }
-
public ByteBuffer getBuffer()
{
return buffer;
@@ -91,30 +62,14 @@ public boolean isDirect()
@Override
public void retain()
{
- while (true)
- {
- int r = references.get();
- if (r == 0 && pool != null)
- throw new IllegalStateException("released " + this);
- if (references.compareAndSet(r, r + 1))
- break;
- }
+ references.incrementAndGet();
}
public int release()
{
int ref = references.decrementAndGet();
if (ref == 0)
- if (pool != null)
- {
- pool.release(buffer);
- }
- else
- {
- BufferUtil.clear(buffer);
- if (entry != null)
- entry.release();
- }
+ releaser.accept(buffer);
else if (ref < 0)
throw new IllegalStateException("already released " + this);
return ref;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
index 5c6bd414f715..0a7b204768b2 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
@@ -13,10 +13,13 @@
package org.eclipse.jetty.io;
+import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Objects;
+import java.util.function.Consumer;
import java.util.function.Supplier;
+import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Pool;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
@@ -63,19 +66,26 @@ public RetainableByteBuffer acquire(int size, boolean direct)
int capacity = (bucketFor(size) + 1) * _factor;
Pool bucket = bucketFor(size, direct, this::newBucket);
if (bucket == null)
- return new RetainableByteBuffer(capacity, direct);
+ return newRetainableByteBuffer(capacity, direct, byteBuffer -> {});
Pool.Entry entry = bucket.acquire();
RetainableByteBuffer buffer;
if (entry == null)
{
- buffer = new RetainableByteBuffer(capacity, direct);
Pool.Entry reservedEntry = bucket.reserve();
if (reservedEntry != null)
{
- buffer.setAttachment(reservedEntry);
+ buffer = newRetainableByteBuffer(capacity, direct, byteBuffer ->
+ {
+ BufferUtil.clear(byteBuffer);
+ reservedEntry.release();
+ });
reservedEntry.enable(buffer, true);
}
+ else
+ {
+ buffer = newRetainableByteBuffer(capacity, direct, byteBuffer -> {});
+ }
}
else
{
@@ -85,6 +95,13 @@ public RetainableByteBuffer acquire(int size, boolean direct)
return buffer;
}
+ private RetainableByteBuffer newRetainableByteBuffer(int capacity, boolean direct, Consumer releaser)
+ {
+ ByteBuffer buffer = direct ? ByteBuffer.allocateDirect(capacity) : ByteBuffer.allocate(capacity);
+ BufferUtil.clear(buffer);
+ return new RetainableByteBuffer(buffer, releaser);
+ }
+
@Override
public void release(RetainableByteBuffer buffer)
{
From 2f6000aa93f8d3247326c64fdc85f8a456320e16 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Wed, 9 Jun 2021 17:58:35 +0200
Subject: [PATCH 25/75] enable thread-local cache on the pool
Signed-off-by: Ludovic Orban
---
.../java/org/eclipse/jetty/io/RetainableByteBufferPool.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
index 0a7b204768b2..c5a852645478 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
@@ -136,7 +136,7 @@ private Pool[] bucketsFor(boolean direct)
private Pool newBucket()
{
- return new Pool<>(Pool.StrategyType.THREAD_ID, _maxBucketSize);
+ return new Pool<>(Pool.StrategyType.THREAD_ID, _maxBucketSize, true);
}
@ManagedAttribute("The number of pooled direct ByteBuffers")
From 1879cc958685baeba67d993b7c44a77edcc2e70c Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Thu, 10 Jun 2021 09:15:56 +0200
Subject: [PATCH 26/75] do not handle null retainableByteBufferPool
Signed-off-by: Ludovic Orban
---
.../java/org/eclipse/jetty/io/ssl/SslConnection.java | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
index 9eef1d4a339f..e0ec2579f29e 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
@@ -38,7 +38,6 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -111,7 +110,7 @@ private enum FlushState
private final AtomicLong _bytesIn = new AtomicLong();
private final AtomicLong _bytesOut = new AtomicLong();
private final ByteBufferPool _bufferPool;
- private final MemoryPool _retainableBufferPool;
+ private final MemoryPool _retainableByteBufferPool;
private final SSLEngine _sslEngine;
private final DecryptedEndPoint _decryptedEndPoint;
private ByteBuffer _decryptedInput;
@@ -193,7 +192,7 @@ public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint
public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
boolean useDirectBuffersForEncryption, boolean useDirectBuffersForDecryption)
{
- this(null, byteBufferPool, executor, endPoint, sslEngine, useDirectBuffersForEncryption, useDirectBuffersForDecryption);
+ this(new AdapterMemoryPool(byteBufferPool), byteBufferPool, executor, endPoint, sslEngine, useDirectBuffersForEncryption, useDirectBuffersForDecryption);
}
public SslConnection(MemoryPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
@@ -203,9 +202,7 @@ public SslConnection(MemoryPool retainableByteBufferPool,
// onFillable() does not block and will only wakeup another thread to do the actual reading and handling.
super(endPoint, executor);
this._bufferPool = byteBufferPool;
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
- this._retainableBufferPool = retainableByteBufferPool;
+ this._retainableByteBufferPool = retainableByteBufferPool;
this._sslEngine = sslEngine;
this._decryptedEndPoint = newDecryptedEndPoint();
this._encryptedDirectBuffers = useDirectBuffersForEncryption;
@@ -340,7 +337,7 @@ private int getBufferSize(ToIntFunction bufferSizeFn)
private void acquireEncryptedInput()
{
if (_encryptedInput == null)
- _encryptedInput = _retainableBufferPool.acquire(getPacketBufferSize(), _encryptedDirectBuffers);
+ _encryptedInput = _retainableByteBufferPool.acquire(getPacketBufferSize(), _encryptedDirectBuffers);
}
private void acquireEncryptedOutput()
From 5fc4f5140b2c5285f9bf5e41d8e1823fcede3737 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Thu, 10 Jun 2021 16:30:11 +0200
Subject: [PATCH 27/75] make http client register RetainableByteBufferPool
Signed-off-by: Ludovic Orban
---
.../src/main/java/org/eclipse/jetty/client/HttpClient.java | 3 +++
1 file changed, 3 insertions(+)
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 7e672fd42b55..87fe1befc296 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
@@ -58,6 +58,7 @@
import org.eclipse.jetty.io.ClientConnectionFactory;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.io.MappedByteBufferPool;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
import org.eclipse.jetty.util.Fields;
import org.eclipse.jetty.util.Jetty;
@@ -202,6 +203,8 @@ protected void doStart() throws Exception
Scheduler scheduler = getScheduler();
if (scheduler == null)
setScheduler(new ScheduledExecutorScheduler(name + "-scheduler", false));
+ if (getBean(RetainableByteBufferPool.class) == null)
+ addBean(new RetainableByteBufferPool(0, 2048, 65536, ProcessorUtils.availableProcessors() * 2));
if (resolver == null)
setSocketAddressResolver(new SocketAddressResolver.Async(getExecutor(), getScheduler(), getAddressResolutionTimeout()));
From 06580bf8f56b27fb2f7dadfe3fbda94f2afaa100 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Fri, 11 Jun 2021 08:58:03 +0200
Subject: [PATCH 28/75] fix concurrency
Signed-off-by: Ludovic Orban
---
.../jetty/io/RetainableByteBufferPool.java | 63 +++++++++----------
1 file changed, 28 insertions(+), 35 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
index c5a852645478..df520cba09e3 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
@@ -14,10 +14,8 @@
package org.eclipse.jetty.io;
import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Objects;
+import java.util.concurrent.atomic.AtomicReferenceArray;
import java.util.function.Consumer;
-import java.util.function.Supplier;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Pool;
@@ -27,8 +25,8 @@
@ManagedObject
public class RetainableByteBufferPool implements MemoryPool
{
- private final Pool[] _direct;
- private final Pool[] _indirect;
+ private final AtomicReferenceArray> _direct;
+ private final AtomicReferenceArray> _indirect;
private final int _factor;
private final int _maxBucketSize;
private final int _minCapacity;
@@ -52,19 +50,15 @@ public RetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, in
int length = maxCapacity / _factor;
- @SuppressWarnings("unchecked")
- Pool[] directArray = new Pool[length];
- _direct = directArray;
- @SuppressWarnings("unchecked")
- Pool[] indirectArray = new Pool[length];
- _indirect = indirectArray;
+ _direct = new AtomicReferenceArray<>(length);
+ _indirect = new AtomicReferenceArray<>(length);
}
@Override
public RetainableByteBuffer acquire(int size, boolean direct)
{
- int capacity = (bucketFor(size) + 1) * _factor;
- Pool bucket = bucketFor(size, direct, this::newBucket);
+ int capacity = (bucketIndexFor(size) + 1) * _factor;
+ Pool bucket = bucketFor(size, direct);
if (bucket == null)
return newRetainableByteBuffer(capacity, direct, byteBuffer -> {});
Pool.Entry entry = bucket.acquire();
@@ -110,35 +104,29 @@ public void release(RetainableByteBuffer buffer)
buffer.release();
}
- private Pool bucketFor(int capacity, boolean direct, Supplier> newBucket)
+ private Pool bucketFor(int capacity, boolean direct)
{
if (capacity < _minCapacity)
return null;
- int b = bucketFor(capacity);
- if (b >= _direct.length)
+ int idx = bucketIndexFor(capacity);
+ AtomicReferenceArray> buckets = direct ? _direct : _indirect;
+ if (idx >= buckets.length())
return null;
- Pool[] buckets = bucketsFor(direct);
- Pool bucket = buckets[b];
- if (bucket == null && newBucket != null)
- buckets[b] = bucket = newBucket.get();
+ Pool bucket = buckets.get(idx);
+ if (bucket == null)
+ {
+ bucket = new Pool<>(Pool.StrategyType.THREAD_ID, _maxBucketSize, true);
+ if (!buckets.compareAndSet(idx, null, bucket))
+ bucket = buckets.get(idx);
+ }
return bucket;
}
- private int bucketFor(int capacity)
+ private int bucketIndexFor(int capacity)
{
return (capacity - 1) / _factor;
}
- private Pool[] bucketsFor(boolean direct)
- {
- return direct ? _direct : _indirect;
- }
-
- private Pool newBucket()
- {
- return new Pool<>(Pool.StrategyType.THREAD_ID, _maxBucketSize, true);
- }
-
@ManagedAttribute("The number of pooled direct ByteBuffers")
public long getDirectByteBufferCount()
{
@@ -153,9 +141,14 @@ public long getHeapByteBufferCount()
private long getByteBufferCount(boolean direct)
{
- return Arrays.stream(bucketsFor(direct))
- .filter(Objects::nonNull)
- .mapToLong(Pool::size)
- .sum();
+ long total = 0L;
+ AtomicReferenceArray> buckets = direct ? _direct : _indirect;
+ for (int i = 0; i < buckets.length(); i++)
+ {
+ Pool bucket = buckets.getOpaque(i);
+ if (bucket != null)
+ total += bucket.size();
+ }
+ return total;
}
}
From 6085a77080856e496fc9b10566feafdb5f0be902 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Tue, 15 Jun 2021 10:40:50 +0200
Subject: [PATCH 29/75] add & fix javadoc
Signed-off-by: Ludovic Orban
---
.../org/eclipse/jetty/io/AdapterMemoryPool.java | 4 ++++
.../main/java/org/eclipse/jetty/io/MemoryPool.java | 14 ++++++++++++++
.../org/eclipse/jetty/io/RetainableByteBuffer.java | 2 +-
3 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
index e422c0d3f0a0..9e5913dfeb18 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
@@ -16,6 +16,10 @@
import java.nio.ByteBuffer;
import java.util.function.Consumer;
+/**
+ * An adapter class which exposes a {@link ByteBufferPool} as a
+ * {@link MemoryPool} of {@link RetainableByteBuffer}.
+ */
public class AdapterMemoryPool implements MemoryPool
{
private final ByteBufferPool byteBufferPool;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
index b4eee4194c90..3c486f78d554 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
@@ -13,9 +13,23 @@
package org.eclipse.jetty.io;
+/**
+ * A pool of memory buffers.
+ * @param The memory buffer type.
+ */
public interface MemoryPool
{
+ /**
+ * Acquire a memory buffer from the pool.
+ * @param size The size of the buffer. The returned buffer will have at least this capacity.
+ * @param direct true if a direct memory buffer is needed, false otherwise.
+ * @return a memory buffer.
+ */
T acquire(int size, boolean direct);
+ /**
+ * Release a previously acquired memory buffer to the pool.
+ * @param buffer the memory buffer to release.
+ */
void release(T buffer);
}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
index 4d432714bc25..879040b1cafe 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBuffer.java
@@ -22,7 +22,7 @@
/**
* A Retainable ByteBuffer.
- * Acquires a ByteBuffer from a {@link ByteBufferPool} and maintains a reference count that is
+ *
A ByteBuffer which maintains a reference count that is
* initially 1, incremented with {@link #retain()} and decremented with {@link #release()}. The buffer
* is released to the pool when the reference count is decremented to 0.
*/
From c00a37a1fe572ab38cb3d3aaa202feb45d1cda92 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Thu, 17 Jun 2021 11:33:50 +0200
Subject: [PATCH 30/75] improve javadoc
Signed-off-by: Ludovic Orban
---
jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
index 3c486f78d554..dd551383599b 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
@@ -14,7 +14,8 @@
package org.eclipse.jetty.io;
/**
- * A pool of memory buffers.
+ * A Pool of objects representing memory that can be acquired based on size and direction. The held instances may be the memory
+ * component itself (e.g.: {@link java.nio.ByteBuffer}) or an abstraction providing access to the memory component.
* @param The memory buffer type.
*/
public interface MemoryPool
From 3a98a3fc97c6bf35e5466ee01d3ef8f924c51afd Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Thu, 17 Jun 2021 11:42:26 +0200
Subject: [PATCH 31/75] pre-allocate buckets
Signed-off-by: Ludovic Orban
---
.../jetty/io/RetainableByteBufferPool.java | 45 ++++++++-----------
1 file changed, 19 insertions(+), 26 deletions(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
index df520cba09e3..5bb02c3ec9a1 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
@@ -14,7 +14,7 @@
package org.eclipse.jetty.io;
import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicReferenceArray;
+import java.util.Arrays;
import java.util.function.Consumer;
import org.eclipse.jetty.util.BufferUtil;
@@ -25,10 +25,9 @@
@ManagedObject
public class RetainableByteBufferPool implements MemoryPool
{
- private final AtomicReferenceArray> _direct;
- private final AtomicReferenceArray> _indirect;
+ private final Pool[] _direct;
+ private final Pool[] _indirect;
private final int _factor;
- private final int _maxBucketSize;
private final int _minCapacity;
public RetainableByteBufferPool()
@@ -39,7 +38,6 @@ public RetainableByteBufferPool()
public RetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, int maxBucketSize)
{
_factor = factor <= 0 ? 1024 : factor;
- _maxBucketSize = maxBucketSize;
if (minCapacity <= 0)
minCapacity = 0;
_minCapacity = minCapacity;
@@ -50,8 +48,17 @@ public RetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, in
int length = maxCapacity / _factor;
- _direct = new AtomicReferenceArray<>(length);
- _indirect = new AtomicReferenceArray<>(length);
+ @SuppressWarnings("unchecked")
+ Pool[] directArray = new Pool[length];
+ @SuppressWarnings("unchecked")
+ Pool[] indirectArray = new Pool[length];
+ for (int i = 0; i < directArray.length; i++)
+ {
+ directArray[i] = new Pool<>(Pool.StrategyType.THREAD_ID, maxBucketSize, true);
+ indirectArray[i] = new Pool<>(Pool.StrategyType.THREAD_ID, maxBucketSize, true);
+ }
+ _direct = directArray;
+ _indirect = indirectArray;
}
@Override
@@ -109,17 +116,10 @@ private Pool bucketFor(int capacity, boolean direct)
if (capacity < _minCapacity)
return null;
int idx = bucketIndexFor(capacity);
- AtomicReferenceArray> buckets = direct ? _direct : _indirect;
- if (idx >= buckets.length())
+ Pool[] buckets = direct ? _direct : _indirect;
+ if (idx >= buckets.length)
return null;
- Pool bucket = buckets.get(idx);
- if (bucket == null)
- {
- bucket = new Pool<>(Pool.StrategyType.THREAD_ID, _maxBucketSize, true);
- if (!buckets.compareAndSet(idx, null, bucket))
- bucket = buckets.get(idx);
- }
- return bucket;
+ return buckets[idx];
}
private int bucketIndexFor(int capacity)
@@ -141,14 +141,7 @@ public long getHeapByteBufferCount()
private long getByteBufferCount(boolean direct)
{
- long total = 0L;
- AtomicReferenceArray> buckets = direct ? _direct : _indirect;
- for (int i = 0; i < buckets.length(); i++)
- {
- Pool bucket = buckets.getOpaque(i);
- if (bucket != null)
- total += bucket.size();
- }
- return total;
+ Pool[] buckets = direct ? _direct : _indirect;
+ return Arrays.stream(buckets).mapToLong(Pool::size).sum();
}
}
From 3412ee7ce94423a421effbbf6717897553defd93 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Thu, 17 Jun 2021 13:21:42 +0200
Subject: [PATCH 32/75] add helper method that either finds or wraps a memory
pool
Signed-off-by: Ludovic Orban
---
.../jetty/client/http/HttpReceiverOverHTTP.java | 8 +-------
.../client/http/HttpConnectionOverFCGI.java | 8 +-------
.../client/HTTP2ClientConnectionFactory.java | 6 +-----
.../AbstractHTTP2ServerConnectionFactory.java | 6 +-----
.../java/org/eclipse/jetty/io/MemoryPool.java | 17 +++++++++++++++++
.../eclipse/jetty/server/HttpConnection.java | 7 +------
.../jetty/server/SslConnectionFactory.java | 6 +-----
.../core/client/CoreClientUpgradeRequest.java | 6 +-----
.../core/server/internal/RFC6455Handshaker.java | 6 +-----
.../core/server/internal/RFC8441Handshaker.java | 6 +-----
10 files changed, 26 insertions(+), 50 deletions(-)
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 7e05d2b4fbca..1c1a8c23256e 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
@@ -29,12 +29,9 @@
import org.eclipse.jetty.http.HttpParser;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.io.AdapterMemoryPool;
-import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.slf4j.Logger;
@@ -66,10 +63,7 @@ public HttpReceiverOverHTTP(HttpChannelOverHTTP channel)
parser.setHeaderCacheCaseSensitive(httpTransport.isHeaderCacheCaseSensitive());
}
- MemoryPool retainableByteBufferPool = httpClient.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(httpClient.getByteBufferPool());
- this.retainableByteBufferPool = retainableByteBufferPool;
+ this.retainableByteBufferPool = MemoryPool.findOrAdapt(httpClient, httpClient.getByteBufferPool());
}
@Override
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 efa800b6cd2d..b350119e1671 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
@@ -44,12 +44,9 @@
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpHeaderValue;
import org.eclipse.jetty.io.AbstractConnection;
-import org.eclipse.jetty.io.AdapterMemoryPool;
-import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Attachable;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -87,10 +84,7 @@ public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, Pr
requests.addLast(0);
HttpClient client = destination.getHttpClient();
- MemoryPool retainableByteBufferPool = client.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(client.getByteBufferPool());
- this.retainableByteBufferPool = retainableByteBufferPool;
+ this.retainableByteBufferPool = MemoryPool.findOrAdapt(client, client.getByteBufferPool());
}
public HttpDestination getHttpDestination()
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 ffcdd0240cb8..174d0ba4246d 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
@@ -27,14 +27,12 @@
import org.eclipse.jetty.http2.frames.WindowUpdateFrame;
import org.eclipse.jetty.http2.generator.Generator;
import org.eclipse.jetty.http2.parser.Parser;
-import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.ClientConnectionFactory;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.component.LifeCycle;
@@ -71,9 +69,7 @@ public Connection newConnection(EndPoint endPoint, Map context)
parser.setMaxFrameLength(client.getMaxFrameLength());
parser.setMaxSettingsKeys(client.getMaxSettingsKeys());
- MemoryPool retainableByteBufferPool = client.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+ MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(client, byteBufferPool);
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 a1bcbe60187b..adf989a6059f 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
@@ -35,12 +35,10 @@
import org.eclipse.jetty.http2.parser.RateControl;
import org.eclipse.jetty.http2.parser.ServerParser;
import org.eclipse.jetty.http2.parser.WindowRateControl;
-import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.AbstractConnectionFactory;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
@@ -283,9 +281,7 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
parser.setMaxFrameLength(getMaxFrameLength());
parser.setMaxSettingsKeys(getMaxSettingsKeys());
- MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(connector.getByteBufferPool());
+ MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(connector, connector.getByteBufferPool());
HTTP2Connection connection = new HTTP2ServerConnection(retainableByteBufferPool, connector.getExecutor(),
endPoint, httpConfiguration, parser, session, getInputBufferSize(), listener);
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
index dd551383599b..12c3fc6f42bc 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
@@ -13,6 +13,8 @@
package org.eclipse.jetty.io;
+import org.eclipse.jetty.util.component.Container;
+
/**
* A Pool of objects representing memory that can be acquired based on size and direction. The held instances may be the memory
* component itself (e.g.: {@link java.nio.ByteBuffer}) or an abstraction providing access to the memory component.
@@ -33,4 +35,19 @@ public interface MemoryPool
* @param buffer the memory buffer to release.
*/
void release(T buffer);
+
+ /**
+ * Find a {@link MemoryPool} of {@link RetainableByteBuffer} implementation in the given container, or wrap the given
+ * {@link ByteBufferPool} with an adapter.
+ * @param container the container to search for an existing memory pool.
+ * @param byteBufferPool the {@link ByteBufferPool} to wrap if no memory pool was found in the container.
+ * @return the memory pool found or the wrapped one.
+ */
+ static MemoryPool findOrAdapt(Container container, ByteBufferPool byteBufferPool)
+ {
+ MemoryPool retainableByteBufferPool = container.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+ return retainableByteBufferPool;
+ }
}
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 5c0182ad4584..77631da9c2ad 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
@@ -30,14 +30,12 @@
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http.PreEncodedHttpField;
import org.eclipse.jetty.io.AbstractConnection;
-import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.EofException;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -99,10 +97,7 @@ public HttpConnection(HttpConfiguration config, Connector connector, EndPoint en
_config = config;
_connector = connector;
_bufferPool = _connector.getByteBufferPool();
- MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(_bufferPool);
- _retainableByteBufferPool = retainableByteBufferPool;
+ _retainableByteBufferPool = MemoryPool.findOrAdapt(connector, _bufferPool);;
_generator = newHttpGenerator();
_channel = newHttpChannel();
_input = _channel.getRequest().getHttpInput();
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 53de2b62fe41..1542cef725bf 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
@@ -19,13 +19,11 @@
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.io.AbstractConnection;
-import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.io.ssl.SslHandshakeListener;
import org.eclipse.jetty.util.annotation.Name;
@@ -166,9 +164,7 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine)
{
ByteBufferPool byteBufferPool = connector.getByteBufferPool();
- MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+ MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(connector, byteBufferPool);
return new SslConnection(retainableByteBufferPool, byteBufferPool, connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption());
}
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 8d0bc921edec..9c68f66acac2 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
@@ -37,12 +37,10 @@
import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.MultiException;
import org.eclipse.jetty.util.QuotedStringTokenizer;
@@ -451,9 +449,7 @@ else if (values.length == 1)
HttpClient httpClient = wsClient.getHttpClient();
ByteBufferPool bufferPool = wsClient.getWebSocketComponents().getBufferPool();
- MemoryPool retainableByteBufferPool = wsClient.getWebSocketComponents().getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(bufferPool);
+ MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(wsClient.getWebSocketComponents(), bufferPool);
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-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 04afa058c276..fa99692f7eeb 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
@@ -23,11 +23,9 @@
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.PreEncodedHttpField;
-import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.Request;
@@ -100,9 +98,7 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web
HttpChannel httpChannel = baseRequest.getHttpChannel();
Connector connector = httpChannel.getConnector();
ByteBufferPool byteBufferPool = connector.getByteBufferPool();
- MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+ MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(connector, byteBufferPool);
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 ee5a88975444..f724dcf39209 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
@@ -19,12 +19,10 @@
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.Request;
@@ -84,9 +82,7 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web
Connector connector = httpChannel.getConnector();
EndPoint endPoint = httpChannel.getTunnellingEndPoint();
ByteBufferPool byteBufferPool = connector.getByteBufferPool();
- MemoryPool retainableByteBufferPool = connector.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+ MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(connector, byteBufferPool);
return newWebSocketConnection(endPoint, connector.getExecutor(), connector.getScheduler(), byteBufferPool, retainableByteBufferPool, coreSession);
}
From 066343c7c2824c215e97501928de4981ea448929 Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Fri, 18 Jun 2021 11:47:48 +0200
Subject: [PATCH 33/75] handle review comments
Signed-off-by: Ludovic Orban
---
.../client/http/HttpReceiverOverHTTP.java | 3 +-
.../client/http/HttpConnectionOverFCGI.java | 3 +-
.../client/HTTP2ClientConnectionFactory.java | 3 +-
.../AbstractHTTP2ServerConnectionFactory.java | 3 +-
.../eclipse/jetty/io/AdapterMemoryPool.java | 46 -------------------
.../java/org/eclipse/jetty/io/MemoryPool.java | 15 ------
.../jetty/io/RetainableByteBufferPool.java | 45 ++++++++++++++++++
.../eclipse/jetty/io/ssl/SslConnection.java | 3 +-
.../jetty/server/AbstractConnector.java | 3 +-
.../eclipse/jetty/server/HttpConnection.java | 3 +-
.../jetty/server/SslConnectionFactory.java | 3 +-
.../core/client/CoreClientUpgradeRequest.java | 3 +-
.../server/internal/RFC6455Handshaker.java | 3 +-
.../server/internal/RFC8441Handshaker.java | 3 +-
14 files changed, 66 insertions(+), 73 deletions(-)
delete mode 100644 jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
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 1c1a8c23256e..1f43fb22e1d3 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
@@ -32,6 +32,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.slf4j.Logger;
@@ -63,7 +64,7 @@ public HttpReceiverOverHTTP(HttpChannelOverHTTP channel)
parser.setHeaderCacheCaseSensitive(httpTransport.isHeaderCacheCaseSensitive());
}
- this.retainableByteBufferPool = MemoryPool.findOrAdapt(httpClient, httpClient.getByteBufferPool());
+ this.retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(httpClient, httpClient.getByteBufferPool());
}
@Override
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 b350119e1671..9bb6b2e953a4 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
@@ -47,6 +47,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Attachable;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -84,7 +85,7 @@ public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, Pr
requests.addLast(0);
HttpClient client = destination.getHttpClient();
- this.retainableByteBufferPool = MemoryPool.findOrAdapt(client, client.getByteBufferPool());
+ this.retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(client, client.getByteBufferPool());
}
public HttpDestination getHttpDestination()
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 174d0ba4246d..a2da424d754a 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
@@ -33,6 +33,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.component.LifeCycle;
@@ -69,7 +70,7 @@ public Connection newConnection(EndPoint endPoint, Map context)
parser.setMaxFrameLength(client.getMaxFrameLength());
parser.setMaxSettingsKeys(client.getMaxSettingsKeys());
- MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(client, byteBufferPool);
+ MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(client, byteBufferPool);
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 adf989a6059f..0181274655ef 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
@@ -39,6 +39,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.AbstractConnectionFactory;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
@@ -281,7 +282,7 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
parser.setMaxFrameLength(getMaxFrameLength());
parser.setMaxSettingsKeys(getMaxSettingsKeys());
- MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(connector, connector.getByteBufferPool());
+ MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, connector.getByteBufferPool());
HTTP2Connection connection = new HTTP2ServerConnection(retainableByteBufferPool, connector.getExecutor(),
endPoint, httpConfiguration, parser, session, getInputBufferSize(), listener);
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
deleted file mode 100644
index 9e5913dfeb18..000000000000
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/AdapterMemoryPool.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995-2021 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.io;
-
-import java.nio.ByteBuffer;
-import java.util.function.Consumer;
-
-/**
- * An adapter class which exposes a {@link ByteBufferPool} as a
- * {@link MemoryPool} of {@link RetainableByteBuffer}.
- */
-public class AdapterMemoryPool implements MemoryPool
-{
- private final ByteBufferPool byteBufferPool;
- private final Consumer releaser;
-
- public AdapterMemoryPool(ByteBufferPool byteBufferPool)
- {
- this.byteBufferPool = byteBufferPool;
- this.releaser = byteBufferPool::release;
- }
-
- @Override
- public RetainableByteBuffer acquire(int size, boolean direct)
- {
- ByteBuffer byteBuffer = byteBufferPool.acquire(size, direct);
- return new RetainableByteBuffer(byteBuffer, releaser);
- }
-
- @Override
- public void release(RetainableByteBuffer buffer)
- {
- buffer.release();
- }
-}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
index 12c3fc6f42bc..5a8704c00737 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/MemoryPool.java
@@ -35,19 +35,4 @@ public interface MemoryPool
* @param buffer the memory buffer to release.
*/
void release(T buffer);
-
- /**
- * Find a {@link MemoryPool} of {@link RetainableByteBuffer} implementation in the given container, or wrap the given
- * {@link ByteBufferPool} with an adapter.
- * @param container the container to search for an existing memory pool.
- * @param byteBufferPool the {@link ByteBufferPool} to wrap if no memory pool was found in the container.
- * @return the memory pool found or the wrapped one.
- */
- static MemoryPool findOrAdapt(Container container, ByteBufferPool byteBufferPool)
- {
- MemoryPool retainableByteBufferPool = container.getBean(RetainableByteBufferPool.class);
- if (retainableByteBufferPool == null)
- retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
- return retainableByteBufferPool;
- }
}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
index 5bb02c3ec9a1..c288b517d40b 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
@@ -21,6 +21,7 @@
import org.eclipse.jetty.util.Pool;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.component.Container;
@ManagedObject
public class RetainableByteBufferPool implements MemoryPool
@@ -144,4 +145,48 @@ private long getByteBufferCount(boolean direct)
Pool[] buckets = direct ? _direct : _indirect;
return Arrays.stream(buckets).mapToLong(Pool::size).sum();
}
+
+ /**
+ * Find a {@link MemoryPool} of {@link RetainableByteBuffer} implementation in the given container, or wrap the given
+ * {@link ByteBufferPool} with an adapter.
+ * @param container the container to search for an existing memory pool.
+ * @param byteBufferPool the {@link ByteBufferPool} to wrap if no memory pool was found in the container.
+ * @return the memory pool found or the wrapped one.
+ */
+ public static MemoryPool findOrAdapt(Container container, ByteBufferPool byteBufferPool)
+ {
+ MemoryPool retainableByteBufferPool = container == null ? null : container.getBean(RetainableByteBufferPool.class);
+ if (retainableByteBufferPool == null)
+ retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
+ return retainableByteBufferPool;
+ }
+
+ /**
+ * An adapter class which exposes a {@link ByteBufferPool} as a
+ * {@link MemoryPool} of {@link RetainableByteBuffer}.
+ */
+ private static class AdapterMemoryPool implements MemoryPool
+ {
+ private final ByteBufferPool byteBufferPool;
+ private final Consumer releaser;
+
+ public AdapterMemoryPool(ByteBufferPool byteBufferPool)
+ {
+ this.byteBufferPool = byteBufferPool;
+ this.releaser = byteBufferPool::release;
+ }
+
+ @Override
+ public RetainableByteBuffer acquire(int size, boolean direct)
+ {
+ ByteBuffer byteBuffer = byteBufferPool.acquire(size, direct);
+ return new RetainableByteBuffer(byteBuffer, releaser);
+ }
+
+ @Override
+ public void release(RetainableByteBuffer buffer)
+ {
+ buffer.release();
+ }
+ }
}
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
index e0ec2579f29e..0296769bcab1 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
@@ -38,6 +38,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -192,7 +193,7 @@ public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint
public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
boolean useDirectBuffersForEncryption, boolean useDirectBuffersForDecryption)
{
- this(new AdapterMemoryPool(byteBufferPool), byteBufferPool, executor, endPoint, sslEngine, useDirectBuffersForEncryption, useDirectBuffersForDecryption);
+ this(RetainableByteBufferPool.findOrAdapt(null, byteBufferPool), byteBufferPool, executor, endPoint, sslEngine, useDirectBuffersForEncryption, useDirectBuffersForDecryption);
}
public SslConnection(MemoryPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
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 bc8f67235a17..9a5d3b56a0f6 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
@@ -190,8 +190,7 @@ public AbstractConnector(
_byteBufferPool = pool != null ? pool : new ArrayByteBufferPool();
addBean(_byteBufferPool);
RetainableByteBufferPool retainableByteBufferPool = _server.getBean(RetainableByteBufferPool.class);
- retainableByteBufferPool = retainableByteBufferPool != null ? retainableByteBufferPool : new RetainableByteBufferPool();
- addBean(retainableByteBufferPool);
+ addBean(retainableByteBufferPool == null ? new RetainableByteBufferPool() : retainableByteBufferPool, retainableByteBufferPool == null);
addEventListener(new Container.Listener()
{
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 77631da9c2ad..fc115f0e97ba 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
@@ -36,6 +36,7 @@
import org.eclipse.jetty.io.EofException;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -97,7 +98,7 @@ public HttpConnection(HttpConfiguration config, Connector connector, EndPoint en
_config = config;
_connector = connector;
_bufferPool = _connector.getByteBufferPool();
- _retainableByteBufferPool = MemoryPool.findOrAdapt(connector, _bufferPool);;
+ _retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, _bufferPool);;
_generator = newHttpGenerator();
_channel = newHttpChannel();
_input = _channel.getRequest().getHttpInput();
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 1542cef725bf..b5c8f2da1b87 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
@@ -24,6 +24,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.io.ssl.SslHandshakeListener;
import org.eclipse.jetty.util.annotation.Name;
@@ -164,7 +165,7 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine)
{
ByteBufferPool byteBufferPool = connector.getByteBufferPool();
- MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(connector, byteBufferPool);
+ MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, byteBufferPool);
return new SslConnection(retainableByteBufferPool, byteBufferPool, connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption());
}
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 9c68f66acac2..8cbd29e87fa8 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
@@ -41,6 +41,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.MultiException;
import org.eclipse.jetty.util.QuotedStringTokenizer;
@@ -449,7 +450,7 @@ else if (values.length == 1)
HttpClient httpClient = wsClient.getHttpClient();
ByteBufferPool bufferPool = wsClient.getWebSocketComponents().getBufferPool();
- MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(wsClient.getWebSocketComponents(), bufferPool);
+ MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(wsClient.getWebSocketComponents(), bufferPool);
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-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 fa99692f7eeb..825937f4c39f 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
@@ -26,6 +26,7 @@
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.Request;
@@ -98,7 +99,7 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web
HttpChannel httpChannel = baseRequest.getHttpChannel();
Connector connector = httpChannel.getConnector();
ByteBufferPool byteBufferPool = connector.getByteBufferPool();
- MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(connector, byteBufferPool);
+ MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, byteBufferPool);
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 f724dcf39209..c2f833a0eb83 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
@@ -23,6 +23,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
+import org.eclipse.jetty.io.RetainableByteBufferPool;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.Request;
@@ -82,7 +83,7 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web
Connector connector = httpChannel.getConnector();
EndPoint endPoint = httpChannel.getTunnellingEndPoint();
ByteBufferPool byteBufferPool = connector.getByteBufferPool();
- MemoryPool retainableByteBufferPool = MemoryPool.findOrAdapt(connector, byteBufferPool);
+ MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, byteBufferPool);
return newWebSocketConnection(endPoint, connector.getExecutor(), connector.getScheduler(), byteBufferPool, retainableByteBufferPool, coreSession);
}
From 34bbce0be68599847236198d8e754cb22221ab9d Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Fri, 18 Jun 2021 12:37:07 +0200
Subject: [PATCH 34/75] handle review comments
Signed-off-by: Ludovic Orban
---
.../src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
index 0296769bcab1..21bee928eba2 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
@@ -32,7 +32,6 @@
import org.eclipse.jetty.io.AbstractConnection;
import org.eclipse.jetty.io.AbstractEndPoint;
-import org.eclipse.jetty.io.AdapterMemoryPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
From 5f0b54952c4559fca57cb65a149155da732d50ae Mon Sep 17 00:00:00 2001
From: Ludovic Orban
Date: Mon, 21 Jun 2021 09:12:40 +0200
Subject: [PATCH 35/75] rename
Signed-off-by: Ludovic Orban
---
.../main/java/org/eclipse/jetty/client/HttpClient.java | 6 +++---
.../eclipse/jetty/client/http/HttpReceiverOverHTTP.java | 4 ++--
.../jetty/fcgi/client/http/HttpConnectionOverFCGI.java | 4 ++--
.../jetty/http2/client/HTTP2ClientConnectionFactory.java | 4 ++--
.../server/AbstractHTTP2ServerConnectionFactory.java | 4 ++--
.../main/java/org/eclipse/jetty/io/ByteBufferPool.java | 2 +-
...fferPool.java => DefaultRetainableByteBufferPool.java} | 8 ++++----
.../main/java/org/eclipse/jetty/io/ssl/SslConnection.java | 4 ++--
...Test.java => DefaultRetainableByteBufferPoolTest.java} | 4 ++--
.../java/org/eclipse/jetty/server/AbstractConnector.java | 6 +++---
.../java/org/eclipse/jetty/server/HttpConnection.java | 4 ++--
.../org/eclipse/jetty/server/SslConnectionFactory.java | 4 ++--
.../websocket/core/client/CoreClientUpgradeRequest.java | 4 ++--
.../websocket/core/server/internal/RFC6455Handshaker.java | 4 ++--
.../websocket/core/server/internal/RFC8441Handshaker.java | 4 ++--
15 files changed, 33 insertions(+), 33 deletions(-)
rename jetty-io/src/main/java/org/eclipse/jetty/io/{RetainableByteBufferPool.java => DefaultRetainableByteBufferPool.java} (95%)
rename jetty-io/src/test/java/org/eclipse/jetty/io/{RetainableByteBufferPoolTest.java => DefaultRetainableByteBufferPoolTest.java} (93%)
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 87fe1befc296..ff44818d4322 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
@@ -58,7 +58,7 @@
import org.eclipse.jetty.io.ClientConnectionFactory;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.io.MappedByteBufferPool;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
import org.eclipse.jetty.util.Fields;
import org.eclipse.jetty.util.Jetty;
@@ -203,8 +203,8 @@ protected void doStart() throws Exception
Scheduler scheduler = getScheduler();
if (scheduler == null)
setScheduler(new ScheduledExecutorScheduler(name + "-scheduler", false));
- if (getBean(RetainableByteBufferPool.class) == null)
- addBean(new RetainableByteBufferPool(0, 2048, 65536, ProcessorUtils.availableProcessors() * 2));
+ if (getBean(DefaultRetainableByteBufferPool.class) == null)
+ addBean(new DefaultRetainableByteBufferPool(0, 2048, 65536, ProcessorUtils.availableProcessors() * 2));
if (resolver == null)
setSocketAddressResolver(new SocketAddressResolver.Async(getExecutor(), getScheduler(), getAddressResolutionTimeout()));
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 1f43fb22e1d3..3bec4d403b28 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
@@ -32,7 +32,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.slf4j.Logger;
@@ -64,7 +64,7 @@ public HttpReceiverOverHTTP(HttpChannelOverHTTP channel)
parser.setHeaderCacheCaseSensitive(httpTransport.isHeaderCacheCaseSensitive());
}
- this.retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(httpClient, httpClient.getByteBufferPool());
+ this.retainableByteBufferPool = DefaultRetainableByteBufferPool.findOrAdapt(httpClient, httpClient.getByteBufferPool());
}
@Override
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 9bb6b2e953a4..f5ac6733ee2f 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
@@ -47,7 +47,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.util.Attachable;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -85,7 +85,7 @@ public HttpConnectionOverFCGI(EndPoint endPoint, HttpDestination destination, Pr
requests.addLast(0);
HttpClient client = destination.getHttpClient();
- this.retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(client, client.getByteBufferPool());
+ this.retainableByteBufferPool = DefaultRetainableByteBufferPool.findOrAdapt(client, client.getByteBufferPool());
}
public HttpDestination getHttpDestination()
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 a2da424d754a..d420a1dcbcc3 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
@@ -33,7 +33,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.component.LifeCycle;
@@ -70,7 +70,7 @@ public Connection newConnection(EndPoint endPoint, Map context)
parser.setMaxFrameLength(client.getMaxFrameLength());
parser.setMaxSettingsKeys(client.getMaxSettingsKeys());
- MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(client, byteBufferPool);
+ MemoryPool retainableByteBufferPool = DefaultRetainableByteBufferPool.findOrAdapt(client, byteBufferPool);
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 0181274655ef..6673c1d658f1 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
@@ -39,7 +39,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.server.AbstractConnectionFactory;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
@@ -282,7 +282,7 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
parser.setMaxFrameLength(getMaxFrameLength());
parser.setMaxSettingsKeys(getMaxSettingsKeys());
- MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, connector.getByteBufferPool());
+ MemoryPool retainableByteBufferPool = DefaultRetainableByteBufferPool.findOrAdapt(connector, connector.getByteBufferPool());
HTTP2Connection connection = new HTTP2ServerConnection(retainableByteBufferPool, connector.getExecutor(),
endPoint, httpConfiguration, parser, session, getInputBufferSize(), listener);
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java
index 6e3cb418cca2..2c67e29fdc6a 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java
@@ -30,7 +30,7 @@
* if they are released, they may be recycled and reused, otherwise they will be garbage
* collected as usual.
*/
-public interface ByteBufferPool extends MemoryPool
+public interface ByteBufferPool
{
/**
* Requests a {@link ByteBuffer} of the given size.
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/DefaultRetainableByteBufferPool.java
similarity index 95%
rename from jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
rename to jetty-io/src/main/java/org/eclipse/jetty/io/DefaultRetainableByteBufferPool.java
index c288b517d40b..96b244c07095 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/RetainableByteBufferPool.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/DefaultRetainableByteBufferPool.java
@@ -24,19 +24,19 @@
import org.eclipse.jetty.util.component.Container;
@ManagedObject
-public class RetainableByteBufferPool implements MemoryPool
+public class DefaultRetainableByteBufferPool implements MemoryPool
{
private final Pool[] _direct;
private final Pool[] _indirect;
private final int _factor;
private final int _minCapacity;
- public RetainableByteBufferPool()
+ public DefaultRetainableByteBufferPool()
{
this(0, 1024, 65536, Integer.MAX_VALUE);
}
- public RetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, int maxBucketSize)
+ public DefaultRetainableByteBufferPool(int minCapacity, int factor, int maxCapacity, int maxBucketSize)
{
_factor = factor <= 0 ? 1024 : factor;
if (minCapacity <= 0)
@@ -155,7 +155,7 @@ private long getByteBufferCount(boolean direct)
*/
public static MemoryPool findOrAdapt(Container container, ByteBufferPool byteBufferPool)
{
- MemoryPool retainableByteBufferPool = container == null ? null : container.getBean(RetainableByteBufferPool.class);
+ MemoryPool retainableByteBufferPool = container == null ? null : container.getBean(DefaultRetainableByteBufferPool.class);
if (retainableByteBufferPool == null)
retainableByteBufferPool = new AdapterMemoryPool(byteBufferPool);
return retainableByteBufferPool;
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
index 21bee928eba2..8c49a537bf1c 100644
--- a/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
+++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java
@@ -37,7 +37,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -192,7 +192,7 @@ public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint
public SslConnection(ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
boolean useDirectBuffersForEncryption, boolean useDirectBuffersForDecryption)
{
- this(RetainableByteBufferPool.findOrAdapt(null, byteBufferPool), byteBufferPool, executor, endPoint, sslEngine, useDirectBuffersForEncryption, useDirectBuffersForDecryption);
+ this(DefaultRetainableByteBufferPool.findOrAdapt(null, byteBufferPool), byteBufferPool, executor, endPoint, sslEngine, useDirectBuffersForEncryption, useDirectBuffersForDecryption);
}
public SslConnection(MemoryPool retainableByteBufferPool, ByteBufferPool byteBufferPool, Executor executor, EndPoint endPoint, SSLEngine sslEngine,
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/RetainableByteBufferPoolTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/DefaultRetainableByteBufferPoolTest.java
similarity index 93%
rename from jetty-io/src/test/java/org/eclipse/jetty/io/RetainableByteBufferPoolTest.java
rename to jetty-io/src/test/java/org/eclipse/jetty/io/DefaultRetainableByteBufferPoolTest.java
index 12ff9f04490c..50a72c816a87 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/RetainableByteBufferPoolTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/DefaultRetainableByteBufferPoolTest.java
@@ -19,12 +19,12 @@
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.core.Is.is;
-public class RetainableByteBufferPoolTest
+public class DefaultRetainableByteBufferPoolTest
{
@Test
public void testAcquireRelease()
{
- RetainableByteBufferPool pool = new RetainableByteBufferPool();
+ DefaultRetainableByteBufferPool pool = new DefaultRetainableByteBufferPool();
for (int i = 0; i < 10; i++)
{
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 9a5d3b56a0f6..abb60663ad52 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
@@ -34,7 +34,7 @@
import org.eclipse.jetty.io.ArrayByteBufferPool;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.util.ProcessorUtils;
import org.eclipse.jetty.util.StringUtil;
@@ -189,8 +189,8 @@ 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 RetainableByteBufferPool() : retainableByteBufferPool, retainableByteBufferPool == null);
+ DefaultRetainableByteBufferPool retainableByteBufferPool = _server.getBean(DefaultRetainableByteBufferPool.class);
+ addBean(retainableByteBufferPool == null ? new DefaultRetainableByteBufferPool() : retainableByteBufferPool, retainableByteBufferPool == null);
addEventListener(new Container.Listener()
{
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 fc115f0e97ba..0e9a42fb1651 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
@@ -36,7 +36,7 @@
import org.eclipse.jetty.io.EofException;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
@@ -98,7 +98,7 @@ public HttpConnection(HttpConfiguration config, Connector connector, EndPoint en
_config = config;
_connector = connector;
_bufferPool = _connector.getByteBufferPool();
- _retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, _bufferPool);;
+ _retainableByteBufferPool = DefaultRetainableByteBufferPool.findOrAdapt(connector, _bufferPool);;
_generator = newHttpGenerator();
_channel = newHttpChannel();
_input = _channel.getRequest().getHttpInput();
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 b5c8f2da1b87..7792d82ecc69 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
@@ -24,7 +24,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.io.ssl.SslHandshakeListener;
import org.eclipse.jetty.util.annotation.Name;
@@ -165,7 +165,7 @@ public Connection newConnection(Connector connector, EndPoint endPoint)
protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine)
{
ByteBufferPool byteBufferPool = connector.getByteBufferPool();
- MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(connector, byteBufferPool);
+ MemoryPool retainableByteBufferPool = DefaultRetainableByteBufferPool.findOrAdapt(connector, byteBufferPool);
return new SslConnection(retainableByteBufferPool, byteBufferPool, connector.getExecutor(), endPoint, engine, isDirectBuffersForEncryption(), isDirectBuffersForDecryption());
}
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 8cbd29e87fa8..6fe026118ccb 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
@@ -41,7 +41,7 @@
import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.MultiException;
import org.eclipse.jetty.util.QuotedStringTokenizer;
@@ -450,7 +450,7 @@ else if (values.length == 1)
HttpClient httpClient = wsClient.getHttpClient();
ByteBufferPool bufferPool = wsClient.getWebSocketComponents().getBufferPool();
- MemoryPool retainableByteBufferPool = RetainableByteBufferPool.findOrAdapt(wsClient.getWebSocketComponents(), bufferPool);
+ MemoryPool retainableByteBufferPool = DefaultRetainableByteBufferPool.findOrAdapt(wsClient.getWebSocketComponents(), bufferPool);
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-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 825937f4c39f..d1ff8cbf7901 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
@@ -26,7 +26,7 @@
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.MemoryPool;
import org.eclipse.jetty.io.RetainableByteBuffer;
-import org.eclipse.jetty.io.RetainableByteBufferPool;
+import org.eclipse.jetty.io.DefaultRetainableByteBufferPool;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.Request;
@@ -99,7 +99,7 @@ protected WebSocketConnection createWebSocketConnection(Request baseRequest, Web
HttpChannel httpChannel = baseRequest.getHttpChannel();
Connector connector = httpChannel.getConnector();
ByteBufferPool byteBufferPool = connector.getByteBufferPool();
- MemoryPool