From 79c59347befe88a4f34b09dbeadd414125cf1e24 Mon Sep 17 00:00:00 2001 From: Jordan West Date: Sun, 13 Apr 2025 12:26:55 -0700 Subject: [PATCH] Don't allocate in ThreadLocalReadAheadBuffer#close() Patch by Jordan West; reviewed by Benedict Elliot Smith for CASSANDRA-20551 --- CHANGES.txt | 1 + .../io/util/ThreadLocalReadAheadBuffer.java | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 5ec727e79f..1791454d17 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 5.0.5 + * Don't allocate in ThreadLocalReadAheadBuffer#close() (CASSANDRA-20551) * Ensure RowFilter#isMutableIntersection() properly evaluates numeric ranges on a single column (CASSANDRA-20566) * Switch memtable-related off-heap objects to Native Endian and Memory to Little Endian (CASSANDRA-20190) * SAI marks an index as non-empty when a partial partition/row modifications is flushed due to repair (CASSANDRA-20567) diff --git a/src/java/org/apache/cassandra/io/util/ThreadLocalReadAheadBuffer.java b/src/java/org/apache/cassandra/io/util/ThreadLocalReadAheadBuffer.java index 824acaa8d8..bc92407bef 100644 --- a/src/java/org/apache/cassandra/io/util/ThreadLocalReadAheadBuffer.java +++ b/src/java/org/apache/cassandra/io/util/ThreadLocalReadAheadBuffer.java @@ -131,18 +131,21 @@ public final class ThreadLocalReadAheadBuffer public void clear(boolean deallocate) { - Block block = getBlock(); + // avoid calling block() here to reduce unintended allocations + Block block = blockMap.get().get(channel.filePath()); + if (block == null) + return; + block.index = -1; + if (block.buffer == null) + return; ByteBuffer blockBuffer = block.buffer; - if (blockBuffer != null) + blockBuffer.clear(); + if (deallocate) { - blockBuffer.clear(); - if (deallocate) - { - FileUtils.clean(blockBuffer); - block.buffer = null; - } + FileUtils.clean(blockBuffer); + block.buffer = null; } }