Author: jake Date: Mon Sep 12 19:16:30 2011 New Revision: 1169876 URL: http://svn.apache.org/viewvc?rev=1169876&view=rev Log: merge from 1.0.0
Added: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java - copied unchanged from r1169874, cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/PerRowSecondaryIndex.java - copied unchanged from r1169874, cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/index/PerRowSecondaryIndex.java Modified: cassandra/branches/cassandra-1.0/ (props changed) cassandra/branches/cassandra-1.0/CHANGES.txt cassandra/branches/cassandra-1.0/contrib/ (props changed) cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java (props changed) cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java (props changed) cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java (props changed) cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java (props changed) cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java (props changed) cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/ColumnFamilyStore.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionManager.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndex.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/thrift/ThriftValidation.java cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/CleanupTest.java cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java Propchange: cassandra/branches/cassandra-1.0/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Sep 12 19:16:30 2011 @@ -5,7 +5,7 @@ /cassandra/branches/cassandra-0.8.0:1125021-1130369 /cassandra/branches/cassandra-0.8.1:1101014-1125018 /cassandra/branches/cassandra-1.0:1167106,1167185 -/cassandra/branches/cassandra-1.0.0:1167104-1169843 +/cassandra/branches/cassandra-1.0.0:1167104-1169874 /cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1:1102511-1125020 /cassandra/trunk:1167085-1167102 Modified: cassandra/branches/cassandra-1.0/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/CHANGES.txt?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/CHANGES.txt (original) +++ cassandra/branches/cassandra-1.0/CHANGES.txt Mon Sep 12 19:16:30 2011 @@ -72,7 +72,7 @@ * rename CQL type names to match expected SQL behavior (CASSANDRA-3149, 3031) * Arena-based allocation for memtables (CASSANDRA-2252, 3162, 3163, 3168) * Default RR chance to 0.1 (CASSANDRA-3169) - + * Add RowLevel support to secondary index API (CASSANDRA-3147) 0.8.6 * avoid trying to watch cassandra-topology.properties when loaded from jar Propchange: cassandra/branches/cassandra-1.0/contrib/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Sep 12 19:16:30 2011 @@ -5,7 +5,7 @@ /cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369 /cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018 /cassandra/branches/cassandra-1.0/contrib:1167106,1167185 -/cassandra/branches/cassandra-1.0.0/contrib:1167104-1169843 +/cassandra/branches/cassandra-1.0.0/contrib:1167104-1169874 /cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/contrib:1102511-1125020 /cassandra/trunk/contrib:1167085-1167102 Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Sep 12 19:16:30 2011 @@ -5,7 +5,7 @@ /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1101014-1125018 /cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167106,1167185 -/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167104-1169843 +/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167104-1169874 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1102511-1125020 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167085-1167102 Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Sep 12 19:16:30 2011 @@ -5,7 +5,7 @@ /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1101014-1125018 /cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167106,1167185 -/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167104-1169843 +/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167104-1169874 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1102511-1125020 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167085-1167102 Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Sep 12 19:16:30 2011 @@ -5,7 +5,7 @@ /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1101014-1125018 /cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167106,1167185 -/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167104-1169843 +/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167104-1169874 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1102511-1125020 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167085-1167102 Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Sep 12 19:16:30 2011 @@ -5,7 +5,7 @@ /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1101014-1125018 /cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167106,1167185 -/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167104-1169843 +/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167104-1169874 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1102511-1125020 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167085-1167102 Propchange: cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Sep 12 19:16:30 2011 @@ -5,7 +5,7 @@ /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1101014-1125018 /cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167106,1167185 -/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167104-1169843 +/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167104-1169874 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689 /cassandra/tags/cassandra-0.8.0-rc1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1102511-1125020 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167085-1167102 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=1169876&r1=1169875&r2=1169876&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 Mon Sep 12 19:16:30 2011 @@ -159,7 +159,7 @@ public class ColumnFamilyStore implement /** ops count last time we computed liveRatio */ private final AtomicLong liveRatioComputedAt = new AtomicLong(32); - public void reload() + public void reload() throws IOException { // metadata object has been mutated directly. make all the members jibe with new settings. @@ -488,7 +488,7 @@ public class ColumnFamilyStore implement * @param ksName The keyspace name * @param cfName The columnFamily name */ - public static synchronized void loadNewSSTables(String ksName, String cfName) + public static synchronized void loadNewSSTables(String ksName, String cfName) { /** ks/cf existence checks will be done by open and getCFS methods for us */ Table table = Table.open(ksName); @@ -565,7 +565,14 @@ public class ColumnFamilyStore implement data.addSSTables(sstables); // this will call updateCacheSizes() for us logger.info("Requesting a full secondary index re-build for " + table.name + "/" + columnFamily); - indexManager.maybeBuildSecondaryIndexes(sstables, indexManager.getIndexedColumns()); + try + { + indexManager.maybeBuildSecondaryIndexes(sstables, indexManager.getIndexedColumns()); + } + catch (IOException e) + { + throw new IOError(e); + } logger.info("Setting up new generation: " + generation); fileIndexGenerator.set(generation); @@ -956,7 +963,7 @@ public class ColumnFamilyStore implement return invalid; } - public void removeAllSSTables() + public void removeAllSSTables() throws IOException { data.removeAllSSTables(); indexManager.removeAllIndexes(); Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/Table.java Mon Sep 12 19:16:30 2011 @@ -534,7 +534,14 @@ public class Table { ColumnFamily cf = readCurrentIndexedColumns(key, cfs, indexedColumns); if (cf != null) - cfs.indexManager.applyIndexUpdates(key.key, cf, cf.getColumnNames(), null); + try + { + cfs.indexManager.applyIndexUpdates(key.key, cf, cf.getColumnNames(), null); + } + catch (IOException e) + { + throw new IOError(e); + } } } finally Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionManager.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionManager.java?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionManager.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/compaction/CompactionManager.java Mon Sep 12 19:16:30 2011 @@ -45,13 +45,12 @@ import org.apache.cassandra.io.util.Rand import org.apache.cassandra.service.AntiEntropyService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.base.Predicates; import com.google.common.collect.Iterators; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * A singleton which manages a private executor of ongoing compactions. A readwrite lock * controls whether compactions can proceed: an external consumer can completely stop @@ -701,6 +700,8 @@ public class CompactionManager implement SSTableScanner scanner = sstable.getDirectScanner(); Collection<ByteBuffer> indexedColumns = cfs.indexManager.getIndexedColumns(); + List<IColumn> indexedColumnsInRow = null; + CleanupInfo ci = new CleanupInfo(sstable, scanner); executor.beginCompaction(ci); try @@ -719,17 +720,30 @@ public class CompactionManager implement } else { + cfs.invalidateCachedRow(row.getKey()); + if (!indexedColumns.isEmpty() || isCommutative) { + if (indexedColumnsInRow != null) + indexedColumnsInRow.clear(); + while (row.hasNext()) { IColumn column = row.next(); if (column instanceof CounterColumn) renewer.maybeRenew((CounterColumn) column); if (indexedColumns.contains(column.name())) - cfs.indexManager.deleteFromIndex(row.getKey().key, column); + { + if (indexedColumnsInRow == null) + indexedColumnsInRow = new ArrayList<IColumn>(); + + indexedColumnsInRow.add(column); + } } + + if (indexedColumnsInRow != null && !indexedColumnsInRow.isEmpty()) + cfs.indexManager.deleteFromIndexes(row.getKey(), indexedColumnsInRow); } } } @@ -758,19 +772,9 @@ public class CompactionManager implement logger.info(String.format(format, writer.getFilename(), startsize, endsize, (int)(ratio*100), totalkeysWritten, dTime)); } - // flush to ensure we don't lose the tombstones on a restart, since they are not commitlog'd - try - { - cfs.indexManager.flushIndexes(); - } - catch (ExecutionException e) - { - throw new IOException(e); - } - catch (InterruptedException e) - { - throw new IOException(e); - } + // flush to ensure we don't lose the tombstones on a restart, since they are not commitlog'd + cfs.indexManager.flushIndexes(); + cfs.replaceCompactedSSTables(Arrays.asList(sstable), results); } Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndex.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndex.java?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndex.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndex.java Mon Sep 12 19:16:30 2011 @@ -20,19 +20,17 @@ package org.apache.cassandra.db.index; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.Collections; -import java.util.Set; -import java.util.TreeSet; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; +import java.util.*; +import java.util.concurrent.*; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.config.ConfigurationException; -import org.apache.cassandra.db.*; +import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.SystemTable; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.index.keys.KeysIndex; import org.apache.cassandra.io.sstable.ReducingKeyIterator; +import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +38,7 @@ import org.slf4j.LoggerFactory; /** * Abstract base class for different types of secondary indexes. * - * This abstraction assumes there is one column per index instance + * Do not extend this directly, please pick from PerColumnSecondaryIndex or PerRowSecondaryIndex */ public abstract class SecondaryIndex { @@ -56,9 +54,9 @@ public abstract class SecondaryIndex /** - * The column definition which this index is responsible for + * The column definitions which this index is responsible for */ - protected ColumnDefinition columnDef; + protected Set<ColumnDefinition> columnDefs = Collections.newSetFromMap(new ConcurrentHashMap<ColumnDefinition,Boolean>()); /** * Perform any initialization work @@ -77,44 +75,28 @@ public abstract class SecondaryIndex */ abstract public String getIndexName(); - - /** - * Delete a column from the index - * - * @param valueKey the column value which is used as the index key - * @param rowKey the underlying row key which is indexed - * @param col all the column info - */ - public abstract void deleteColumn(DecoratedKey<?> valueKey, ByteBuffer rowKey, IColumn col); /** - * insert a column to the index + * Return the unique name for this index and column + * to be stored in the SystemTable that tracks if each column is built * - * @param valueKey the column value which is used as the index key - * @param rowKey the underlying row key which is indexed - * @param col all the column info + * @param columnName the name of the column + * @return the unique name */ - public abstract void insertColumn(DecoratedKey<?> valueKey, ByteBuffer rowKey, IColumn col); - + abstract public String getNameForSystemTable(ByteBuffer columnName); + /** - * update a column from the index + * Checks if the index for specified column is fully built * - * @param valueKey the column value which is used as the index key - * @param rowKey the underlying row key which is indexed - * @param col all the column info + * @param columnName the column + * @return true if the index is fully built */ - public abstract void updateColumn(DecoratedKey<?> valueKey, ByteBuffer rowKey, IColumn col); - + public boolean isIndexBuilt(ByteBuffer columnName) + { + return SystemTable.isIndexBuilt(baseCfs.table.name, getNameForSystemTable(columnName)); + } /** - * Called after a number of insert/delete calls - * this is required for indexes that keep many columns per row - * depends on the underlying impl - * @param rowKey the row identifier that was completed - */ - public abstract void commitRow(ByteBuffer rowKey); - - /** * Called at query time * Creates a implementation specific searcher instance for this index type * @param columns the list of columns which belong to this index type @@ -124,31 +106,22 @@ public abstract class SecondaryIndex /** * Forces this indexes in memory data to disk - * @throws ExecutionException - * @throws InterruptedException + * @throws IOException */ - public abstract void forceBlockingFlush() throws ExecutionException, InterruptedException; + public abstract void forceBlockingFlush() throws IOException; /** * Allow access to the underlying column family store if there is one * @return the underlying column family store or null */ public abstract ColumnFamilyStore getUnderlyingCfs(); - - - /** - * Check if index is already built for current store - * @return true if built, false otherwise - */ - public boolean isIndexBuilt() - { - return SystemTable.isIndexBuilt(baseCfs.table.name, getIndexName()); - } + /** * Delete all files and references to this index + * @param columnName the indexed column to remove */ - public abstract void removeIndex(); + public abstract void removeIndex(ByteBuffer columnName) throws IOException; /** * Renames the underlying index files to reflect the new CF name @@ -167,13 +140,18 @@ public abstract class SecondaryIndex * Builds the index using the data in the underlying CFS * Blocks till it's complete */ - protected void buildIndexBlocking() + protected void buildIndexBlocking() throws IOException { logger.info(String.format("Submitting index build of %s for data in %s", - baseCfs.metadata.comparator.getString(columnDef.name), StringUtils.join(baseCfs.getSSTables(), ", "))); + getIndexName(), StringUtils.join(baseCfs.getSSTables(), ", "))); + SortedSet<ByteBuffer> columnNames = new TreeSet<ByteBuffer>(); + + for (ColumnDefinition cdef : columnDefs) + columnNames.add(cdef.name); + SecondaryIndexBuilder builder = new SecondaryIndexBuilder(baseCfs, - new TreeSet<ByteBuffer>(Collections.singleton(columnDef.name)), + columnNames, new ReducingKeyIterator(baseCfs.getSSTables())); Future<?> future = CompactionManager.instance.submitIndexBuild(builder); @@ -181,7 +159,17 @@ public abstract class SecondaryIndex { future.get(); forceBlockingFlush(); - SystemTable.setIndexBuilt(baseCfs.table.name, getIndexName()); + + // Mark all indexed columns as built + if (this instanceof PerRowSecondaryIndex) + { + for (ByteBuffer columnName : columnNames) + SystemTable.setIndexBuilt(baseCfs.table.name, getIndexName()+ByteBufferUtil.string(columnName)); + } + else + { + SystemTable.setIndexBuilt(baseCfs.table.name, getIndexName()); + } } catch (InterruptedException e) { @@ -189,22 +177,34 @@ public abstract class SecondaryIndex } catch (ExecutionException e) { - throw new RuntimeException(e); + throw new IOException(e); } - logger.info("Index build of " + baseCfs.metadata.comparator.getString(columnDef.name) + " complete"); + logger.info("Index build of " + getIndexName() + " complete"); } /** * Builds the index using the data in the underlying CF, non blocking + * + * * @return A future object which the caller can block on (optional) */ public Future<?> buildIndexAsync() { // if we're just linking in the index to indexedColumns on an already-built index post-restart, we're done - if (isIndexBuilt()) + boolean allAreBuilt = true; + for (ColumnDefinition cdef : columnDefs) + { + if (!SystemTable.isIndexBuilt(baseCfs.table.name, getNameForSystemTable(cdef.name))) + { + allAreBuilt = false; + break; + } + } + + if (allAreBuilt) return null; - + // build it asynchronously; addIndex gets called by CFS open and schema update, neither of which // we want to block for a long period. (actual build is serialized on CompactionManager.) Runnable runnable = new Runnable() @@ -224,33 +224,50 @@ public abstract class SecondaryIndex throw new AssertionError(e); } - buildIndexBlocking(); + try + { + buildIndexBlocking(); + } + catch (IOException e) + { + throw new RuntimeException(e); + } } }; FutureTask<?> f = new FutureTask<Object>(runnable, null); - new Thread(f, "Creating index: " + columnDef.getIndexName()).start(); + new Thread(f, "Creating index: " + getIndexName()).start(); return f; } - public ColumnFamilyStore getBaseCfs() + public ColumnFamilyStore getBaseCFStore() { return baseCfs; } - private void setBaseCfs(ColumnFamilyStore baseCfs) + private void setBaseCfStore(ColumnFamilyStore baseCfs) { this.baseCfs = baseCfs; } - public ColumnDefinition getColumnDef() + Set<ColumnDefinition> getColumnDefs() { - return columnDef; + return columnDefs; } - private void setColumnDef(ColumnDefinition columnDef) + void addColumnDef(ColumnDefinition columnDef) { - this.columnDef = columnDef; + columnDefs.add(columnDef); + } + + void removeColumnDef(ByteBuffer name) + { + Iterator<ColumnDefinition> it = columnDefs.iterator(); + while (it.hasNext()) + { + if (it.next().name.equals(name)) + it.remove(); + } } /** @@ -259,13 +276,13 @@ public abstract class SecondaryIndex * * @param baseCfs the source of data for the Index * @param cdef the meta information about this column (index_type, index_options, name, etc...) - * @param init specify if this index should be initialized after allocated + * * @return The secondary index instance for this column * @throws ConfigurationException */ - public static SecondaryIndex createInstance(ColumnFamilyStore baseCfs, ColumnDefinition cdef, boolean init) throws ConfigurationException + public static SecondaryIndex createInstance(ColumnFamilyStore baseCfs, ColumnDefinition cdef) throws ConfigurationException { - SecondaryIndex index = null; + SecondaryIndex index; switch (cdef.getIndexType()) { @@ -287,14 +304,11 @@ public abstract class SecondaryIndex break; default: throw new RuntimeException("Unknown index type: " + cdef.getIndexName()); - }; + } - index.setColumnDef(cdef); + index.addColumnDef(cdef); index.validateOptions(); - index.setBaseCfs(baseCfs); - - if (init) - index.init(); + index.setBaseCfStore(baseCfs); return index; } 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=1169876&r1=1169875&r2=1169876&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 Mon Sep 12 19:16:30 2011 @@ -18,29 +18,22 @@ package org.apache.cassandra.db.index; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.nio.ByteBuffer; import java.util.*; -import java.util.concurrent.ConcurrentNavigableMap; -import java.util.concurrent.ConcurrentSkipListMap; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; +import java.util.concurrent.*; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.config.ConfigurationException; import org.apache.cassandra.db.*; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.filter.IFilter; -import org.apache.cassandra.db.index.keys.KeysIndex; import org.apache.cassandra.dht.AbstractBounds; import org.apache.cassandra.dht.LocalToken; import org.apache.cassandra.io.sstable.ReducingKeyIterator; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.thrift.IndexClause; import org.apache.cassandra.thrift.IndexExpression; -import org.apache.cassandra.thrift.IndexType; import org.apache.commons.lang.StringUtils; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,9 +46,19 @@ public class SecondaryIndexManager private static final Logger logger = LoggerFactory.getLogger(SecondaryIndexManager.class); /** - * Organized the indexes by column name + * Organizes the indexes by column name */ private final ConcurrentNavigableMap<ByteBuffer, SecondaryIndex> indexesByColumn; + + + /** + * Keeps a single instance of a SecondaryIndex for many columns when the index type + * has isRowLevelIndex() == true + * + * This allows updates to happen to an entire row at once + */ + private final Map<Class<? extends SecondaryIndex>,SecondaryIndex> rowLevelIndexMap; + /** * The underlying column family containing the source data for these indexes @@ -65,14 +68,16 @@ public class SecondaryIndexManager public SecondaryIndexManager(ColumnFamilyStore baseCfs) { indexesByColumn = new ConcurrentSkipListMap<ByteBuffer, SecondaryIndex>(); - + rowLevelIndexMap = new HashMap<Class<? extends SecondaryIndex>, SecondaryIndex>(); + this.baseCfs = baseCfs; } /** * Drops and adds new indexes associated with the underlying CF + * @throws IOException */ - public void reload() + public void reload() throws IOException { // figure out what needs to be added and dropped. // future: if/when we have modifiable settings for secondary indexes, @@ -96,8 +101,9 @@ public class SecondaryIndexManager * Does nothing if columns is empty. * @param sstables the data to build from * @param columns the list of columns to index + * @throws IOException */ - public void maybeBuildSecondaryIndexes(Collection<SSTableReader> sstables, SortedSet<ByteBuffer> columns) + public void maybeBuildSecondaryIndexes(Collection<SSTableReader> sstables, SortedSet<ByteBuffer> columns) throws IOException { if (columns.isEmpty()) return; @@ -135,17 +141,29 @@ public class SecondaryIndexManager /** * Removes a existing index * @param column the indexed column to remove + * @throws IOException */ - public void removeIndexedColumn(ByteBuffer column) + public void removeIndexedColumn(ByteBuffer column) throws IOException { SecondaryIndex index = indexesByColumn.remove(column); - if(index == null) + if (index == null) return; - - SystemTable.setIndexRemoved(baseCfs.metadata.ksName, index.getIndexName()); - index.removeIndex(); + SystemTable.setIndexRemoved(baseCfs.metadata.ksName, index.getNameForSystemTable(column)); + + index.removeIndex(column); + + // Remove this column from from row level index map + if (index instanceof PerRowSecondaryIndex) + { + index.removeColumnDef(column); + + //If now columns left on this CF remove from row level lookup + if (index.getColumnDefs().isEmpty()) + rowLevelIndexMap.remove(index.getClass()); + } + } /** @@ -165,24 +183,44 @@ public class SecondaryIndexManager SecondaryIndex index; try { - index = SecondaryIndex.createInstance(baseCfs, cdef, true); + index = SecondaryIndex.createInstance(baseCfs, cdef); } catch (ConfigurationException e) { throw new RuntimeException(e); - } - + } + + // Keep a single instance of the index per-cf for row level indexes + // since we want all columns to be under the index + if (index instanceof PerRowSecondaryIndex) + { + SecondaryIndex currentIndex = rowLevelIndexMap.get(index.getClass()); + + if (currentIndex == null) + { + rowLevelIndexMap.put(index.getClass(), index); + index.init(); + } + else + { + index = currentIndex; + index.addColumnDef(cdef); + } + } + else + { + index.init(); + } + // link in indexedColumns. this means that writes will add new data to // the index immediately, // so we don't have to lock everything while we do the build. it's up to // the operator to wait // until the index is actually built before using in queries. - if (indexesByColumn.putIfAbsent(cdef.name, index) != null) - return null; - + indexesByColumn.put(cdef.name, index); // if we're just linking in the index to indexedColumns on an // already-built index post-restart, we're done - if (index.isIndexBuilt()) + if (index.isIndexBuilt(cdef.name)) return null; return index.buildIndexAsync(); @@ -203,17 +241,18 @@ public class SecondaryIndexManager */ public void unregisterMBeans() { - for(Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) + for (Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) entry.getValue().unregisterMbean(); } /** * Remove all underlying index data + * @throws IOException */ - public void removeAllIndexes() + public void removeAllIndexes() throws IOException { - for(Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) - entry.getValue().removeIndex(); + for (Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) + entry.getValue().removeIndex(entry.getKey()); } /** @@ -222,7 +261,7 @@ public class SecondaryIndexManager */ public void renameIndexes(String newCfName) throws IOException { - for(Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) + for (Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) entry.getValue().renameIndex(newCfName); } @@ -231,9 +270,9 @@ public class SecondaryIndexManager * @throws ExecutionException * @throws InterruptedException */ - public void flushIndexes() throws ExecutionException, InterruptedException + public void flushIndexes() throws IOException { - for(Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) + for (Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) entry.getValue().forceBlockingFlush(); } @@ -248,22 +287,6 @@ public class SecondaryIndexManager return new DecoratedKey<LocalToken>(new LocalToken(baseCfs.metadata.getColumnDefinition(name).getValidator(), value), value); } - /** - * Deletes data from one of the indexes - * @param rowKey the row identifier to delete - * @param column the column data to delete - */ - public void deleteFromIndex(ByteBuffer rowKey, IColumn column) - { - SecondaryIndex index = indexesByColumn.get(column.name()); - - if(index == null) - return; - - DecoratedKey<LocalToken> valueKey = getIndexKeyFor(column.name(), column.value()); - - index.deleteColumn(valueKey, rowKey, column); - } /** * @return all built indexes (ready to use) @@ -272,9 +295,11 @@ public class SecondaryIndexManager { List<String> indexList = new ArrayList<String>(); - for(Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) + for (Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) { - if(entry.getValue().isIndexBuilt()) + SecondaryIndex index = entry.getValue(); + + if (index.isIndexBuilt(entry.getKey())) { indexList.add(entry.getValue().getIndexName()); } @@ -290,31 +315,41 @@ public class SecondaryIndexManager { ArrayList<ColumnFamilyStore> cfsList = new ArrayList<ColumnFamilyStore>(); - for(Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) + for (Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet()) { ColumnFamilyStore cfs = entry.getValue().getUnderlyingCfs(); - if(cfs != null) + if (cfs != null) cfsList.add(cfs); } return cfsList; } + /** - * removes obsolete index entries and creates new ones for the given row key + * Removes obsolete index entries and creates new ones for the given row key * and mutated columns. * - * @return list of full (index CF) memtables + * For columns whos underlying index type has the isRowLevelIndex() flag set to true this function will + * call the + * + * @param rowKey the row key + * @param cf the current rows data + * @param mutatedIndexedColumns the set of columns that were changed or added + * @param oldIndexedColumns the columns what were deleted + * @throws IOException */ public void applyIndexUpdates(ByteBuffer rowKey, - ColumnFamily cf, - SortedSet<ByteBuffer> mutatedIndexedColumns, - ColumnFamily oldIndexedColumns) + ColumnFamily cf, + SortedSet<ByteBuffer> mutatedIndexedColumns, + ColumnFamily oldIndexedColumns) throws IOException { - //Track the indexes we touch so we can commit the row across them - Set<SecondaryIndex> indexesTouched = new HashSet<SecondaryIndex>(indexesByColumn.size()); - + + // Identify the columns with PerRowSecondaryIndexes + // we need to make sure this is only called once + Set<Class<? extends SecondaryIndex>> appliedRowLevelIndexes = null; + // remove the old index entries if (oldIndexedColumns != null) { @@ -328,17 +363,27 @@ public class SecondaryIndexManager //this was previously deleted so should not be in index if (column.isMarkedForDelete()) - continue; - + continue; + SecondaryIndex index = getIndexForColumn(columnName); - assert index != null; + assert index != null; - indexesTouched.add(index); + //Update entire row if we encounter a row level index + if (index instanceof PerRowSecondaryIndex) + { + if (appliedRowLevelIndexes == null) + appliedRowLevelIndexes = new HashSet<Class<? extends SecondaryIndex>>(); + else + if (appliedRowLevelIndexes.add(index.getClass())) + ((PerRowSecondaryIndex)index).applyIndexUpdates(rowKey, cf, mutatedIndexedColumns, oldIndexedColumns); + } + else + { + DecoratedKey<LocalToken> valueKey = getIndexKeyFor(columnName, column.value()); - DecoratedKey<LocalToken> valueKey = getIndexKeyFor(columnName, column.value()); - - index.deleteColumn(valueKey, rowKey, column); - } + ((PerColumnSecondaryIndex)index).deleteColumn(valueKey, rowKey, column); + } + } } //insert new columns @@ -351,20 +396,62 @@ public class SecondaryIndexManager SecondaryIndex index = getIndexForColumn(columnName); assert index != null; - indexesTouched.add(index); - - DecoratedKey<LocalToken> valueKey = getIndexKeyFor(columnName, column.value()); - - index.insertColumn(valueKey, rowKey, column); + //Update entire row if we encounter a row level index + if (index instanceof PerRowSecondaryIndex) + { + if (appliedRowLevelIndexes == null) + appliedRowLevelIndexes = new HashSet<Class<? extends SecondaryIndex>>(); + else + if (appliedRowLevelIndexes.add(index.getClass())) + ((PerRowSecondaryIndex)index).applyIndexUpdates(rowKey, cf, mutatedIndexedColumns, oldIndexedColumns); + } + else + { + DecoratedKey<LocalToken> valueKey = getIndexKeyFor(columnName, column.value()); + + ((PerColumnSecondaryIndex)index).insertColumn(valueKey, rowKey, column); + } } + } + + /** + * Delete all columns from all indexes for this row + * @param key the row key + * @param indexedColumnsInRow all column names in row + */ + public void deleteFromIndexes(DecoratedKey<?> key, List<IColumn> indexedColumnsInRow) throws IOException + { - //Commit the row across all indexes - for (SecondaryIndex index : indexesTouched) + // Identify the columns with isRowLevelIndex == true + // we need to make sure this is only called once + Set<Class<? extends SecondaryIndex>> cleanedRowLevelIndexes = null; + + for (IColumn column : indexedColumnsInRow) { - index.commitRow(rowKey); - } + SecondaryIndex index = indexesByColumn.get(column.name()); + + if (index == null) + continue; + + //Update entire row if we encounter a row level index + if (index instanceof PerRowSecondaryIndex) + { + if (cleanedRowLevelIndexes == null) + cleanedRowLevelIndexes = new HashSet<Class<? extends SecondaryIndex>>(); + else + if (cleanedRowLevelIndexes.add(index.getClass())) + ((PerRowSecondaryIndex)index).deleteFromIndex(key, indexedColumnsInRow); + } + else + { + DecoratedKey<LocalToken> valueKey = getIndexKeyFor(column.name(), column.value()); + + ((PerColumnSecondaryIndex)index).deleteColumn(valueKey, key.key, column); + } + } } - + + /** * Get a list of IndexSearchers from the union of expression index types * @param clause the query clause @@ -378,11 +465,11 @@ public class SecondaryIndexManager //Group columns by type - for(IndexExpression ix : clause.expressions) + for (IndexExpression ix : clause.expressions) { SecondaryIndex index = getIndexForColumn(ix.column_name); - if(index == null) + if (index == null) continue; Set<ByteBuffer> columns = groupByIndexType.get(index.getClass().getCanonicalName()); @@ -418,16 +505,14 @@ public class SecondaryIndexManager { List<SecondaryIndexSearcher> indexSearchers = getIndexSearchersForQuery(clause); - if(indexSearchers.isEmpty()) + if (indexSearchers.isEmpty()) return Collections.emptyList(); //We currently don't support searching across multiple index types - if(indexSearchers.size() > 1) + if (indexSearchers.size() > 1) throw new RuntimeException("Unable to search across multiple secondary index types"); return indexSearchers.get(0).search(clause, range, dataFilter); } - - } Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/SecondaryIndexSearcher.java Mon Sep 12 19:16:30 2011 @@ -18,15 +18,9 @@ package org.apache.cassandra.db.index; import java.nio.ByteBuffer; -import java.util.List; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.*; -import org.apache.cassandra.db.ColumnFamily; -import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.IColumn; -import org.apache.cassandra.db.Row; +import org.apache.cassandra.db.*; import org.apache.cassandra.db.filter.IFilter; import org.apache.cassandra.db.filter.NamesQueryFilter; import org.apache.cassandra.dht.AbstractBounds; Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java Mon Sep 12 19:16:30 2011 @@ -20,32 +20,20 @@ package org.apache.cassandra.db.index.ke import java.io.IOException; import java.nio.ByteBuffer; -import java.util.Iterator; import java.util.Set; -import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.ExecutionException; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.config.ConfigurationException; -import org.apache.cassandra.db.Column; -import org.apache.cassandra.db.ColumnFamily; -import org.apache.cassandra.db.ColumnFamilyStore; -import org.apache.cassandra.db.DecoratedKey; -import org.apache.cassandra.db.ExpiringColumn; -import org.apache.cassandra.db.IColumn; -import org.apache.cassandra.db.Memtable; -import org.apache.cassandra.db.index.SecondaryIndex; +import org.apache.cassandra.db.*; +import org.apache.cassandra.db.index.PerColumnSecondaryIndex; import org.apache.cassandra.db.index.SecondaryIndexSearcher; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.db.marshal.LocalByPartionerType; -import org.apache.cassandra.dht.ByteOrderedPartitioner; -import org.apache.cassandra.dht.IPartitioner; -import org.apache.cassandra.dht.LocalPartitioner; -import org.apache.cassandra.dht.OrderPreservingPartitioner; +import org.apache.cassandra.dht.*; import org.apache.cassandra.service.StorageService; -import org.apache.cassandra.thrift.IndexType; import org.apache.cassandra.utils.ByteBufferUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,18 +42,21 @@ import org.slf4j.LoggerFactory; * Implements a secondary index for a column family using a second column family * in which the row keys are indexed values, and column names are base row keys. */ -public class KeysIndex extends SecondaryIndex +public class KeysIndex extends PerColumnSecondaryIndex { private static final Logger logger = LoggerFactory.getLogger(KeysIndex.class); private ColumnFamilyStore indexedCfs; - + private ColumnDefinition columnDef; + public KeysIndex() { } public void init() { - assert baseCfs != null && columnDef != null; + assert baseCfs != null && columnDefs != null; + + columnDef = columnDefs.iterator().next(); CFMetaData indexedCfMetadata = CFMetaData.newIndexMetadata(baseCfs.metadata, columnDef, indexComparator()); indexedCfs = ColumnFamilyStore.createColumnFamilyStore(baseCfs.table, @@ -122,22 +113,27 @@ public class KeysIndex extends Secondary } @Override - public void commitRow(ByteBuffer rowKey) - { - //nothing required in this impl since indexes are per column - } - - @Override - public void removeIndex() - { + public void removeIndex(ByteBuffer columnName) throws IOException + { indexedCfs.removeAllSSTables(); - indexedCfs.unregisterMBean(); + indexedCfs.unregisterMBean(); } @Override - public void forceBlockingFlush() throws ExecutionException, InterruptedException - { - indexedCfs.forceBlockingFlush(); + public void forceBlockingFlush() throws IOException + { + try + { + indexedCfs.forceBlockingFlush(); + } + catch (ExecutionException e) + { + throw new IOException(e); + } + catch (InterruptedException e) + { + throw new IOException(e); + } } @Override Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java Mon Sep 12 19:16:30 2011 @@ -18,24 +18,12 @@ package org.apache.cassandra.db.index.keys; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.*; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.db.ColumnFamily; -import org.apache.cassandra.db.DecoratedKey; -import org.apache.cassandra.db.IColumn; -import org.apache.cassandra.db.Row; +import org.apache.cassandra.db.*; import org.apache.cassandra.db.columniterator.IColumnIterator; -import org.apache.cassandra.db.filter.IFilter; -import org.apache.cassandra.db.filter.NamesQueryFilter; -import org.apache.cassandra.db.filter.QueryFilter; -import org.apache.cassandra.db.filter.QueryPath; -import org.apache.cassandra.db.filter.SliceQueryFilter; +import org.apache.cassandra.db.filter.*; import org.apache.cassandra.db.index.SecondaryIndex; import org.apache.cassandra.db.index.SecondaryIndexManager; import org.apache.cassandra.db.index.SecondaryIndexSearcher; @@ -45,7 +33,6 @@ import org.apache.cassandra.thrift.Index import org.apache.cassandra.thrift.IndexOperator; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.HeapAllocator; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/thrift/ThriftValidation.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/thrift/ThriftValidation.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/thrift/ThriftValidation.java Mon Sep 12 19:16:30 2011 @@ -649,7 +649,7 @@ public class ThriftValidation ColumnDefinition cdef = ColumnDefinition.fromThrift(c); // This method validates the column metadata but does not intialize the index - SecondaryIndex.createInstance(null, cdef, false); + SecondaryIndex.createInstance(null, cdef); } } validateMinMaxCompactionThresholds(cf_def); Modified: cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/CleanupTest.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/CleanupTest.java?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/CleanupTest.java (original) +++ cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/CleanupTest.java Mon Sep 12 19:16:30 2011 @@ -109,7 +109,7 @@ public class CleanupTest extends Cleanup assertEquals(LOOPS, rows.size()); SecondaryIndex index = cfs.indexManager.getIndexForColumn(COLUMN); - assertTrue(index.isIndexBuilt()); + assertTrue(index.isIndexBuilt(COLUMN)); // verify we get it back w/ index query too IndexExpression expr = new IndexExpression(COLUMN, IndexOperator.EQ, VALUE); Modified: cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java?rev=1169876&r1=1169875&r2=1169876&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java (original) +++ cassandra/branches/cassandra-1.0/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java Mon Sep 12 19:16:30 2011 @@ -467,7 +467,7 @@ public class ColumnFamilyStoreTest exten // validate that drop clears it out & rebuild works (CASSANDRA-2320) SecondaryIndex indexedCfs = cfs.indexManager.getIndexForColumn(ByteBufferUtil.bytes("birthdate")); cfs.indexManager.removeIndexedColumn(ByteBufferUtil.bytes("birthdate")); - assert !indexedCfs.isIndexBuilt(); + assert !indexedCfs.isIndexBuilt(ByteBufferUtil.bytes("birthdate")); // rebuild & re-query future = cfs.indexManager.addIndexedColumn(cd);