Updated Branches: refs/heads/cassandra-1.0 5bcfcbc3e -> 84a1d6059 refs/heads/cassandra-1.1 c716fc7fa -> 485c87898 refs/heads/trunk 19a45370d -> 3c90be1d6
merge from 1.1 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/3c90be1d Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/3c90be1d Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/3c90be1d Branch: refs/heads/trunk Commit: 3c90be1d63a1c29c3cc8d952a9ae22b982ee0550 Parents: 19a4537 485c878 Author: Jonathan Ellis <jbel...@apache.org> Authored: Tue Jul 10 12:06:42 2012 -0500 Committer: Jonathan Ellis <jbel...@apache.org> Committed: Tue Jul 10 12:06:42 2012 -0500 ---------------------------------------------------------------------- .../cassandra/db/AbstractColumnContainer.java | 3 +- .../cassandra/db/compaction/CompactionsTest.java | 53 +++++++++++++-- 2 files changed, 49 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/3c90be1d/src/java/org/apache/cassandra/db/AbstractColumnContainer.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/db/AbstractColumnContainer.java index 23bf6f8,aece78a..f58f6ab --- a/src/java/org/apache/cassandra/db/AbstractColumnContainer.java +++ b/src/java/org/apache/cassandra/db/AbstractColumnContainer.java @@@ -197,11 -199,12 +197,12 @@@ public abstract class AbstractColumnCon public boolean hasIrrelevantData(int gcBefore) { - if (getLocalDeletionTime() < gcBefore) + if (deletionInfo().purge(gcBefore) == DeletionInfo.LIVE) return true; - long deletedAt = getMarkedForDeleteAt(); ++ long deletedAt = deletionInfo().maxTimestamp(); for (IColumn column : columns) - if (column.mostRecentLiveChangeAt() < deletionInfo().maxTimestamp() || column.hasIrrelevantData(gcBefore)) + if (column.mostRecentLiveChangeAt() <= deletedAt || column.hasIrrelevantData(gcBefore)) return true; return false; http://git-wip-us.apache.org/repos/asf/cassandra/blob/3c90be1d/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java ---------------------------------------------------------------------- diff --cc test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java index 2b134d1,6339224..b1ae773 --- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java @@@ -18,30 -18,34 +18,34 @@@ */ package org.apache.cassandra.db.compaction; --import java.io.*; ++import java.io.ByteArrayOutputStream; ++import java.io.IOException; ++import java.io.PrintStream; ++import java.io.RandomAccessFile; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Collection; -import java.util.Collections; -import java.util.Set; +import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import org.junit.Test; --import static junit.framework.Assert.assertEquals; --import static junit.framework.Assert.assertNotNull; - import static junit.framework.Assert.assertTrue; import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.*; - import org.apache.cassandra.db.compaction.OperationType; -import org.apache.cassandra.db.columniterator.IColumnIterator; + import org.apache.cassandra.db.columniterator.IdentityQueryFilter; -import org.apache.cassandra.db.compaction.OperationType; ++import org.apache.cassandra.db.columniterator.OnDiskAtomIterator; import org.apache.cassandra.db.filter.QueryFilter; import org.apache.cassandra.db.filter.QueryPath; --import org.apache.cassandra.io.sstable.*; ++import org.apache.cassandra.io.sstable.SSTableReader; ++import org.apache.cassandra.io.sstable.SSTableScanner; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; ++import static junit.framework.Assert.*; ++ public class CompactionsTest extends SchemaLoader { public static final String TABLE1 = "Keyspace1"; @@@ -191,6 -146,43 +195,43 @@@ assertMaxTimestamp(cfs, maxTimestampExpected); } + @Test + public void testSuperColumnTombstones() throws IOException, ExecutionException, InterruptedException + { + Table table = Table.open(TABLE1); + ColumnFamilyStore cfs = table.getColumnFamilyStore("Super1"); + cfs.disableAutoCompaction(); + + DecoratedKey key = Util.dk("tskey"); + ByteBuffer scName = ByteBufferUtil.bytes("TestSuperColumn"); + + // a subcolumn + RowMutation rm = new RowMutation(TABLE1, key.key); + rm.add(new QueryPath("Super1", scName, ByteBufferUtil.bytes(0)), + ByteBufferUtil.EMPTY_BYTE_BUFFER, + FBUtilities.timestampMicros()); + rm.apply(); + cfs.forceBlockingFlush(); + + // shadow the subcolumn with a supercolumn tombstone + rm = new RowMutation(TABLE1, key.key); + rm.delete(new QueryPath("Super1", scName), FBUtilities.timestampMicros()); + rm.apply(); + cfs.forceBlockingFlush(); + + CompactionManager.instance.performMaximal(cfs); + assertEquals(1, cfs.getSSTables().size()); + + // check that the shadowed column is gone + SSTableReader sstable = cfs.getSSTables().iterator().next(); + SSTableScanner scanner = sstable.getScanner(new QueryFilter(null, new QueryPath("Super1", scName), new IdentityQueryFilter())); + scanner.seekTo(key); - IColumnIterator iter = scanner.next(); ++ OnDiskAtomIterator iter = scanner.next(); + assertEquals(key, iter.getKey()); + SuperColumn sc = (SuperColumn) iter.next(); + assert sc.getSubColumns().isEmpty(); + } + public void assertMaxTimestamp(ColumnFamilyStore cfs, long maxTimestampExpected) { long maxTimestampObserved = Long.MIN_VALUE;