Author: jbellis
Date: Fri Mar 11 14:25:49 2011
New Revision: 1080577
URL: http://svn.apache.org/viewvc?rev=1080577&view=rev
Log:
purge tombstoned rows from cache after GCGraceSeconds
patch by slebresne; reviewed by jbellis for CASSANDRA-2305
Modified:
cassandra/branches/cassandra-0.7/CHANGES.txt
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/CompactionIterator.java
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/CompactionsPurgeTest.java
Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1080577&r1=1080576&r2=1080577&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Fri Mar 11 14:25:49 2011
@@ -20,6 +20,7 @@
get synced before server died (CASSANDRA-2285)
* fix fd leak in sstable2json with non-mmap'd i/o (CASSANDRA-2304)
* reduce memory use during streaming of multiple sstables (CASSANDRA-2301)
+ * purge tombstoned rows from cache after GCGraceSeconds (CASSANDRA-2305)
0.7.3
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1080577&r1=1080576&r2=1080577&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
Fri Mar 11 14:25:49 2011
@@ -1747,7 +1747,7 @@ public class ColumnFamilyStore implement
return ssTables.getRowCache().getCapacity() == 0 ? null :
ssTables.getRowCache().getInternal(key);
}
- void invalidateCachedRow(DecoratedKey key)
+ public void invalidateCachedRow(DecoratedKey key)
{
ssTables.getRowCache().remove(key);
}
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/CompactionIterator.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/CompactionIterator.java?rev=1080577&r1=1080576&r2=1080577&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/CompactionIterator.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/CompactionIterator.java
Fri Mar 11 14:25:49 2011
@@ -106,7 +106,15 @@ implements Closeable, ICompactionInfo
try
{
AbstractCompactedRow compactedRow = getCompactedRow();
- return compactedRow.isEmpty() ? null : compactedRow;
+ if (compactedRow.isEmpty())
+ {
+ cfs.invalidateCachedRow(compactedRow.key);
+ return null;
+ }
+ else
+ {
+ return compactedRow;
+ }
}
finally
{
Modified:
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/CompactionsPurgeTest.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/CompactionsPurgeTest.java?rev=1080577&r1=1080576&r2=1080577&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/CompactionsPurgeTest.java
(original)
+++
cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/CompactionsPurgeTest.java
Fri Mar 11 14:25:49 2011
@@ -178,4 +178,53 @@ public class CompactionsPurgeTest extend
ColumnFamily cf =
table.getColumnFamilyStore(cfName).getColumnFamily(QueryFilter.getIdentityFilter(key,
new QueryPath(cfName)));
assert cf == null : cf;
}
+
+ @Test
+ public void testCompactionPurgeTombstonedRow() throws IOException,
ExecutionException, InterruptedException
+ {
+ CompactionManager.instance.disableAutoCompaction();
+
+ String tableName = "RowCacheSpace";
+ String cfName = "CachedCF";
+ Table table = Table.open(tableName);
+ ColumnFamilyStore cfs = table.getColumnFamilyStore(cfName);
+
+ DecoratedKey key = Util.dk("key3");
+ RowMutation rm;
+
+ // inserts
+ rm = new RowMutation(tableName, key.key);
+ for (int i = 0; i < 10; i++)
+ {
+ rm.add(new QueryPath(cfName, null,
ByteBuffer.wrap(String.valueOf(i).getBytes())),
ByteBufferUtil.EMPTY_BYTE_BUFFER, 0);
+ }
+ rm.apply();
+
+ // move the key up in row cache
+ cfs.getColumnFamily(QueryFilter.getIdentityFilter(key, new
QueryPath(cfName)));
+
+ // deletes row
+ rm = new RowMutation(tableName, key.key);
+ rm.delete(new QueryPath(cfName, null, null), 1);
+ rm.apply();
+
+ // flush and major compact
+ cfs.forceBlockingFlush();
+ CompactionManager.instance.submitMajor(cfs, 0,
Integer.MAX_VALUE).get();
+ //cfs.invalidateCachedRow(key);
+
+ // re-inserts with timestamp lower than delete
+ rm = new RowMutation(tableName, key.key);
+ for (int i = 0; i < 10; i++)
+ {
+ rm.add(new QueryPath(cfName, null,
ByteBuffer.wrap(String.valueOf(i).getBytes())),
ByteBufferUtil.EMPTY_BYTE_BUFFER, 0);
+ }
+ rm.apply();
+
+ // Check that the second insert did went in
+ ColumnFamily cf =
cfs.getColumnFamily(QueryFilter.getIdentityFilter(key, new QueryPath(cfName)));
+ assert cf.getColumnCount() == 10;
+ for (IColumn c : cf)
+ assert !c.isMarkedForDelete();
+ }
}