You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2012/05/09 18:29:06 UTC
[5/5] git commit: enable keys cache and rows cache on index CFs based
on setting in data CF patch by yukim; reviewed by jbellis for CASSANDRA-4197
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 <jb...@apache.org>
Authored: Wed May 9 11:24:19 2012 -0500
Committer: Jonathan Ellis <jb...@apache.org>
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()