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()