You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ee...@apache.org on 2010/06/15 22:57:23 UTC

svn commit: r955050 - in /cassandra/trunk: interface/cassandra.avpr interface/cassandra.genavro src/java/org/apache/cassandra/avro/AvroValidation.java src/java/org/apache/cassandra/avro/CassandraServer.java test/system/test_avro_server.py

Author: eevans
Date: Tue Jun 15 20:57:22 2010
New Revision: 955050

URL: http://svn.apache.org/viewvc?rev=955050&view=rev
Log:
added remove() implementation to avro-based server

Patch by eevans

Modified:
    cassandra/trunk/interface/cassandra.avpr
    cassandra/trunk/interface/cassandra.genavro
    cassandra/trunk/src/java/org/apache/cassandra/avro/AvroValidation.java
    cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java
    cassandra/trunk/test/system/test_avro_server.py

Modified: cassandra/trunk/interface/cassandra.avpr
URL: http://svn.apache.org/viewvc/cassandra/trunk/interface/cassandra.avpr?rev=955050&r1=955049&r2=955050&view=diff
==============================================================================
--- cassandra/trunk/interface/cassandra.avpr (original)
+++ cassandra/trunk/interface/cassandra.avpr Tue Jun 15 20:57:22 2010
@@ -148,6 +148,17 @@
         "errors": ["InvalidRequestException", "UnavailableException",
             "TimedOutException"]
     },
+    "remove": {
+        "request": [
+            {"name": "key", "type": "bytes"},
+            {"name": "column_path", "type": "ColumnPath"},
+            {"name": "clock", "type": "Clock"},
+            {"name": "consistency_level", "type": "ConsistencyLevel"}
+        ],
+        "response": "null",
+        "errors": ["InvalidRequestException", "UnavailableException",
+            "TimedOutException"]
+    },
     "batch_mutate": {
         "request": [
             {"name": "keyspace", "type": "string"},

Modified: cassandra/trunk/interface/cassandra.genavro
URL: http://svn.apache.org/viewvc/cassandra/trunk/interface/cassandra.genavro?rev=955050&r1=955049&r2=955050&view=diff
==============================================================================
--- cassandra/trunk/interface/cassandra.genavro (original)
+++ cassandra/trunk/interface/cassandra.genavro Tue Jun 15 20:57:22 2010
@@ -115,6 +115,12 @@ protocol Cassandra {
                 Column column,
                 ConsistencyLevel consistency_level)
     throws InvalidRequestException, UnavailableException, TimedOutException;
+    
+    void remove(bytes key,
+                ColumnPath column_path,
+                Clock clock,
+                ConsistencyLevel consistency_level)
+    throws InvalidRequestException, UnavailableException, TimedOutException;
 
     void batch_mutate(string keyspace,
                       map<map<array<Mutation>>> mutation_map,

Modified: cassandra/trunk/src/java/org/apache/cassandra/avro/AvroValidation.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/avro/AvroValidation.java?rev=955050&r1=955049&r2=955050&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/avro/AvroValidation.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/avro/AvroValidation.java Tue Jun 15 20:57:22 2010
@@ -28,8 +28,10 @@ import java.util.Comparator;
 import org.apache.avro.util.Utf8;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.db.IClock;
 import org.apache.cassandra.db.IColumn;
 import org.apache.cassandra.db.ColumnFamilyType;
+import org.apache.cassandra.db.TimestampClock;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.MarshalException;
 import org.apache.cassandra.utils.FBUtilities;
@@ -267,4 +269,12 @@ public class AvroValidation {
         if (column.ttl != null && column.ttl < 0)
             throw newInvalidRequestException("ttl must be a positive value");
     }
+    
+    static IClock validateClock(Clock clock) throws InvalidRequestException
+    {
+        if (clock.timestamp >= 0)
+            return new TimestampClock(clock.timestamp);
+        
+        throw newInvalidRequestException("Clock must have a timestamp set");
+    }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java?rev=955050&r1=955049&r2=955050&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java Tue Jun 15 20:57:22 2010
@@ -282,6 +282,26 @@ public class CassandraServer implements 
 
         return null;
     }
+    
+    @Override
+    public Void remove(ByteBuffer key, ColumnPath columnPath, Clock clock, ConsistencyLevel consistencyLevel)
+    throws AvroRemoteException, InvalidRequestException, UnavailableException, TimedOutException
+    {
+        if (logger.isDebugEnabled())
+            logger.debug("remove");
+        
+        AvroValidation.validateKey(key.array());
+        AvroValidation.validateColumnPath(curKeyspace.get(), columnPath);
+        IClock dbClock = AvroValidation.validateClock(clock);
+        
+        RowMutation rm = new RowMutation(curKeyspace.get(), key.array());
+        byte[] superName = columnPath.super_column == null ? null : columnPath.super_column.array();
+        rm.delete(new QueryPath(columnPath.column_family.toString(), superName), dbClock);
+        
+        doInsert(consistencyLevel, rm);
+        
+        return null;
+    }
 
     private void doInsert(ConsistencyLevel consistency, RowMutation rm) throws UnavailableException, TimedOutException
     {

Modified: cassandra/trunk/test/system/test_avro_server.py
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/system/test_avro_server.py?rev=955050&r1=955049&r2=955050&view=diff
==============================================================================
--- cassandra/trunk/test/system/test_avro_server.py (original)
+++ cassandra/trunk/test/system/test_avro_server.py Tue Jun 15 20:57:22 2010
@@ -91,6 +91,40 @@ class TestRpcOperations(AvroTester):
         assert_cosc(cosc)
         assert_columns_match(cosc['column'], params['column'])
 
+    def test_remove_simple(self):
+        "removing a simple column"
+        self.client.request('set_keyspace', {'keyspace': 'Keyspace1'})
+
+        params = dict()
+        params['key'] = 'key1'
+        params['column_parent'] = {'column_family': 'Standard1'}
+        params['column'] = dict()
+        params['column']['name'] = 'c1'
+        params['column']['value'] = 'v1'
+        params['column']['clock'] = { 'timestamp' : 0 }
+        params['consistency_level'] = 'ONE'
+        self.client.request('insert', params)
+
+        read_params = dict()
+        read_params['key'] = params['key']
+        read_params['column_path'] = dict()
+        read_params['column_path']['column_family'] = 'Standard1'
+        read_params['column_path']['column'] = params['column']['name']
+        read_params['consistency_level'] = 'ONE'
+
+        cosc = self.client.request('get', read_params)
+
+        assert_cosc(cosc)
+
+        remove_params = read_params
+        remove_params['clock'] = {'timestamp': 1}
+
+        self.client.request('remove', remove_params)
+
+        try: cosc = self.client.request('get', read_params)
+        except AvroRemoteException, err: pass
+        else: assert False, "Expected exception, returned %s instead" % cosc
+
     def test_describe_keyspaces(self):
         "retrieving a list of all keyspaces"
         keyspaces = self.client.request('describe_keyspaces', {})