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