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 2011/06/10 22:19:24 UTC

svn commit: r1134431 - in /cassandra/trunk: ./ contrib/ examples/bmt/ interface/thrift/gen-java/org/apache/cassandra/thrift/ src/java/org/apache/cassandra/cql/ src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/io/sstable/ src/java/org/apa...

Author: jbellis
Date: Fri Jun 10 20:19:23 2011
New Revision: 1134431

URL: http://svn.apache.org/viewvc?rev=1134431&view=rev
Log:
merge from 0.8

Removed:
    cassandra/trunk/examples/bmt/CassandraBulkLoader.java
    cassandra/trunk/examples/bmt/README.txt
Modified:
    cassandra/trunk/   (props changed)
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/contrib/   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java   (props changed)
    cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g
    cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java
    cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java
    cassandra/trunk/test/system/test_cql.py
    cassandra/trunk/test/unit/org/apache/cassandra/Util.java
    cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java
    cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
    cassandra/trunk/test/unit/org/apache/cassandra/service/RowResolverTest.java
    cassandra/trunk/tools/stress/build.xml

Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 10 20:19:23 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7:1026516-1133391
+/cassandra/branches/cassandra-0.7:1026516-1133874
 /cassandra/branches/cassandra-0.7.0:1053690-1055654
-/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1133945
+/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1134430
 /cassandra/branches/cassandra-0.8.0:1125021-1130369
 /cassandra/branches/cassandra-0.8.1:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689

Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Fri Jun 10 20:19:23 2011
@@ -8,6 +8,7 @@
    - improve JDBC spec compliance (CASSANDRA-2720)
    - ALTER COLUMNFAMILY (CASSANDRA-1709)
    - DROP INDEX (CASSANDRA-2617)
+   - add SCHEMA/TABLE as aliases for KS/CF (CASSANDRA-2743)
  * add support for comparator parameters and a generic ReverseType
    (CASSANDRA-2355)
  * add CompositeType and DynamicCompositeType (CASSANDRA-2231)
@@ -45,6 +46,9 @@
    by nio sockets (CASSANDRA-2654)
  * restrict repair streaming to specific columnfamilies (CASSANDRA-2280)
  * fix nodetool ring use with Ec2Snitch (CASSANDRA-2733)
+ * fix removing columns and subcolumns that are supressed by a row or
+   supercolumn tombstone during replica resolution (CASSANDRA-2590)
+ * support sstable2json against snapshot sstables (CASSANDRA-2386)
 
 
 0.8.0-final

Propchange: cassandra/trunk/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 10 20:19:23 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/contrib:1026516-1133391
+/cassandra/branches/cassandra-0.7/contrib:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654
-/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1133945
+/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1134430
 /cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 10 20:19:23 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1133391
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1133945
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1134430
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 10 20:19:23 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1133391
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1133945
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1134430
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 10 20:19:23 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1133391
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1133945
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1134430
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 10 20:19:23 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1133391
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1133945
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1134430
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 10 20:19:23 2011
@@ -1,7 +1,7 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1133391
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1133874
 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1133945
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1134430
 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369
 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1101014-1125018
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g Fri Jun 10 20:19:23 2011
@@ -498,8 +498,10 @@ K_TRUNCATE:    T R U N C A T E;
 K_DELETE:      D E L E T E;
 K_IN:          I N;
 K_CREATE:      C R E A T E;
-K_KEYSPACE:    K E Y S P A C E;
-K_COLUMNFAMILY: C O L U M N F A M I L Y;
+K_KEYSPACE:    ( K E Y S P A C E
+                 | S C H E M A );
+K_COLUMNFAMILY:( C O L U M N F A M I L Y
+                 | T A B L E );
 K_INDEX:       I N D E X;
 K_ON:          O N;
 K_DROP:        D R O P;

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Fri Jun 10 20:19:23 2011
@@ -55,8 +55,9 @@ public class Table
 {
     public static final String SYSTEM_TABLE = "system";
 
+    public static final String SNAPSHOT_SUBDIR_NAME = "snapshots";
+
     private static final Logger logger = LoggerFactory.getLogger(Table.class);
-    private static final String SNAPSHOT_SUBDIR_NAME = "snapshots";
 
     /**
      * accesses to CFS.memtable should acquire this for thread safety.

Modified: cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/io/sstable/Descriptor.java Fri Jun 10 20:19:23 2011
@@ -26,6 +26,7 @@ import java.util.StringTokenizer;
 
 import com.google.common.base.Objects;
 
+import org.apache.cassandra.db.Table;
 import org.apache.cassandra.utils.Pair;
 
 /**
@@ -131,7 +132,7 @@ public class Descriptor
     public static Pair<Descriptor,String> fromFilename(File directory, String name)
     {
         // name of parent directory is keyspace name
-        String ksname = directory.getName();
+        String ksname = extractKeyspaceName(directory);
 
         // tokenize the filename
         StringTokenizer st = new StringTokenizer(name, "-");
@@ -165,6 +166,43 @@ public class Descriptor
     }
 
     /**
+     * Extracts the keyspace name out of the directory name. Snapshot directories have a slightly different
+     * path structure and need to be treated differently.
+     *
+     * Regular path:   "<ksname>/<cfname>-[tmp-][<version>-]<gen>-<component>"
+     * Snapshot path: "<ksname>/snapshots/<snapshot-name>/<cfname>-[tmp-][<version>-]<gen>-<component>"
+     *
+     * @param directory a directory containing SSTables
+     * @return the keyspace name
+     */
+    public static String extractKeyspaceName(File directory) {
+
+        if (isSnapshotInPath(directory))
+        {
+            // We need to move backwards. If this is a snapshot, first parent takes us to:
+            // <ksname>/snapshots/ and second call to parent takes us to <ksname>.
+            return directory.getParentFile().getParentFile().getName();
+        }
+        return directory.getName();
+    }
+
+    /**
+     * @return <code>TRUE</code> if this directory represents a snapshot directory. <code>FALSE</code> otherwise.
+     */
+    private static boolean isSnapshotInPath(File directory) {
+        File curDirectory = directory;
+        while (curDirectory != null)
+        {
+            if (curDirectory.getName().equals(Table.SNAPSHOT_SUBDIR_NAME))
+                return true;
+            curDirectory = curDirectory.getParentFile();
+        }
+
+        // The directory does not represent a snapshot directory.
+        return false;
+    }
+
+    /**
      * @return A clone of this descriptor with the given 'temporary' status.
      */
     public Descriptor asTemporary(boolean temporary)

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/RowRepairResolver.java Fri Jun 10 20:19:23 2011
@@ -26,7 +26,12 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.collections.iterators.CollatingIterator;
+
 import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.columniterator.IdentityQueryFilter;
+import org.apache.cassandra.db.filter.QueryFilter;
+import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
@@ -122,19 +127,30 @@ public class RowRepairResolver extends A
         ColumnFamily resolved = null;
         for (ColumnFamily cf : versions)
         {
-            if (cf != null)
-            {
-                resolved = cf.cloneMe();
-                break;
-            }
+            if (cf == null)
+                continue;
+
+            if (resolved == null)
+                resolved = cf.cloneMeShallow();
+            else
+                resolved.delete(cf);
         }
         if (resolved == null)
             return null;
 
-        for (ColumnFamily cf : versions)
-            resolved.resolve(cf);
-
-        return resolved;
+        // mimic the collectCollatedColumn + removeDeleted path that getColumnFamily takes.
+        // this will handle removing columns and subcolumns that are supressed by a row or
+        // supercolumn tombstone.
+        QueryFilter filter = new QueryFilter(null, new QueryPath(resolved.metadata().cfName), new IdentityQueryFilter());
+        CollatingIterator iter = new CollatingIterator(resolved.metadata().comparator.columnComparator);
+        for (ColumnFamily version : versions)
+        {
+            if (version == null)
+                continue;
+            iter.addIterator(version.getColumnsMap().values().iterator());
+        }
+        filter.collectCollatedColumns(resolved, iter, Integer.MIN_VALUE);
+        return ColumnFamilyStore.removeDeleted(resolved, Integer.MIN_VALUE);
     }
 
     public Row getData() throws IOException

Modified: cassandra/trunk/test/system/test_cql.py
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/system/test_cql.py?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/test/system/test_cql.py (original)
+++ cassandra/trunk/test/system/test_cql.py Fri Jun 10 20:19:23 2011
@@ -44,7 +44,7 @@ def load_sample(dbconn):
             WITH comparator = ascii AND default_validation = ascii;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY StandardString2 (KEY text PRIMARY KEY)
+        CREATE TABLE StandardString2 (KEY text PRIMARY KEY)
             WITH comparator = ascii AND default_validation = ascii;
     """)
     dbconn.execute("""
@@ -56,7 +56,7 @@ def load_sample(dbconn):
             WITH comparator = bigint AND default_validation = ascii;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY StandardIntegerA (KEY text PRIMARY KEY)
+        CREATE TABLE StandardIntegerA (KEY text PRIMARY KEY)
             WITH comparator = varint AND default_validation = ascii;
     """)
     dbconn.execute("""
@@ -76,7 +76,7 @@ def load_sample(dbconn):
             WITH comparator = ascii AND default_validation = ascii;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY CounterCF (KEY text PRIMARY KEY, count_me counter)
+        CREATE TABLE CounterCF (KEY text PRIMARY KEY, count_me counter)
             WITH comparator = ascii AND default_validation = counter;
     """)
     dbconn.execute("CREATE INDEX ON IndexedA (birthdate)")
@@ -414,7 +414,7 @@ class TestCql(ThriftTester):
         "create a new keyspace"
         cursor = init()
         cursor.execute("""
-        CREATE KEYSPACE TestKeyspace42 WITH strategy_options:DC1 = '1'
+        CREATE SCHEMA TestKeyspace42 WITH strategy_options:DC1 = '1'
             AND strategy_class = 'NetworkTopologyStrategy'
         """)
 
@@ -436,7 +436,7 @@ class TestCql(ThriftTester):
         # TODO: temporary (until this can be done with CQL).
         thrift_client.describe_keyspace("Keyspace4Drop")
 
-        cursor.execute('DROP KEYSPACE Keyspace4Drop;')
+        cursor.execute('DROP SCHEMA Keyspace4Drop;')
 
         # Technically this should throw a ttypes.NotFound(), but this is
         # temporary and so not worth requiring it on PYTHONPATH.
@@ -448,7 +448,7 @@ class TestCql(ThriftTester):
         "create a new column family"
         cursor = init()
         cursor.execute("""
-               CREATE KEYSPACE CreateCFKeyspace WITH strategy_options:replication_factor = '1'
+               CREATE SCHEMA CreateCFKeyspace WITH strategy_options:replication_factor = '1'
                    AND strategy_class = 'SimpleStrategy';
         """)
         cursor.execute("USE CreateCFKeyspace;")

Modified: cassandra/trunk/test/unit/org/apache/cassandra/Util.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/Util.java?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/Util.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/Util.java Fri Jun 10 20:19:23 2011
@@ -58,6 +58,14 @@ public class Util
         return new Column(ByteBufferUtil.bytes(name), ByteBufferUtil.bytes(value), timestamp);
     }
 
+    public static SuperColumn superColumn(ColumnFamily cf, String name, Column... columns)
+    {
+        SuperColumn sc = new SuperColumn(ByteBufferUtil.bytes(name), cf.metadata().comparator);
+        for (Column c : columns)
+            sc.addColumn(c);
+        return sc;
+    }
+
     public static Token token(String key)
     {
         return StorageService.getPartitioner().getToken(ByteBufferUtil.bytes(key));

Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/db/TableTest.java Fri Jun 10 20:19:23 2011
@@ -511,7 +511,18 @@ public class TableTest extends CleanupHe
 
     public static void assertColumns(ColumnFamily cf, String... columnNames)
     {
-        Collection<IColumn> columns = cf == null ? new TreeSet<IColumn>() : cf.getSortedColumns();
+        assertColumns((IColumnContainer)cf, columnNames);
+    }
+
+    public static void assertSubColumns(ColumnFamily cf, String scName, String... columnNames)
+    {
+        IColumnContainer sc = cf == null ? null : ((IColumnContainer)cf.getColumn(ByteBufferUtil.bytes(scName)));
+        assertColumns(sc, columnNames);
+    }
+
+    public static void assertColumns(IColumnContainer container, String... columnNames)
+    {
+        Collection<IColumn> columns = container == null ? new TreeSet<IColumn>() : container.getSortedColumns();
         List<String> L = new ArrayList<String>();
         for (IColumn column : columns)
         {
@@ -540,9 +551,28 @@ public class TableTest extends CleanupHe
 
         assert Arrays.equals(la, columnNames1)
                 : String.format("Columns [%s(as string: %s)])] is not expected [%s]",
-                                ((cf == null) ? "" : cf.getComparator().getColumnsString(columns)),
+                                ((container == null) ? "" : container.getComparator().getColumnsString(columns)),
                                 lasb.toString(),
                                 StringUtils.join(columnNames1, ","));
     }
 
+    public static void assertColumn(ColumnFamily cf, String name, String value, long timestamp)
+    {
+        assertColumn(cf.getColumn(ByteBufferUtil.bytes(name)), value, timestamp);
+    }
+
+    public static void assertSubColumn(ColumnFamily cf, String scName, String name, String value, long timestamp)
+    {
+        SuperColumn sc = (SuperColumn)cf.getColumn(ByteBufferUtil.bytes(scName));
+        assertColumn(sc.getSubColumn(ByteBufferUtil.bytes(name)), value, timestamp);
+    }
+
+    public static void assertColumn(IColumn column, String value, long timestamp)
+    {
+        assertNotNull(column);
+        assertEquals(0, ByteBufferUtil.compareUnsigned(column.value(), ByteBufferUtil.bytes(value)));
+        assertEquals(timestamp, column.timestamp());
+    }
+
+
 }

Modified: cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java Fri Jun 10 20:19:23 2011
@@ -25,6 +25,8 @@ import java.io.File;
 
 import org.junit.Test;
 
+import org.apache.cassandra.db.Table;
+
 public class DescriptorTest
 {
     @Test
@@ -34,4 +36,28 @@ public class DescriptorTest
         assert descriptor.version.equals(Descriptor.LEGACY_VERSION);
         assert descriptor.usesOldBloomFilter;
     }
+
+    @Test
+    public void testExtractKeyspace()
+    {
+        // Test a path representing a SNAPSHOT directory
+        String dirPath = "Keyspace10" + File.separator + Table.SNAPSHOT_SUBDIR_NAME + File.separator + System.currentTimeMillis();
+        assertKeyspace("Keyspace10", dirPath);
+
+        // Test a path representing a regular SSTables directory
+        dirPath = "Keyspace11";
+        assertKeyspace("Keyspace11", dirPath);
+    }
+
+    private void assertKeyspace(String expectedKsName, String dirPath) {
+        File dir = new File(dirPath);
+        dir.deleteOnExit();
+
+        // Create and check.
+        if (!dir.mkdirs())
+            throw new RuntimeException("Unable to create directories:" + dirPath);
+
+        String currentKsName = Descriptor.extractKeyspaceName(dir);
+        assert expectedKsName.equals(currentKsName);
+    }
 }

Modified: cassandra/trunk/test/unit/org/apache/cassandra/service/RowResolverTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/service/RowResolverTest.java?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/service/RowResolverTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/service/RowResolverTest.java Fri Jun 10 20:19:23 2011
@@ -23,14 +23,16 @@ package org.apache.cassandra.service;
 
 import java.util.Arrays;
 
-import org.apache.cassandra.SchemaLoader;
 import org.junit.Test;
 
+import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.db.SuperColumn;
 
-import static org.apache.cassandra.db.TableTest.assertColumns;
+import static junit.framework.Assert.*;
 import static org.apache.cassandra.Util.column;
-import static junit.framework.Assert.assertNull;
+import static org.apache.cassandra.Util.superColumn;
+import static org.apache.cassandra.db.TableTest.*;
 
 public class RowResolverTest extends SchemaLoader
 {
@@ -93,4 +95,110 @@ public class RowResolverTest extends Sch
     {
         assertNull(RowRepairResolver.resolveSuperset(Arrays.<ColumnFamily>asList(null, null)));
     }
+
+    @Test
+    public void testResolveDeleted()
+    {
+        // one CF with columns timestamped before a delete in another cf
+        ColumnFamily cf1 = ColumnFamily.create("Keyspace1", "Standard1");
+        cf1.addColumn(column("one", "A", 0));
+
+        ColumnFamily cf2 = ColumnFamily.create("Keyspace1", "Standard1");
+        cf2.delete((int) (System.currentTimeMillis() / 1000), 1);
+
+        ColumnFamily resolved = RowRepairResolver.resolveSuperset(Arrays.asList(cf1, cf2));
+        // no columns in the cf
+        assertColumns(resolved);
+        assertTrue(resolved.isMarkedForDelete());
+        assertEquals(1, resolved.getMarkedForDeleteAt());
+
+        ColumnFamily scf1 = ColumnFamily.create("Keyspace1", "Super1");
+        scf1.addColumn(superColumn(scf1, "super-foo", column("one", "A", 0)));
+
+        ColumnFamily scf2 = ColumnFamily.create("Keyspace1", "Super1");
+        scf2.delete((int) (System.currentTimeMillis() / 1000), 1);
+
+        ColumnFamily superResolved = RowRepairResolver.resolveSuperset(Arrays.asList(scf1, scf2));
+        // no columns in the cf
+        assertColumns(superResolved);
+        assertTrue(superResolved.isMarkedForDelete());
+        assertEquals(1, superResolved.getMarkedForDeleteAt());
+    }
+
+    @Test
+    public void testResolveDeletedSuper()
+    {
+        // subcolumn is newer than a tombstone on its parent, but not newer than the row deletion
+        ColumnFamily scf1 = ColumnFamily.create("Keyspace1", "Super1");
+        SuperColumn sc = superColumn(scf1, "super-foo", column("one", "A", 1));
+        sc.markForDeleteAt((int) (System.currentTimeMillis() / 1000), 0);
+        scf1.addColumn(sc);
+
+        ColumnFamily scf2 = ColumnFamily.create("Keyspace1", "Super1");
+        scf2.delete((int) (System.currentTimeMillis() / 1000), 2);
+
+        ColumnFamily superResolved = RowRepairResolver.resolveSuperset(Arrays.asList(scf1, scf2));
+        // no columns in the cf
+        assertColumns(superResolved);
+        assertTrue(superResolved.isMarkedForDelete());
+        assertEquals(2, superResolved.getMarkedForDeleteAt());
+    }
+
+    @Test
+    public void testResolveMultipleDeleted()
+    {
+        // deletes and columns with interleaved timestamp, with out of order return sequence
+
+        ColumnFamily cf1 = ColumnFamily.create("Keyspace1", "Standard1");
+        cf1.delete((int) (System.currentTimeMillis() / 1000), 0);
+
+        // these columns created after the previous deletion
+        ColumnFamily cf2 = ColumnFamily.create("Keyspace1", "Standard1");
+        cf2.addColumn(column("one", "A", 1));
+        cf2.addColumn(column("two", "A", 1));
+
+        //this column created after the next delete
+        ColumnFamily cf3 = ColumnFamily.create("Keyspace1", "Standard1");
+        cf3.addColumn(column("two", "B", 3));
+
+        ColumnFamily cf4 = ColumnFamily.create("Keyspace1", "Standard1");
+        cf4.delete((int) (System.currentTimeMillis() / 1000), 2);
+
+        ColumnFamily resolved = RowRepairResolver.resolveSuperset(Arrays.asList(cf1, cf2, cf3, cf4));
+        // will have deleted marker and one column
+        assertColumns(resolved, "two");
+        assertColumn(resolved, "two", "B", 3);
+        assertTrue(resolved.isMarkedForDelete());
+        assertEquals(2, resolved.getMarkedForDeleteAt());
+
+
+        ColumnFamily scf1 = ColumnFamily.create("Keyspace1", "Super1");
+        scf1.delete((int) (System.currentTimeMillis() / 1000), 0);
+
+        // these columns created after the previous deletion
+        ColumnFamily scf2 = ColumnFamily.create("Keyspace1", "Super1");
+        scf2.addColumn(superColumn(scf2, "super1", column("one", "A", 1), column("two", "A", 1)));
+
+        //these columns created after the next delete
+        ColumnFamily scf3 = ColumnFamily.create("Keyspace1", "Super1");
+        scf3.addColumn(superColumn(scf3, "super1", column("two", "B", 3)));
+        scf3.addColumn(superColumn(scf3, "super2", column("three", "A", 3), column("four", "A", 3)));
+
+        ColumnFamily scf4 = ColumnFamily.create("Keyspace1", "Super1");
+        scf4.delete((int) (System.currentTimeMillis() / 1000), 2);
+
+        ColumnFamily superResolved = RowRepairResolver.resolveSuperset(Arrays.asList(scf1, scf2, scf3, scf4));
+        // will have deleted marker and two super cols
+        assertColumns(superResolved, "super1", "super2");
+
+        assertSubColumns(superResolved, "super1", "two");
+        assertSubColumn(superResolved, "super1", "two", "B", 3);
+
+        assertSubColumns(superResolved, "super2", "four", "three");
+        assertSubColumn(superResolved, "super2", "three", "A", 3);
+        assertSubColumn(superResolved, "super2", "four", "A", 3);
+
+        assertTrue(superResolved.isMarkedForDelete());
+        assertEquals(2, superResolved.getMarkedForDeleteAt());
+    }
 }

Modified: cassandra/trunk/tools/stress/build.xml
URL: http://svn.apache.org/viewvc/cassandra/trunk/tools/stress/build.xml?rev=1134431&r1=1134430&r2=1134431&view=diff
==============================================================================
--- cassandra/trunk/tools/stress/build.xml (original)
+++ cassandra/trunk/tools/stress/build.xml Fri Jun 10 20:19:23 2011
@@ -17,7 +17,7 @@
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->
-<project basedir="." default="build" name="stress">
+<project basedir="." default="jar" name="stress">
     <property name="cassandra.dir" value="../.." />
     <property name="cassandra.lib" value="${cassandra.dir}/lib" />
     <property name="build.src" value="${basedir}/src" />
@@ -49,9 +49,19 @@
     </target>
 
     <target name="jar" depends="build">
+        <manifest file="MANIFEST.MF">
+            <attribute name="Built-By" value="Pavel Yaskevich"/>
+            <attribute name="Main-Class" value="org.apache.cassandra.stress.Stress"/>
+        </manifest>
+
         <mkdir dir="${build.classes}/META-INF" />
-        <jar jarfile="${build.out}/${final.name}.jar"
-                basedir="${build.classes}" />
+
+        <jar destfile="${build.out}/${final.name}.jar" manifest="MANIFEST.MF">
+            <fileset dir="${build.classes}"/>
+            <fileset dir="${cassandra.dir}/build/classes/main" />
+            <fileset dir="${cassandra.dir}/build/classes/thrift" />
+            <zipgroupfileset dir="${cassandra.lib}" includes="*.jar" />
+        </jar>
     </target>
 
     <target name="clean">