Updated Branches: refs/heads/trunk e232407ad -> e3f642b8c
clean up unnecessary copy on KeyCache lookup patch by jbellis; reviewed by yukim for CASSANDRA-4732 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/e3f642b8 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/e3f642b8 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/e3f642b8 Branch: refs/heads/trunk Commit: e3f642b8c50db3af3f398d40dbad26f4c417eb16 Parents: e232407 Author: Jonathan Ellis <jbel...@apache.org> Authored: Fri Oct 5 11:47:18 2012 -0500 Committer: Jonathan Ellis <jbel...@apache.org> Committed: Fri Oct 5 11:47:54 2012 -0500 ---------------------------------------------------------------------- .../org/apache/cassandra/cache/KeyCacheKey.java | 3 ++ .../apache/cassandra/io/sstable/SSTableReader.java | 19 +++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/e3f642b8/src/java/org/apache/cassandra/cache/KeyCacheKey.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cache/KeyCacheKey.java b/src/java/org/apache/cassandra/cache/KeyCacheKey.java index ef0db40..509599b 100644 --- a/src/java/org/apache/cassandra/cache/KeyCacheKey.java +++ b/src/java/org/apache/cassandra/cache/KeyCacheKey.java @@ -28,6 +28,9 @@ import org.apache.cassandra.utils.Pair; public class KeyCacheKey implements CacheKey { public final Descriptor desc; + + // keeping an array instead of a ByteBuffer lowers the overhead of the key cache working set, + // without extra copies on lookup since client-provided key ByteBuffers will be array-backed already public final byte[] key; public KeyCacheKey(Descriptor desc, ByteBuffer key) http://git-wip-us.apache.org/repos/asf/cassandra/blob/e3f642b8/src/java/org/apache/cassandra/io/sstable/SSTableReader.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java index a67c1ab..aee576e 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java @@ -84,7 +84,7 @@ public class SSTableReader extends SSTable private IndexSummary indexSummary; private Filter bf; - private InstrumentingCache<KeyCacheKey, RowIndexEntry> keyCache; + private final InstrumentingCache<KeyCacheKey, RowIndexEntry> keyCache = CacheService.instance.keyCache; private final BloomFilterTracker bloomFilterTracker = new BloomFilterTracker(); @@ -311,7 +311,6 @@ public class SSTableReader extends SSTable public void setTrackedBy(DataTracker tracker) { - keyCache = CacheService.instance.keyCache; deletingTask.setTracker(tracker); } @@ -679,14 +678,14 @@ public class SSTableReader extends SSTable { CFMetaData.Caching caching = metadata.getCaching(); - if (keyCache == null - || caching == CFMetaData.Caching.NONE - || caching == CFMetaData.Caching.ROWS_ONLY - || keyCache.getCapacity() == 0) + if (caching == CFMetaData.Caching.NONE + || caching == CFMetaData.Caching.ROWS_ONLY + || keyCache.getCapacity() == 0) + { return; + } - // avoid keeping a permanent reference to the original key buffer - KeyCacheKey cacheKey = new KeyCacheKey(descriptor, ByteBufferUtil.clone(key.key)); + KeyCacheKey cacheKey = new KeyCacheKey(descriptor, key.key); logger.trace("Adding cache entry for {} -> {}", cacheKey, info); keyCache.put(cacheKey, info); } @@ -698,7 +697,7 @@ public class SSTableReader extends SSTable private RowIndexEntry getCachedPosition(KeyCacheKey unifiedKey, boolean updateStats) { - if (keyCache != null && keyCache.getCapacity() > 0) + if (keyCache.getCapacity() > 0) return updateStats ? keyCache.get(unifiedKey) : keyCache.getInternal(unifiedKey); return null; } @@ -798,7 +797,7 @@ public class SSTableReader extends SSTable { // read data position from index entry RowIndexEntry indexEntry = RowIndexEntry.serializer.deserialize(in, descriptor.version); - if (exactMatch && keyCache != null && keyCache.getCapacity() > 0 && updateCacheAndStats) + if (exactMatch && updateCacheAndStats) { assert key instanceof DecoratedKey; // key can be == to the index key only if it's a true row key DecoratedKey decoratedKey = (DecoratedKey)key;