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 2011/09/22 22:11:13 UTC

svn commit: r1174366 - in /cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db: AbstractColumnContainer.java Column.java IColumn.java IColumnContainer.java compaction/PrecompactedRow.java

Author: jbellis
Date: Thu Sep 22 20:11:12 2011
New Revision: 1174366

URL: http://svn.apache.org/viewvc?rev=1174366&view=rev
Log:
avoid calling shouldPurge unless necessary
patch by jbellis; reviewed by slebresne and tested by brandonwilliams for CASSANDRA-3234

Modified:
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/AbstractColumnContainer.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/Column.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumn.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumnContainer.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/AbstractColumnContainer.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/AbstractColumnContainer.java?rev=1174366&r1=1174365&r2=1174366&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/AbstractColumnContainer.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/AbstractColumnContainer.java Thu Sep 22 20:11:12 2011
@@ -244,4 +244,16 @@ public abstract class AbstractColumnCont
             this.localDeletionTime = localDeletionTime;
         }
     }
+
+    public boolean hasExpiredTombstones(int gcBefore)
+    {
+        if (isMarkedForDelete() && getLocalDeletionTime() < gcBefore)
+            return true;
+
+        for (IColumn column : columns)
+            if (column.hasExpiredTombstones(gcBefore))
+                return true;
+
+        return false;
+    }
 }

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/Column.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/Column.java?rev=1174366&r1=1174365&r2=1174366&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/Column.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/Column.java Thu Sep 22 20:11:12 2011
@@ -280,5 +280,10 @@ public class Column implements IColumn
         if (valueValidator != null)
             valueValidator.validate(value());
     }
+
+    public boolean hasExpiredTombstones(int gcBefore)
+    {
+        return isMarkedForDelete() && getLocalDeletionTime() < gcBefore;
+    }
 }
 

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumn.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumn.java?rev=1174366&r1=1174365&r2=1174366&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumn.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumn.java Thu Sep 22 20:11:12 2011
@@ -72,6 +72,11 @@ public interface IColumn
     boolean isLive();
 
     /**
+     * @return true if the column or any its subcolumns expired before @param gcBefore
+     */
+    public boolean hasExpiredTombstones(int gcBefore);
+
+    /**
      * For a standard column, this is the same as timestamp().
      * For a super column, this is the max column timestamp of the sub columns.
      */

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumnContainer.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumnContainer.java?rev=1174366&r1=1174365&r2=1174366&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumnContainer.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/IColumnContainer.java Thu Sep 22 20:11:12 2011
@@ -44,7 +44,7 @@ public interface IColumnContainer
 
     public boolean isMarkedForDelete();
     public long getMarkedForDeleteAt();
-    public int getLocalDeletionTime();
+    public boolean hasExpiredTombstones(int gcBefore);
 
     public AbstractType getComparator();
 

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java?rev=1174366&r1=1174365&r2=1174366&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/PrecompactedRow.java Thu Sep 22 20:11:12 2011
@@ -66,7 +66,27 @@ public class PrecompactedRow extends Abs
 
     public static ColumnFamily removeDeletedAndOldShards(DecoratedKey<?> key, CompactionController controller, ColumnFamily cf)
     {
-        return removeDeletedAndOldShards(controller.shouldPurge(key), controller, cf);
+        // avoid calling shouldPurge unless we actually need to: it can be very expensive if LCS
+        // gets behind and has hundreds of overlapping L0 sstables.  Essentially, this method is an
+        // ugly refactor of removeDeletedAndOldShards(controller.shouldPurge(key), controller, cf),
+        // taking this into account.
+        Boolean shouldPurge = null;
+
+        if (cf.hasExpiredTombstones(controller.gcBefore))
+            shouldPurge = controller.shouldPurge(key);
+        ColumnFamily compacted = shouldPurge != null && shouldPurge
+                               ? ColumnFamilyStore.removeDeleted(cf, controller.gcBefore)
+                               : cf;
+
+        if (compacted != null && compacted.metadata().getDefaultValidator().isCommutative())
+        {
+            if (shouldPurge == null)
+                shouldPurge = controller.shouldPurge(key);
+            if (shouldPurge)
+                CounterColumn.removeOldShards(compacted, controller.gcBefore);
+        }
+
+        return compacted;
     }
 
     public static ColumnFamily removeDeletedAndOldShards(boolean shouldPurge, CompactionController controller, ColumnFamily cf)