diff --git a/conf/storage-conf.xml b/conf/storage-conf.xml
index 303c0c9d8e..bca2fab1a5 100644
--- a/conf/storage-conf.xml
+++ b/conf/storage-conf.xml
@@ -91,15 +91,16 @@
~ index. Consider increasing this if you have fewer, wider rows.
~ Set to 0 to disable entirely.
~
- ~ The optional RowsCachedFraction attribute specifies
- ~ The fraction of rows per sstable whose entire contents we cache in
- ~ memory. Do not use this on ColumnFamilies with large rows, or
+ ~ The optional RowsCached attribute specifies the number of rows
+ ~ whose entire contents we cache in memory, either as a fixed number
+ ~ of rows or as a percent of rows in the ColumnFamily.
+ ~ Do not use this on ColumnFamilies with large rows, or
~ ColumnFamilies with high write:read ratios. As with key caching,
~ valid values are from 0 to 1. The default 0 disables it entirely.
-->
@@ -107,6 +108,8 @@
CompareWith="UTF8Type"
CompareSubcolumnsWith="UTF8Type"
Name="Super1"
+ RowsCached="1000"
+ KeysCachedFraction="0"
Comment="A column family with supercolumns, whose column and subcolumn names are UTF8 strings"/>
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 426544b4c5..0ac09ebcb2 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -87,7 +87,7 @@ public class DatabaseDescriptor
private static int bmtThreshold_ = 256;
private static Map, Double> tableKeysCachedFractions_ = new HashMap, Double>();
- private static Map, Double> tableRowsCachedFractions_ = new HashMap, Double>();
+ private static Map, Double> tableRowCacheSizes = new HashMap, Double>();
/*
* A map from table names to the set of column families for the table and the
@@ -523,9 +523,16 @@ public class DatabaseDescriptor
tableKeysCachedFractions_.put(Pair.create(tName, cfName), Double.valueOf(value));
}
- if ((value = XMLUtils.getAttributeValue(columnFamily, "RowsCachedFraction")) != null)
+ if ((value = XMLUtils.getAttributeValue(columnFamily, "RowsCached")) != null)
{
- tableRowsCachedFractions_.put(Pair.create(tName, cfName), Double.valueOf(value));
+ if (value.endsWith("%"))
+ {
+ tableRowCacheSizes.put(Pair.create(tName, cfName), Double.valueOf(value.substring(0, value.length() - 1)) / 100);
+ }
+ else
+ {
+ tableRowCacheSizes.put(Pair.create(tName, cfName), Double.valueOf(value));
+ }
}
// Parse out user-specified logical names for the various dimensions
@@ -964,7 +971,7 @@ public class DatabaseDescriptor
public static double getRowsCachedFraction(String tableName, String columnFamilyName)
{
- Double v = tableRowsCachedFractions_.get(Pair.create(tableName, columnFamilyName));
+ Double v = tableRowCacheSizes.get(Pair.create(tableName, columnFamilyName));
return v == null ? 0 : v;
}
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index b3d339ce28..7429712606 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -191,7 +191,11 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
double v = DatabaseDescriptor.getRowsCachedFraction(table, columnFamilyName);
if (v > 0)
{
- int cacheSize = Math.max(1, (int)(v * SSTableReader.estimatedKeys(columnFamilyName)));
+ int cacheSize;
+ if (v < 1)
+ cacheSize = Math.max(1, (int)(v * SSTableReader.estimatedKeys(columnFamilyName)));
+ else
+ cacheSize = (int)v;
if (logger_.isDebugEnabled())
logger_.debug("enabling row cache for " + columnFamilyName + " with size " + cacheSize);
rowCache = new JMXInstrumentedCache(table, columnFamilyName + "RowCache", cacheSize);
diff --git a/test/conf/storage-conf.xml b/test/conf/storage-conf.xml
index f03bc6c658..0d975b23bc 100644
--- a/test/conf/storage-conf.xml
+++ b/test/conf/storage-conf.xml
@@ -44,11 +44,11 @@
0.00002
-
+
-
+