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)