enable keys cache and rows cache on index CFs based on setting in data CF patch by yukim; reviewed by jbellis for CASSANDRA-4197
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/16d4c6c3 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/16d4c6c3 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/16d4c6c3 Branch: refs/heads/cassandra-1.1 Commit: 16d4c6c320cd98e3e7628a68bd6b4f20f9a365f4 Parents: 641346b Author: Jonathan Ellis <[email protected]> Authored: Wed May 9 11:24:19 2012 -0500 Committer: Jonathan Ellis <[email protected]> Committed: Wed May 9 11:24:19 2012 -0500 ---------------------------------------------------------------------- .../org/apache/cassandra/config/CFMetaData.java | 8 +++++- .../apache/cassandra/db/index/keys/KeysIndex.java | 19 +++++++++++++++ 2 files changed, 26 insertions(+), 1 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/16d4c6c3/src/java/org/apache/cassandra/config/CFMetaData.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index e903bd7..e36ea2d 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -326,11 +326,17 @@ public final class CFMetaData public static CFMetaData newIndexMetadata(CFMetaData parent, ColumnDefinition info, AbstractType<?> columnComparator) { + // Depends on parent's cache setting, turn on its index CF's cache. + // Here, only key cache is enabled, but later (in KeysIndex) row cache will be turned on depending on cardinality. + Caching indexCaching = parent.getCaching() == Caching.ALL || parent.getCaching() == Caching.KEYS_ONLY + ? Caching.KEYS_ONLY + : Caching.NONE; + return new CFMetaData(parent.ksName, parent.indexColumnFamilyName(info), ColumnFamilyType.Standard, columnComparator, null) .keyValidator(info.getValidator()) .readRepairChance(0.0) .dcLocalReadRepairChance(0.0) - .caching(Caching.NONE) + .caching(indexCaching) .reloadSecondaryIndexMetadata(parent); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/16d4c6c3/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java b/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java index fa663ca..3ee782b 100644 --- a/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java +++ b/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java @@ -61,6 +61,25 @@ public class KeysIndex extends PerColumnSecondaryIndex indexedCfMetadata.cfName, new LocalPartitioner(columnDef.getValidator()), indexedCfMetadata); + + // enable and initialize row cache based on parent's setting and indexed column's cardinality + CFMetaData.Caching baseCaching = baseCfs.metadata.getCaching(); + if (baseCaching == CFMetaData.Caching.ALL || baseCaching == CFMetaData.Caching.ROWS_ONLY) + { + /* + * # of index CF's key = cardinality of indexed column. + * if # of keys stored in index CF is more than average column counts (means tall table), + * then consider it as high cardinality. + */ + double estimatedKeys = indexCfs.estimateKeys(); + double averageColumnCount = indexCfs.getMeanColumns(); + if (averageColumnCount > 0 && estimatedKeys / averageColumnCount > 1) + { + logger.debug("turning row cache on for " + indexCfs.getColumnFamilyName()); + indexCfs.metadata.caching(baseCaching); + indexCfs.initRowCache(); + } + } } public static AbstractType<?> indexComparator()
