From 28788cc6381bc6c517fa189adb0c42acc6ab2421 Mon Sep 17 00:00:00 2001 From: Dmitry Konstantinov Date: Sat, 23 May 2026 16:55:53 +0100 Subject: [PATCH] Avoid megamorphic call overhead at org.apache.cassandra.io.util.RandomAccessReader#current patch by Dmitry Konstantinov; reviewed by TBD for CASSANDRA-21399 --- .../v1/vector/RandomAccessReaderAdapter.java | 4 ++-- .../cassandra/io/util/RandomAccessReader.java | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/cassandra/index/sai/disk/v1/vector/RandomAccessReaderAdapter.java b/src/java/org/apache/cassandra/index/sai/disk/v1/vector/RandomAccessReaderAdapter.java index 7448dc0648a3..54371eafc131 100644 --- a/src/java/org/apache/cassandra/index/sai/disk/v1/vector/RandomAccessReaderAdapter.java +++ b/src/java/org/apache/cassandra/index/sai/disk/v1/vector/RandomAccessReaderAdapter.java @@ -46,7 +46,7 @@ static ReaderSupplier createSupplier(FileHandle fileHandle) @Override public void readFully(float[] dest) throws IOException { - BufferHolder bh = bufferHolder; + BufferHolder bh = getBufferHolder(); long position = getPosition(); FloatBuffer floatBuffer; @@ -94,7 +94,7 @@ public void read(int[] dest, int offset, int count) throws IOException if (count == 0) return; - BufferHolder bh = bufferHolder; + BufferHolder bh = getBufferHolder(); long position = getPosition(); IntBuffer intBuffer; diff --git a/src/java/org/apache/cassandra/io/util/RandomAccessReader.java b/src/java/org/apache/cassandra/io/util/RandomAccessReader.java index eb5a18240278..06d35a5b359c 100644 --- a/src/java/org/apache/cassandra/io/util/RandomAccessReader.java +++ b/src/java/org/apache/cassandra/io/util/RandomAccessReader.java @@ -38,7 +38,9 @@ public class RandomAccessReader extends RebufferingInputStream implements FileDa private long markedPointer; final Rebufferer rebufferer; - protected BufferHolder bufferHolder = Rebufferer.EMPTY; + private BufferHolder bufferHolder = Rebufferer.EMPTY; + + private long bufferHolderOffset = 0; /** * Only created through Builder @@ -67,7 +69,9 @@ private void reBufferAt(long position) bufferHolder.release(); bufferHolder = rebufferer.rebuffer(position); buffer = bufferHolder.buffer(); - buffer.position(Ints.checkedCast(position - bufferHolder.offset())); + long newOffset = bufferHolder.offset(); + bufferHolderOffset = newOffset; + buffer.position(Ints.checkedCast(position - newOffset)); assert buffer.order() == ByteOrder.BIG_ENDIAN : "Buffer must have BIG ENDIAN byte ordering"; } @@ -80,9 +84,14 @@ public long getFilePointer() return current(); } + protected BufferHolder getBufferHolder() + { + return bufferHolder; + } + protected long current() { - return bufferHolder.offset() + buffer.position(); + return bufferHolderOffset + buffer.position(); } public String getPath() @@ -164,6 +173,7 @@ public void close() rebufferer.closeReader(); buffer = null; bufferHolder = null; + bufferHolderOffset = 0; //For performance reasons we don't keep a reference to the file //channel so we don't close it @@ -197,7 +207,7 @@ public void seek(long newPosition) if (buffer == null) throw new IllegalStateException("Attempted to seek in a closed RAR"); - long bufferOffset = bufferHolder.offset(); + long bufferOffset = bufferHolderOffset; if (newPosition >= bufferOffset && newPosition < bufferOffset + buffer.limit()) { buffer.position((int) (newPosition - bufferOffset));