From 1fcabeea6c7d843b7a4b224794c95f7ba8ff8039 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Fri, 4 Apr 2025 20:02:48 -0700 Subject: [PATCH 1/4] Enhance buffer handling to reduce direct list access. --- .../connection/ByteBufferBsonOutput.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java b/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java index 40df1b867fd..009b069fe66 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java +++ b/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java @@ -43,6 +43,7 @@ public class ByteBufferBsonOutput extends OutputBuffer { private int curBufferIndex = 0; private int position = 0; private boolean closed; + private ByteBuf currentByteBuffer; /** * Construct an instance that uses the given buffer provider to allocate byte buffers as needs as it grows. @@ -91,13 +92,15 @@ public void writeByte(final int value) { } private ByteBuf getCurrentByteBuffer() { - ByteBuf curByteBuffer = getByteBufferAtIndex(curBufferIndex); - if (curByteBuffer.hasRemaining()) { - return curByteBuffer; + if (currentByteBuffer == null) { + currentByteBuffer = getByteBufferAtIndex(curBufferIndex); + } + if (currentByteBuffer.hasRemaining()) { + return currentByteBuffer; } - curBufferIndex++; - return getByteBufferAtIndex(curBufferIndex); + currentByteBuffer = getByteBufferAtIndex(++curBufferIndex); + return currentByteBuffer; } private ByteBuf getByteBufferAtIndex(final int index) { @@ -181,6 +184,10 @@ public void truncateToPosition(final int newPosition) { bufferList.get(bufferPositionPair.bufferIndex).position(bufferPositionPair.position); + if (bufferPositionPair.bufferIndex + 1 < bufferList.size()) { + currentByteBuffer = null; + } + while (bufferList.size() > bufferPositionPair.bufferIndex + 1) { ByteBuf buffer = bufferList.remove(bufferList.size() - 1); buffer.release(); @@ -243,10 +250,13 @@ boolean isOpen() { */ private void merge(final ByteBufferBsonOutput branch) { assertTrue(branch instanceof ByteBufferBsonOutput.Branch); - branch.bufferList.forEach(ByteBuf::retain); + for (ByteBuf byteBuf : branch.bufferList) { + byteBuf.retain(); + } bufferList.addAll(branch.bufferList); curBufferIndex += branch.curBufferIndex + 1; position += branch.position; + currentByteBuffer = null; } public static final class Branch extends ByteBufferBsonOutput { From e37e34552c0145dec5f55f812a90ec9b842bb60b Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Fri, 4 Apr 2025 20:14:29 -0700 Subject: [PATCH 2/4] Remove for-loop. --- .../com/mongodb/internal/connection/ByteBufferBsonOutput.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java b/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java index 009b069fe66..5af2ed4219b 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java +++ b/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java @@ -250,9 +250,7 @@ boolean isOpen() { */ private void merge(final ByteBufferBsonOutput branch) { assertTrue(branch instanceof ByteBufferBsonOutput.Branch); - for (ByteBuf byteBuf : branch.bufferList) { - byteBuf.retain(); - } + branch.bufferList.forEach(ByteBuf::retain); bufferList.addAll(branch.bufferList); curBufferIndex += branch.curBufferIndex + 1; position += branch.position; From 86109ccf203f2ba934e0b2f3209aa588cef671c8 Mon Sep 17 00:00:00 2001 From: Viacheslav Babanin Date: Fri, 11 Apr 2025 21:23:40 -0700 Subject: [PATCH 3/4] Update driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java Co-authored-by: Maxim Katcharov --- .../com/mongodb/internal/connection/ByteBufferBsonOutput.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java b/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java index 5af2ed4219b..a1312019bec 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java +++ b/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java @@ -99,7 +99,8 @@ private ByteBuf getCurrentByteBuffer() { return currentByteBuffer; } - currentByteBuffer = getByteBufferAtIndex(++curBufferIndex); + curBufferIndex++; + currentByteBuffer = getByteBufferAtIndex(curBufferIndex); return currentByteBuffer; } From 62a5f7c3ec7d5f1596a4b00d608df09cf34a52f3 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Tue, 15 Apr 2025 15:36:35 -0700 Subject: [PATCH 4/4] Nullify current byte buffer. --- .../com/mongodb/internal/connection/ByteBufferBsonOutput.java | 1 + 1 file changed, 1 insertion(+) diff --git a/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java b/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java index 36a363c06e8..56cc5d3e09b 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java +++ b/driver-core/src/main/com/mongodb/internal/connection/ByteBufferBsonOutput.java @@ -294,6 +294,7 @@ public void close() { for (final ByteBuf cur : bufferList) { cur.release(); } + currentByteBuffer = null; bufferList.clear(); closed = true; }