Author: jbellis
Date: Mon Apr 12 21:14:15 2010
New Revision: 933418

URL: http://svn.apache.org/viewvc?rev=933418&view=rev
Log:
Retrieve the correct number of undeleted columns, if any, from a supercolumn in 
a row that had been deleted previously.
patch by Brandon Williams and jbellis for CASSANDRA-920


Modified:
    cassandra/branches/cassandra-0.6/CHANGES.txt
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    cassandra/branches/cassandra-0.6/test/system/test_server.py

Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=933418&r1=933417&r2=933418&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Mon Apr 12 21:14:15 2010
@@ -14,6 +14,8 @@
    3 system calls per invocation (CASSANDRA-950)
  * nodes with IPv6 (and no IPv4) addresses could not join cluster
    (CASSANDRA-969)
+ * Retrieve the correct number of undeleted columns, if any, from
+   a supercolumn in a row that had been deleted previously (CASSANDRA-920)
 
 
 0.6.0-RC1

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=933418&r1=933417&r2=933418&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
 Mon Apr 12 21:14:15 2010
@@ -779,10 +779,19 @@ public class ColumnFamilyStore implement
                     return null;
                 sc = (SuperColumn)sc.cloneMe();
             }
-            
+
+            // filterSuperColumn only looks at immediate parent (the 
supercolumn) when determining if a subcolumn
+            // is still live, i.e., not shadowed by the parent's tombstone.  
so, bump it up temporarily to the tombstone
+            // time of the cf, if that is greater.
+            long deletedAt = sc.getMarkedForDeleteAt();
+            if (cf.getMarkedForDeleteAt() > deletedAt)
+                sc.markForDeleteAt(sc.getLocalDeletionTime(), 
cf.getMarkedForDeleteAt());
+
             SuperColumn scFiltered = filter.filterSuperColumn(sc, gcBefore);
             ColumnFamily cfFiltered = cf.cloneMeShallow();
+            scFiltered.markForDeleteAt(sc.getLocalDeletionTime(), deletedAt); 
// reset sc tombstone time to what it should be
             cfFiltered.addColumn(scFiltered);
+
             return removeDeleted(cfFiltered, gcBefore);
         }
         finally

Modified: cassandra/branches/cassandra-0.6/test/system/test_server.py
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/test/system/test_server.py?rev=933418&r1=933417&r2=933418&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/test/system/test_server.py (original)
+++ cassandra/branches/cassandra-0.6/test/system/test_server.py Mon Apr 12 
21:14:15 2010
@@ -203,6 +203,20 @@ class TestMutations(CassandraTester):
         _insert_super()
         _verify_super()
 
+    def test_super_reinsert(self):
+        for x in xrange(3):
+            client.insert('Keyspace1', 'key1', ColumnPath('Super1', 'sc2', 
_i64(x)), 'value', 1, ConsistencyLevel.ONE)
+
+        client.remove('Keyspace1', 'key1', ColumnPath('Super1'), 2, 
ConsistencyLevel.ONE)
+
+        for x in xrange(3):
+            client.insert('Keyspace1', 'key1', ColumnPath('Super1', 'sc2', 
_i64(x + 3)), 'value', 3, ConsistencyLevel.ONE)
+
+        for n in xrange(1, 4):
+            p =  SlicePredicate(slice_range=SliceRange('', '', False, n))
+            slice = client.get_slice('Keyspace1', 'key1', 
ColumnParent('Super1', 'sc2'), p, ConsistencyLevel.ONE)
+            assert len(slice) == n, "expected %s results; found %s" % (n, 
slice)
+
     def test_super_get(self):
         _insert_super()
         result = client.get('Keyspace1', 'key1', ColumnPath('Super1', 'sc2'), 
ConsistencyLevel.ONE).super_column


Reply via email to