Author: jbellis
Date: Sat Sep 18 07:19:15 2010
New Revision: 998419

URL: http://svn.apache.org/viewvc?rev=998419&view=rev
Log:
make IndexInterval configurable.  patch by Jon Hermes; reviewed by jbellis for 
CASSANDRA-1488

Modified:
    cassandra/branches/cassandra-0.6/CHANGES.txt
    cassandra/branches/cassandra-0.6/conf/storage-conf.xml
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/CompactionManager.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexSummary.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/SSTableReader.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java
    
cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/CompactionsTest.java

Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=998419&r1=998418&r2=998419&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Sat Sep 18 07:19:15 2010
@@ -21,6 +21,7 @@
  * nodes that coordinated a loadbalance in the past could not be seen by
    newly added nodes (CASSANDRA-1467)
  * use JNA, if present, to take snapshots (CASSANDRA-1371)
+ * make IndexInterval configurable (CASSANDRA-1488)
 
 
 0.6.5

Modified: cassandra/branches/cassandra-0.6/conf/storage-conf.xml
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/conf/storage-conf.xml?rev=998419&r1=998418&r2=998419&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/conf/storage-conf.xml (original)
+++ cassandra/branches/cassandra-0.6/conf/storage-conf.xml Sat Sep 18 07:19:15 
2010
@@ -51,6 +51,15 @@
   <HintedHandoffEnabled>true</HintedHandoffEnabled>
 
   <!--
+   ~ The Index Interval determines the rate of sampling of row keys
+   ~ is for a given SSTable: 1/IndexInterval keys are held in memory
+   ~ for the lifetime of the sstable for use during key lookup.
+   ~ (This is separate from the KeyCache.)  Larger intervals will result
+   ~ in lower memory usage at the cost of slower row lookup at read time.
+  -->
+  <IndexInterval>128</IndexInterval>
+
+  <!--
    ~ Keyspaces and ColumnFamilies:
    ~ A ColumnFamily is the Cassandra concept closest to a relational
    ~ table.  Keyspaces are separate groups of ColumnFamilies.  Except in

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=998419&r1=998418&r2=998419&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
 Sat Sep 18 07:19:15 2010
@@ -138,6 +138,8 @@ public class DatabaseDescriptor
 
     private static IAuthenticator authenticator = new AllowAllAuthenticator();
 
+    private static int indexinterval = 128;
+
     private final static String STORAGE_CONF_FILE = "storage-conf.xml";
 
     /**
@@ -494,6 +496,14 @@ public class DatabaseDescriptor
             if (logger.isDebugEnabled())
                 logger.debug("setting hintedHandoffEnabled to " + 
hintedHandoffEnabled);
 
+            String indexIntervalStr = 
xmlUtils.getNodeValue("/Storage/IndexInterval");
+            if (indexIntervalStr != null)
+            {
+                indexinterval = Integer.parseInt(indexIntervalStr);
+                if (indexinterval <= 0)
+                    throw new ConfigurationException("Index Interval must be a 
positive, non-zero integer.");
+            }
+
             readTablesFromXml();
             if (tables.isEmpty())
                 throw new ConfigurationException("No keyspaces configured");
@@ -1206,4 +1216,9 @@ public class DatabaseDescriptor
     {
         return hintedHandoffEnabled;
     }
+
+    public static int getIndexInterval()
+    {
+        return indexinterval;
+    }
 }

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/CompactionManager.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/CompactionManager.java?rev=998419&r1=998418&r2=998419&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/CompactionManager.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/CompactionManager.java
 Sat Sep 18 07:19:15 2010
@@ -270,7 +270,7 @@ public class CompactionManager implement
         long totalkeysWritten = 0;
 
         // TODO the int cast here is potentially buggy
-        int expectedBloomFilterSize = Math.max(SSTableReader.indexInterval(), 
(int)SSTableReader.getApproximateKeyCount(sstables));
+        int expectedBloomFilterSize = 
Math.max(DatabaseDescriptor.getIndexInterval(), 
(int)SSTableReader.getApproximateKeyCount(sstables));
         if (logger.isDebugEnabled())
           logger.debug("Expected bloom filter size : " + 
expectedBloomFilterSize);
 
@@ -354,7 +354,7 @@ public class CompactionManager implement
         long startTime = System.currentTimeMillis();
         long totalkeysWritten = 0;
 
-        int expectedBloomFilterSize = Math.max(SSTableReader.indexInterval(), 
(int)(SSTableReader.getApproximateKeyCount(sstables) / 2));
+        int expectedBloomFilterSize = 
Math.max(DatabaseDescriptor.getIndexInterval(), 
(int)(SSTableReader.getApproximateKeyCount(sstables) / 2));
         if (logger.isDebugEnabled())
           logger.debug("Expected bloom filter size : " + 
expectedBloomFilterSize);
 

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexSummary.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexSummary.java?rev=998419&r1=998418&r2=998419&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexSummary.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexSummary.java
 Sat Sep 18 07:19:15 2010
@@ -31,9 +31,6 @@ import org.apache.cassandra.db.Decorated
 
 public class IndexSummary
 {
-    /** Every 128th index entry is loaded into memory so we know where to 
start looking for the actual key w/o seeking */
-    public static final int INDEX_INTERVAL = 128;/* Required extension for 
temporary files created during compactions. */
-
     private ArrayList<KeyPosition> indexPositions;
     private Map<KeyPosition, SSTable.PositionSize> spannedIndexDataPositions;
     private Map<Long, KeyPosition> spannedIndexPositions;
@@ -44,7 +41,7 @@ public class IndexSummary
     {
         boolean spannedIndexEntry = DatabaseDescriptor.getIndexAccessMode() == 
DatabaseDescriptor.DiskAccessMode.mmap
                                     && 
SSTableReader.bufferIndex(indexPosition) != 
SSTableReader.bufferIndex(nextIndexPosition);
-        if ((keysWritten++ % INDEX_INTERVAL == 0) || spannedIndexEntry)
+        if ((keysWritten++ % DatabaseDescriptor.getIndexInterval() == 0) || 
spannedIndexEntry)
         {
             if (indexPositions == null)
             {

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/SSTableReader.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/SSTableReader.java?rev=998419&r1=998418&r2=998419&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/SSTableReader.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/SSTableReader.java
 Sat Sep 18 07:19:15 2010
@@ -85,11 +85,6 @@ public class SSTableReader extends SSTab
     // in a perfect world, BUFFER_SIZE would be final, but we need to test 
with a smaller size to stay sane.
     static long BUFFER_SIZE = Integer.MAX_VALUE;
 
-    public static int indexInterval()
-    {
-        return IndexSummary.INDEX_INTERVAL;
-    }
-
     public static long getApproximateKeyCount(Iterable<SSTableReader> sstables)
     {
         long count = 0;
@@ -97,7 +92,7 @@ public class SSTableReader extends SSTab
         for (SSTableReader sstable : sstables)
         {
             int indexKeyCount = sstable.getIndexPositions().size();
-            count = count + (indexKeyCount + 1) * IndexSummary.INDEX_INTERVAL;
+            count = count + (indexKeyCount + 1) * 
DatabaseDescriptor.getIndexInterval();
             if (logger.isDebugEnabled())
                 logger.debug("index size for bloom filter calc for file  : " + 
sstable.getFilename() + "   : " + count);
         }
@@ -223,7 +218,7 @@ public class SSTableReader extends SSTab
 
     public long estimatedKeys()
     {
-        return indexSummary.getIndexPositions().size() * 
IndexSummary.INDEX_INTERVAL;
+        return indexSummary.getIndexPositions().size() * 
DatabaseDescriptor.getIndexInterval();
     }
 
     void loadBloomFilter() throws IOException
@@ -345,6 +340,7 @@ public class SSTableReader extends SSTab
         // scan the on-disk index, starting at the nearest sampled position
         try
         {
+            int interval = DatabaseDescriptor.getIndexInterval();
             int i = 0;
             do
             {
@@ -398,7 +394,7 @@ public class SSTableReader extends SSTab
                     bloomFilterTracker.addFalsePositive();
                     return null;
                 }
-            } while  (++i < IndexSummary.INDEX_INTERVAL);
+            } while  (++i < interval);
         }
         finally
         {

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java?rev=998419&r1=998418&r2=998419&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java
 Sat Sep 18 07:19:15 2010
@@ -42,7 +42,6 @@ import org.apache.cassandra.dht.*;
 import org.apache.cassandra.gms.*;
 import org.apache.cassandra.io.DeletionService;
 import org.apache.cassandra.io.IndexSummary;
-import org.apache.cassandra.io.SSTableReader;
 import org.apache.cassandra.locator.*;
 import org.apache.cassandra.net.*;
 import org.apache.cassandra.service.AntiEntropyService.TreeRequestVerbHandler;
@@ -1301,7 +1300,7 @@ public class StorageService implements I
             }
         }
         FBUtilities.sortSampledKeys(keys, range);
-        int splits = keys.size() * SSTableReader.indexInterval() / 
keysPerSplit;
+        int splits = keys.size() * DatabaseDescriptor.getIndexInterval() / 
keysPerSplit;
 
         if (keys.size() >= splits)
         {

Modified: 
cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/CompactionsTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/CompactionsTest.java?rev=998419&r1=998418&r2=998419&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/CompactionsTest.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/test/unit/org/apache/cassandra/db/CompactionsTest.java
 Sat Sep 18 07:19:15 2010
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.net.InetAddress;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import java.util.ArrayList;
 import java.util.Set;
 import java.util.HashSet;
 
@@ -30,7 +29,7 @@ import org.apache.cassandra.Util;
 
 import org.junit.Test;
 
-import org.apache.cassandra.io.SSTableReader;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.CleanupHelper;
 import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.utils.FBUtilities;
@@ -53,7 +52,7 @@ public class CompactionsTest extends Cle
 
         final int ROWS_PER_SSTABLE = 10;
         Set<String> inserted = new HashSet<String>();
-        for (int j = 0; j < (SSTableReader.indexInterval() * 3) / 
ROWS_PER_SSTABLE; j++) {
+        for (int j = 0; j < (DatabaseDescriptor.getIndexInterval() * 3) / 
ROWS_PER_SSTABLE; j++) {
             for (int i = 0; i < ROWS_PER_SSTABLE; i++) {
                 String key = String.valueOf(i % 2);
                 RowMutation rm = new RowMutation(TABLE1, key);


Reply via email to