From 13d495aa7d5b7a7c121fcc9e105f79107c5c2a1c Mon Sep 17 00:00:00 2001 From: Jordan West Date: Mon, 10 Jan 2022 16:42:47 -0800 Subject: [PATCH] fix intermittent failures in nodetool toppartitions caused by failure to validate invalid bytes Patch by Jordan West; Reviewed by Brandon Williams and Cheng Wang for CASSANDRA-17254 --- CHANGES.txt | 1 + .../org/apache/cassandra/db/ColumnFamilyStore.java | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index bd78e9207c..95931e0485 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,6 @@ 3.0.29 * Fix running Ant rat targets without git (CASSANDRA-17974) + * Fix intermittent failure in nodetool toppartitions (CASSANDRA-17254) 3.0.28 diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index e7c186827b..6e321b226a 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -1625,12 +1625,14 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean TabularDataSupport result = new TabularDataSupport(COUNTER_TYPE); for (Counter counter : samplerResults.topK) { - byte[] key = counter.getItem().array(); + //Not duplicating the buffer for safety because AbstractSerializer and ByteBufferUtil.bytesToHex + //don't modify position or limit + ByteBuffer key = counter.getItem(); result.put(new CompositeDataSupport(COUNTER_COMPOSITE_TYPE, COUNTER_NAMES, new Object[] { - Hex.bytesToHex(key), // raw - counter.getCount(), // count - counter.getError(), // error - metadata.getKeyValidator().getString(ByteBuffer.wrap(key)) })); // string + ByteBufferUtil.bytesToHex(key), // raw + counter.getCount(), // count + counter.getError(), // error + metadata.getKeyValidator().getString(key) })); // string } return new CompositeDataSupport(SAMPLING_RESULT, SAMPLER_NAMES, new Object[]{ samplerResults.cardinality, result});