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;

Reply via email to