Author: jake
Date: Thu Dec 22 16:14:12 2011
New Revision: 1222317

URL: http://svn.apache.org/viewvc?rev=1222317&view=rev
Log:
Flush non-cfs backed secondary indexes along with memtables
Patch by tjake; reviewed by xedin for: CASSANDRA-3659


Modified:
    cassandra/branches/cassandra-1.0/CHANGES.txt
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java

Modified: cassandra/branches/cassandra-1.0/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/CHANGES.txt?rev=1222317&r1=1222316&r2=1222317&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0/CHANGES.txt (original)
+++ cassandra/branches/cassandra-1.0/CHANGES.txt Thu Dec 22 16:14:12 2011
@@ -7,6 +7,7 @@
    (CASSANDRA-3335)
 Merged from 0.8:
  * prevent new nodes from thinking down nodes are up forever (CASSANDRA-3626)
+ * Flush non-cfs backed secondary indexes (CASSANDRA-3659)
 
 
 1.0.6

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1222317&r1=1222316&r2=1222317&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
 Thu Dec 22 16:14:12 2011
@@ -49,6 +49,7 @@ import org.apache.cassandra.db.compactio
 import org.apache.cassandra.db.filter.IFilter;
 import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.filter.QueryPath;
+import org.apache.cassandra.db.index.SecondaryIndex;
 import org.apache.cassandra.db.index.SecondaryIndexManager;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.dht.*;
@@ -673,7 +674,7 @@ public class ColumnFamilyStore implement
             logger.debug("flush position is {}", ctx);
 
             // submit the memtable for any indexed sub-cfses, and our own.
-            List<ColumnFamilyStore> icc = new ArrayList<ColumnFamilyStore>();
+            final List<ColumnFamilyStore> icc = new 
ArrayList<ColumnFamilyStore>();
             // don't assume that this.memtable is dirty; forceFlush can bring 
us here during index build even if it is not
             for (ColumnFamilyStore cfs : concatWithIndexes())
             {
@@ -705,6 +706,19 @@ public class ColumnFamilyStore implement
                 public void runMayThrow() throws InterruptedException, 
IOException
                 {
                     latch.await();
+                    
+                    if (!icc.isEmpty())
+                    {
+                        //only valid when memtables exist
+                        
+                        for (SecondaryIndex index : 
indexManager.getIndexesNotBackedByCfs())
+                        {
+                            // flush any non-cfs backed indexes
+                            logger.info("Flushing SecondaryIndex {}", index);
+                            index.forceBlockingFlush();
+                        }
+                    }
+                    
                     if (writeCommitLog)
                     {
                         // if we're not writing to the commit log, we are 
replaying the log, so marking

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java?rev=1222317&r1=1222316&r2=1222317&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
 Thu Dec 22 16:14:12 2011
@@ -308,7 +308,27 @@ public class SecondaryIndexManager
         return cfsList;
     }
         
-   
+    /**
+     * @return all indexes which do *not* use a backing CFS internally
+     */
+    public Collection<SecondaryIndex> getIndexesNotBackedByCfs()
+    {
+        // we use identity map because per row indexes use same instance
+        // across many columns
+        IdentityHashMap<SecondaryIndex, Object> indexList = new 
IdentityHashMap<SecondaryIndex, Object>();
+
+        for (Map.Entry<ByteBuffer, SecondaryIndex> entry : 
indexesByColumn.entrySet())
+        {
+            ColumnFamilyStore cfs = entry.getValue().getIndexCfs();
+            
+            if (cfs == null)
+                indexList.put(entry.getValue(), null);        
+        }
+        
+        return indexList.keySet();
+    }
+    
+    
     /**
      * Removes obsolete index entries and creates new ones for the given row 
key
      * and mutated columns.


Reply via email to