diff --git a/CHANGES.txt b/CHANGES.txt index 269976c2b9..f1547be019 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -5,7 +5,10 @@ * fixes for cache save/load (CASSANDRA-2172, -2174) * Handle whole-row deletions in CFOutputFormat (CASSANDRA-2014) * Make memtable_flush_writers flush in parallel (CASSANDRA-2178) - * refactor stress.py to have only one copy of the format string used for creating row keys (CASSANDRA-2108) + * make key cache preheating default to false; enable with + -Dcompaction_preheat_key_cache=true (CASSANDRA-2175) + * refactor stress.py to have only one copy of the format string + used for creating row keys (CASSANDRA-2108) 0.7.2 diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml index 9fea6b094e..b4a85edb72 100644 --- a/conf/cassandra.yaml +++ b/conf/cassandra.yaml @@ -226,6 +226,11 @@ column_index_size_in_kb: 64 # will be logged specifying the row key. in_memory_compaction_limit_in_mb: 64 +# Track cached row keys during compaction, and re-cache their new +# positions in the compacted sstable. Disable if you use really large +# key caches. +compaction_preheat_key_cache: true + # Time to wait for a reply from other nodes before failing the command rpc_timeout_in_ms: 10000 diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 76d6c078b4..3808f6d0a0 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -107,6 +107,7 @@ public class Config public Double reduce_cache_sizes_at = 1.0; public double reduce_cache_capacity_to = 0.6; public int hinted_handoff_throttle_delay_in_ms = 0; + public boolean compaction_preheat_key_cache = true; public static enum CommitLogSync { periodic, diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 760013cb03..a0747e9d9e 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -1174,4 +1174,9 @@ public class DatabaseDescriptor { return conf.hinted_handoff_throttle_delay_in_ms; } + + public static boolean getPreheatKeyCache() + { + return conf.compaction_preheat_key_cache; + } } diff --git a/src/java/org/apache/cassandra/db/CompactionManager.java b/src/java/org/apache/cassandra/db/CompactionManager.java index 155915f80e..b730b9c5d8 100644 --- a/src/java/org/apache/cassandra/db/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/CompactionManager.java @@ -430,12 +430,15 @@ public class CompactionManager implements CompactionManagerMBean long position = writer.append(row); totalkeysWritten++; - for (SSTableReader sstable : sstables) + if (DatabaseDescriptor.getPreheatKeyCache()) { - if (sstable.getCachedPosition(row.key) != null) + for (SSTableReader sstable : sstables) { - cachedKeys.put(row.key, position); - break; + if (sstable.getCachedPosition(row.key) != null) + { + cachedKeys.put(row.key, position); + break; + } } } } @@ -447,7 +450,7 @@ public class CompactionManager implements CompactionManagerMBean SSTableReader ssTable = writer.closeAndOpenReader(getMaxDataAge(sstables)); cfs.replaceCompactedSSTables(sstables, Arrays.asList(ssTable)); - for (Entry entry : cachedKeys.entrySet()) + for (Entry entry : cachedKeys.entrySet()) // empty if preheat is off ssTable.cacheKey(entry.getKey(), entry.getValue()); submitMinorIfNeeded(cfs);