You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/08/17 19:05:36 UTC

svn commit: r986397 - in /cassandra/trunk: CHANGES.txt src/java/org/apache/cassandra/db/ColumnFamilyStore.java src/java/org/apache/cassandra/db/Table.java test/conf/cassandra.yaml test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java

Author: jbellis
Date: Tue Aug 17 17:05:36 2010
New Revision: 986397

URL: http://svn.apache.org/viewvc?rev=986397&view=rev
Log:
fix updating index when value is changed.  patch by jbellis; tested by Tyler Hobbs for CASSANDRA-1373

Modified:
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    cassandra/trunk/test/conf/cassandra.yaml
    cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java

Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=986397&r1=986396&r2=986397&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Tue Aug 17 17:05:36 2010
@@ -10,6 +10,7 @@ dev
  * merge StorageProxy.mutate, mutateBlocking (CASSANDRA-1396)
  * faster UUIDType, LongType comparisons (CASSANDRA-1386, 1393)
  * fix setting read_repair_chance from CLI addColumnFamily (CASSANDRA-1399)
+ * fix updates to indexed columns (CASSANDRA-1373)
 
 
 0.7-beta1

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=986397&r1=986396&r2=986397&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Tue Aug 17 17:05:36 2010
@@ -1091,10 +1091,11 @@ public class ColumnFamilyStore implement
 
             byte[] dataKey = null;
             int n = 0;
-            Iterator<byte[]> iter = indexRow.getColumnNames().iterator();
-            while (iter.hasNext())
+            for (IColumn column : indexRow.getSortedColumns())
             {
-                dataKey = iter.next();
+                if (column.isMarkedForDelete())
+                    continue;
+                dataKey = column.name();
                 n++;
                 DecoratedKey dk = partitioner_.decorateKey(dataKey);
                 if (!range.right.equals(partitioner_.getMinimumToken()) && range.right.compareTo(dk.token) < 0)
@@ -1436,7 +1437,7 @@ public class ColumnFamilyStore implement
         return ColumnFamily.create(indexedColumns_.get(column).metadata);
     }
 
-    public DecoratedKey getIndexKeyFor(byte[] name, byte[] value)
+    public DecoratedKey<LocalToken> getIndexKeyFor(byte[] name, byte[] value)
     {
         return indexedColumns_.get(name).partitioner_.decorateKey(value);
     }

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=986397&r1=986396&r2=986397&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Tue Aug 17 17:05:36 2010
@@ -32,6 +32,7 @@ import com.google.common.collect.Iterabl
 
 import org.apache.cassandra.config.*;
 import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.dht.LocalToken;
 import org.apache.cassandra.io.sstable.SSTableDeletingReference;
 import org.apache.cassandra.io.sstable.SSTableReader;
 import org.apache.cassandra.io.util.FileUtils;
@@ -389,7 +390,7 @@ public class Table
                         for (byte[] columnName : mutatedIndexedColumns)
                         {
                             IColumn column = columnFamily.getColumn(columnName);
-                            DecoratedKey valueKey = cfs.getIndexKeyFor(columnName, column.value());
+                            DecoratedKey<LocalToken> valueKey = cfs.getIndexKeyFor(columnName, column.value());
                             ColumnFamily cf = cfs.newIndexedColumnFamily(columnName);
                             cf.addColumn(new Column(mutation.key(), ArrayUtils.EMPTY_BYTE_ARRAY, column.clock()));
                             applyCF(cfs.getIndexedColumnFamilyStore(columnName), valueKey, cf, memtablesToFlush);
@@ -403,10 +404,10 @@ public class Table
                             {
                                 byte[] columnName = entry.getKey();
                                 IColumn column = entry.getValue();
-                                DecoratedKey valueKey = cfs.getIndexKeyFor(columnName, column.value());
+                                DecoratedKey<LocalToken> valueKey = cfs.getIndexKeyFor(columnName, column.value());
                                 ColumnFamily cf = cfs.newIndexedColumnFamily(columnName);
                                 cf.deleteColumn(mutation.key(), localDeletionTime, column.clock());
-                                applyCF(cfs, valueKey, cf, memtablesToFlush);
+                                applyCF(cfs.getIndexedColumnFamilyStore(columnName), valueKey, cf, memtablesToFlush);
                             }
                         }
                     }

Modified: cassandra/trunk/test/conf/cassandra.yaml
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/conf/cassandra.yaml?rev=986397&r1=986396&r2=986397&view=diff
==============================================================================
--- cassandra/trunk/test/conf/cassandra.yaml (original)
+++ cassandra/trunk/test/conf/cassandra.yaml Tue Aug 17 17:05:36 2010
@@ -80,7 +80,6 @@ keyspaces:
       replica_placement_strategy: org.apache.cassandra.locator.SimpleStrategy
       replication_factor: 1
       column_families:
-
         - name: Standard1
 
         - name: Standard3
@@ -92,6 +91,12 @@ keyspaces:
           column_type: Super
           compare_subcolumns_with: TimeUUIDType
 
+        - name: Indexed1
+          column_metadata:
+            - name: birthdate
+              validator_class: LongType
+              index_type: KEYS
+
     - name: Keyspace3
       replica_placement_strategy: org.apache.cassandra.locator.SimpleStrategy
       replication_factor: 5

Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java?rev=986397&r1=986396&r2=986397&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java Tue Aug 17 17:05:36 2010
@@ -189,6 +189,33 @@ public class ColumnFamilyStoreTest exten
         assert Arrays.equals(FBUtilities.toByteArray(1L), rows.get(1).cf.getColumn("birthdate".getBytes("UTF8")).value());
     }
 
+    @Test
+    public void testIndexUpdate() throws IOException
+    {
+        RowMutation rm;
+
+        rm = new RowMutation("Keyspace2", "k1".getBytes());
+        rm.add(new QueryPath("Indexed1", null, "birthdate".getBytes("UTF8")), FBUtilities.toByteArray(1L), new TimestampClock(1));
+        rm.apply();
+
+        rm = new RowMutation("Keyspace2", "k1".getBytes());
+        rm.add(new QueryPath("Indexed1", null, "birthdate".getBytes("UTF8")), FBUtilities.toByteArray(2L), new TimestampClock(2));
+        rm.apply();
+
+        IndexExpression expr = new IndexExpression("birthdate".getBytes("UTF8"), IndexOperator.EQ, FBUtilities.toByteArray(1L));
+        IndexClause clause = new IndexClause(Arrays.asList(expr), ArrayUtils.EMPTY_BYTE_ARRAY, 100);
+        IFilter filter = new IdentityQueryFilter();
+        IPartitioner p = StorageService.getPartitioner();
+        Range range = new Range(p.getMinimumToken(), p.getMinimumToken());
+        List<Row> rows = Table.open("Keyspace2").getColumnFamilyStore("Indexed1").scan(clause, range, filter);
+        assert rows.size() == 0;
+
+        expr = new IndexExpression("birthdate".getBytes("UTF8"), IndexOperator.EQ, FBUtilities.toByteArray(2L));
+        clause = new IndexClause(Arrays.asList(expr), ArrayUtils.EMPTY_BYTE_ARRAY, 100);
+        rows = Table.open("Keyspace2").getColumnFamilyStore("Indexed1").scan(clause, range, filter);
+        assert Arrays.equals("k1".getBytes(), rows.get(0).key.key);
+    }
+
     private ColumnFamilyStore insertKey1Key2() throws IOException, ExecutionException, InterruptedException
     {
         List<RowMutation> rms = new LinkedList<RowMutation>();