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)