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)]: