diff --git a/CHANGES.txt b/CHANGES.txt index c73c0a1e38..37a3b6b3aa 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -29,6 +29,7 @@ * re-set bootstrapped flag after move finishes (CASSANDRA-2435) * use 64KB flush buffer instead of in_memory_compaction_limit (CASSANDRA-2463) * fix duplicate results from CFS.scan (CASSANDRA-2406) + * avoid caching token-only decoratedkeys (CASSANDRA-2416) 0.7.4 diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java index 2d56ed17c4..6bbd830978 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java @@ -417,8 +417,9 @@ public class SSTableReader extends SSTable implements Comparable public void cacheKey(DecoratedKey key, Long info) { + assert key.key != null; // avoid keeping a permanent reference to the original key buffer - DecoratedKey copiedKey = new DecoratedKey(key.token, key.key == null ? null : ByteBufferUtil.clone(key.key)); + DecoratedKey copiedKey = new DecoratedKey(key.token, ByteBufferUtil.clone(key.key)); keyCache.put(new Pair(descriptor, copiedKey), info); } @@ -487,7 +488,8 @@ public class SSTableReader extends SSTable implements Comparable if (op == Operator.EQ) bloomFilterTracker.addTruePositive(); // store exact match for the key - cacheKey(decoratedKey, dataPosition); + if (decoratedKey.key != null) + cacheKey(decoratedKey, dataPosition); } return dataPosition; }