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 2009/07/16 02:39:02 UTC

svn commit: r794475 - in /incubator/cassandra/trunk: src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/db/filter/ test/system/

Author: jbellis
Date: Thu Jul 16 00:39:01 2009
New Revision: 794475

URL: http://svn.apache.org/viewvc?rev=794475&view=rev
Log:
fix not including tombstone-only keys in keyRange.
patch by jbellis; reviewed by Evan Weaver for CASSANDRA-286

Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java
    incubator/cassandra/trunk/test/system/test_server.py

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=794475&r1=794474&r2=794475&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Thu Jul 16 00:39:01 2009
@@ -530,7 +530,12 @@
      */
     static ColumnFamily removeDeleted(ColumnFamily cf)
     {
-        return removeDeleted(cf, (int) (System.currentTimeMillis() / 1000) - DatabaseDescriptor.getGcGraceInSeconds());
+        return removeDeleted(cf, getDefaultGCBefore());
+    }
+
+    public static int getDefaultGCBefore()
+    {
+        return (int)(System.currentTimeMillis() / 1000) - DatabaseDescriptor.getGcGraceInSeconds();
     }
 
     static ColumnFamily removeDeleted(ColumnFamily cf, int gcBefore)
@@ -1431,12 +1436,17 @@
         return getColumnFamily(new TimeQueryFilter(key, columnParent, since));    
     }
 
+    public ColumnFamily getColumnFamily(QueryFilter filter) throws IOException
+    {
+        return getColumnFamily(filter, getDefaultGCBefore());
+    }
+
     /**
      * get a list of columns starting from a given column, in a specified order.
      * only the latest version of a column is returned.
      * @return null if there is no data and no tombstones; otherwise a ColumnFamily
      */
-    public ColumnFamily getColumnFamily(QueryFilter filter) throws IOException
+    public ColumnFamily getColumnFamily(QueryFilter filter, int gcBefore) throws IOException
     {
         // if we are querying subcolumns of a supercolumn, fetch the supercolumn with NQF, then filter in-memory.
         if (filter.path.superColumnName != null)
@@ -1450,7 +1460,7 @@
                     filter.filterSuperColumn((SuperColumn) column);
                 }
             }
-            return removeDeleted(cf);
+            return removeDeleted(cf, gcBefore);
         }
 
         // we are querying top-level columns, do a merging fetch with indexes.
@@ -1500,9 +1510,9 @@
             if (!collated.hasNext())
                 return null;
 
-            filter.collectColumns(returnCF, collated);
+            filter.collectColumns(returnCF, collated, gcBefore);
 
-            return removeDeleted(returnCF);
+            return removeDeleted(returnCF, gcBefore); // collect does a first pass but doesn't try to recognize e.g. the entire CF being tombstoned
         }
         finally
         {

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=794475&r1=794474&r2=794475&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Thu Jul 16 00:39:01 2009
@@ -711,7 +711,7 @@
                 }
                 // make sure there is actually non-tombstone content associated w/ this key
                 // TODO record the key source(s) somehow and only check that source (e.g., memtable or sstable)
-                if (ColumnFamilyStore.removeDeleted(cfs.getColumnFamily(new SliceQueryFilter(current, new QueryPath(cfName), "", "", true, 1)), Integer.MAX_VALUE) != null)
+                if (cfs.getColumnFamily(new SliceQueryFilter(current, new QueryPath(cfName), "", "", true, 1), Integer.MAX_VALUE) != null)
                 {
                     keys.add(current);
                 }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java?rev=794475&r1=794474&r2=794475&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java Thu Jul 16 00:39:01 2009
@@ -49,11 +49,12 @@
         }
     }
 
-    public void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns)
+    public void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns, int gcBefore)
     {
         for (IColumn column : reducedColumns)
         {
-            returnCF.addColumn(column);
+            if (!column.isMarkedForDelete() || column.getLocalDeletionTime() > gcBefore)
+                returnCF.addColumn(column);
         }
     }
 }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java?rev=794475&r1=794474&r2=794475&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java Thu Jul 16 00:39:01 2009
@@ -36,7 +36,7 @@
      * by the filter code, which should have some limit on the number of columns
      * to avoid running out of memory on large rows.
      */
-    public abstract void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns);
+    public abstract void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns, int gcBefore);
 
     /**
      * subcolumns of a supercolumn are unindexed, so to pick out parts of those we operate in-memory.
@@ -55,7 +55,7 @@
         };
     }
     
-    public void collectColumns(final ColumnFamily returnCF, Iterator collatedColumns)
+    public void collectColumns(final ColumnFamily returnCF, Iterator collatedColumns, int gcBefore)
     {
         // define a 'reduced' iterator that merges columns w/ the same name, which
         // greatly simplifies computing liveColumns in the presence of tombstones.
@@ -81,7 +81,7 @@
             }
         };
 
-        collectColumns(returnCF, reduced);
+        collectColumns(returnCF, reduced, gcBefore);
     }
 
     public String getColumnFamilyName()

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java?rev=794475&r1=794474&r2=794475&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java Thu Jul 16 00:39:01 2009
@@ -47,7 +47,7 @@
         return isAscending ? comparator : new ReverseComparator(comparator);
     }
 
-    public void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns)
+    public void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns, int gcBefore)
     {
         int liveColumns = 0;
 
@@ -59,10 +59,12 @@
                 && ((isAscending && column.name().compareTo(finish) > 0))
                     || (!isAscending && column.name().compareTo(finish) < 0))
                 break;
+
             if (!column.isMarkedForDelete())
                 liveColumns++;
 
-            returnCF.addColumn(column);
+            if (!column.isMarkedForDelete() || column.getLocalDeletionTime() > gcBefore)
+                returnCF.addColumn(column);
         }
     }
 }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java?rev=794475&r1=794474&r2=794475&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/TimeQueryFilter.java Thu Jul 16 00:39:01 2009
@@ -33,11 +33,12 @@
         return ColumnComparatorFactory.timestampComparator_;
     }
 
-    public void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns)
+    public void collectColumns(ColumnFamily returnCF, ReducingIterator<IColumn> reducedColumns, int gcBefore)
     {
         for (IColumn column : reducedColumns)
         {
-            returnCF.addColumn(column);
+            if (!column.isMarkedForDelete() || column.getLocalDeletionTime() > gcBefore)
+                returnCF.addColumn(column);
         }
     }
 

Modified: incubator/cassandra/trunk/test/system/test_server.py
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/system/test_server.py?rev=794475&r1=794474&r2=794475&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/system/test_server.py (original)
+++ incubator/cassandra/trunk/test/system/test_server.py Thu Jul 16 00:39:01 2009
@@ -273,7 +273,15 @@
         client.remove('Table1', 'key1', ColumnPathOrParent('Standard1', column='c1'), 1, True)
         client.remove('Table1', 'key1', ColumnPathOrParent('Standard1', column='c2'), 1, True)
         actual = client.get_key_range('Table1', 'Standard1', '', '', 1000)
-        assert not actual, actual
+        assert actual == [], actual
+
+    def test_range_with_remove_cf(self):
+        _insert_simple()
+        assert client.get_key_range('Table1', 'Standard1', 'key1', '', 1000) == ['key1']
+
+        client.remove('Table1', 'key1', ColumnPathOrParent('Standard1'), 1, True)
+        actual = client.get_key_range('Table1', 'Standard1', '', '', 1000)
+        assert actual == [], actual
 
     def test_range_collation(self):
         for key in ['-a', '-b', 'a', 'b'] + [str(i) for i in xrange(100)]: