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)