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.