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/06/17 07:25:29 UTC
svn commit: r955483 - in /cassandra/branches/cassandra-0.6: CHANGES.txt
src/java/org/apache/cassandra/thrift/ThriftValidation.java
test/system/test_server.py
Author: jbellis
Date: Thu Jun 17 05:25:28 2010
New Revision: 955483
URL: http://svn.apache.org/viewvc?rev=955483&view=rev
Log:
allow removing entire row through batch_mutate Deletion. patch by Sylvain Lebresne; backported to 0.6 by jbellis for CASSANDRA-1027
Modified:
cassandra/branches/cassandra-0.6/CHANGES.txt
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/ThriftValidation.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=955483&r1=955482&r2=955483&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Thu Jun 17 05:25:28 2010
@@ -23,6 +23,7 @@
* force anti-entropy service to stream files on the stream stage to avoid
sending streams out of order (CASSANDRA-1169)
* remove inactive stream managers after AES streams files (CASSANDRA-1169)
+ * allow removing entire row through batch_mutate Deletion (CASSANDRA-1027)
0.6.2
Modified: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=955483&r1=955482&r2=955483&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/ThriftValidation.java (original)
+++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/ThriftValidation.java Thu Jun 17 05:25:28 2010
@@ -248,11 +248,6 @@ public class ThriftValidation
public static void validateDeletion(String keyspace, String cfName, Deletion del) throws InvalidRequestException
{
- if (del.super_column == null && del.predicate == null)
- {
- throw new InvalidRequestException("A Deletion must have a SuperColumn, a SlicePredicate or both.");
- }
-
if (del.predicate != null)
{
validateSlicePredicate(keyspace, cfName, del.super_column, del.predicate);
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=955483&r1=955482&r2=955483&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/test/system/test_server.py (original)
+++ cassandra/branches/cassandra-0.6/test/system/test_server.py Thu Jun 17 05:25:28 2010
@@ -171,6 +171,22 @@ def _expect_exception(fn, type_):
def _expect_missing(fn):
_expect_exception(fn, NotFoundException)
+def waitfor(secs, fn, *args, **kwargs):
+ start = time.time()
+ success = False
+ last_exception = None
+ while not success and time.time() < start + secs:
+ try:
+ fn(*args, **kwargs)
+ success = True
+ except KeyboardInterrupt:
+ raise
+ except Exception, e:
+ last_exception = e
+ pass
+ if not success and last_exception:
+ raise last_exception
+
class TestMutations(CassandraTester):
def test_insert(self):
@@ -359,6 +375,23 @@ class TestMutations(CassandraTester):
for key in keys:
_assert_no_columnpath('Keyspace1', key, ColumnPath(column_family, column=c.name))
+ def test_batch_mutate_remove_standard_row(self):
+ column_families = ['Standard1', 'Standard2']
+ keys = ['key_%d' % i for i in range(11,21)]
+ _insert_multi(keys)
+
+ mutations = [Mutation(deletion=Deletion(20))]
+ mutation_map = dict((column_family, mutations) for column_family in column_families)
+
+ keyed_mutations = dict((key, mutation_map) for key in keys)
+
+ client.batch_mutate('Keyspace1', keyed_mutations, ConsistencyLevel.ONE)
+
+ for column_family in column_families:
+ for c in _SIMPLE_COLUMNS:
+ for key in keys:
+ _assert_no_columnpath('Keyspace1', key, ColumnPath(column_family, column=c.name))
+
def test_batch_mutate_remove_super_columns_with_standard_under(self):
column_families = ['Super1', 'Super2']
keys = ['key_%d' % i for i in range(11,21)]
@@ -412,6 +445,31 @@ class TestMutations(CassandraTester):
for key in keys:
_assert_no_columnpath('Keyspace1', key, ColumnPath('Super1', super_column=sc.name))
+ def test_batch_mutate_remove_super_columns_entire_row(self):
+ keys = ['key_%d' % i for i in range(17,21)]
+
+ for key in keys:
+ _insert_super(key)
+
+ mutations = []
+
+ mutations.append(Mutation(deletion=Deletion(20)))
+
+ mutation_map = {'Super1': mutations}
+
+ keyed_mutations = dict((key, mutation_map) for key in keys)
+
+ # Sanity check
+ for sc in _SUPER_COLUMNS:
+ for key in keys:
+ _assert_columnpath_exists('Keyspace1', key, ColumnPath('Super1', super_column=sc.name))
+
+ client.batch_mutate('Keyspace1', keyed_mutations, ConsistencyLevel.ZERO)
+
+ for sc in _SUPER_COLUMNS:
+ for key in keys:
+ waitfor(5, _assert_no_columnpath, 'Keyspace1', key, ColumnPath('Super1', super_column=sc.name))
+
def test_batch_mutate_insertions_and_deletions(self):
first_insert = SuperColumn("sc1",
columns=[Column(_i64(20), 'value20', 3),
@@ -466,13 +524,6 @@ class TestMutations(CassandraTester):
super_column='sc1',
column=c))
- def test_batch_mutate_validates_deletions(self):
- def empty_deletion():
- client.batch_mutate('Keyspace1',
- {'key_33': {'Standard1': [Mutation(deletion=Deletion(2))]}},
- ConsistencyLevel.ONE)
- _expect_exception(empty_deletion, InvalidRequestException)
-
def test_batch_mutate_does_not_accept_cosc_and_deletion_in_same_mutation(self):
def too_full():
col = ColumnOrSuperColumn(column=Column("foo", 'bar', 0))