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/11/15 15:21:43 UTC

svn commit: r1035286 - in /cassandra/branches/cassandra-0.7: CHANGES.txt src/java/org/apache/cassandra/db/ColumnFamilyStore.java src/java/org/apache/cassandra/db/RowIteratorFactory.java test/system/test_thrift_server.py

Author: jbellis
Date: Mon Nov 15 14:21:43 2010
New Revision: 1035286

URL: http://svn.apache.org/viewvc?rev=1035286&view=rev
Log:
fix tombstoning of supercolumns in range queries
patch by jbellis; reviewed by tjake for CASSANDRA-1734

Modified:
    cassandra/branches/cassandra-0.7/CHANGES.txt
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/RowIteratorFactory.java
    cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py

Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1035286&r1=1035285&r2=1035286&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Mon Nov 15 14:21:43 2010
@@ -1,5 +1,4 @@
 dev
-0.6.9
  * add clustertool, config-converter, sstablekeys, and schematool 
    Windows .bat files (CASSANDRA-1723)
  * reject range queries received during bootstrap (CASSANDRA-1739)
@@ -29,6 +28,7 @@ dev
  * add read repair chance to cli "show keyspaces"
  * upgrade to ConcurrentLinkedHashMap 1.1 (CASSANDRA-975)
  * fix index scan routing (CASSANDRA-1722)
+ * fix tombstoning of supercolumns in range queries (CASSANDRA-1734)
 
 
 0.7.0-beta3

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1035286&r1=1035285&r2=1035286&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Mon Nov 15 14:21:43 2010
@@ -1212,12 +1212,13 @@ public class ColumnFamilyStore implement
         Iterables.addAll(sstables, ssTables);
 
         RowIterator iterator = RowIteratorFactory.getIterator(memtables, sstables, startWith, stopAt, filter, getComparator(), this);
+        int gcBefore = (int)(System.currentTimeMillis() / 1000) - metadata.gcGraceSeconds;
 
         try
         {
             // pull rows out of the iterator
             boolean first = true; 
-            while(iterator.hasNext())
+            while (iterator.hasNext())
             {
                 Row current = iterator.next();
                 DecoratedKey key = current.key;
@@ -1228,7 +1229,11 @@ public class ColumnFamilyStore implement
                 // skip first one
                 if(range instanceof Bounds || !first || !key.equals(startWith))
                 {
-                    rows.add(current);
+                    // TODO this is necessary because when we collate supercolumns together, we don't check
+                    // their subcolumns for relevance, so we need to do a second prune post facto here.
+                    rows.add(current.cf != null && current.cf.isSuper()
+                             ? new Row(current.key, removeDeleted(current.cf, gcBefore))
+                             : current);
                     if (logger.isDebugEnabled())
                         logger.debug("scanned " + key);
                 }

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/RowIteratorFactory.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/RowIteratorFactory.java?rev=1035286&r1=1035285&r2=1035286&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/RowIteratorFactory.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/RowIteratorFactory.java Mon Nov 15 14:21:43 2010
@@ -135,7 +135,7 @@ public class RowIteratorFactory
                 if (cached != null)
                 {
                     QueryFilter keyFilter = new QueryFilter(key, filter.path, filter.filter);
-                    returnCF = cfs.filterColumnFamily(cached, keyFilter, cfs.metadata.gcGraceSeconds);
+                    returnCF = cfs.filterColumnFamily(cached, keyFilter, gcBefore);
                 }
                 else
                 {

Modified: cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py?rev=1035286&r1=1035285&r2=1035286&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py (original)
+++ cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py Mon Nov 15 14:21:43 2010
@@ -728,6 +728,18 @@ class TestMutations(ThriftTester):
         assert _big_slice('key1', ColumnParent('Super1', 'sc1')) == []
 
 
+    def test_super_cf_remove_and_range_slice(self):
+        _set_keyspace('Keyspace1')
+
+        client.insert('key3', ColumnParent('Super1', 'sc1'), Column(_i64(1), 'v1', 0), ConsistencyLevel.ONE)
+        client.remove('key3', ColumnPath('Super1', 'sc1'), 5, ConsistencyLevel.ONE)
+
+        rows = {}
+        for row in get_range_slice(client, ColumnParent('Super1'), SlicePredicate(slice_range=SliceRange('', '', False, 1000)), '', '', 1000, ConsistencyLevel.ONE):
+            scs = [cosc.super_column for cosc in row.columns]
+            rows[row.key] = scs
+        assert rows == {'key3': []}, rows
+
     def test_super_cf_remove_column(self):
         _set_keyspace('Keyspace1')
         _insert_simple()