Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.1 6c69f9a7c -> fd0bdef5a


Only calculate maxPurgableTimestamp if we know there are tombstones

Patch by marcuse; reviewed by Sylvain Lebresne for CASSANDRA-8914


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/fd0bdef5
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/fd0bdef5
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/fd0bdef5

Branch: refs/heads/cassandra-2.1
Commit: fd0bdef5abb9c7fb4318b7c4c989cb90d352a19b
Parents: 6c69f9a
Author: Marcus Eriksson <[email protected]>
Authored: Fri Mar 6 17:34:28 2015 +0100
Committer: Marcus Eriksson <[email protected]>
Committed: Mon Mar 23 09:07:42 2015 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../db/compaction/LazilyCompactedRow.java       | 31 ++++++++++++++------
 2 files changed, 23 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/fd0bdef5/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 03f7e1c..25b0a06 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.4
+ * Only calculate max purgable timestamp if we have to (CASSANDRA-8914)
  * (cqlsh) Greatly improve performance of COPY FROM (CASSANDRA-8225)
  * IndexSummary effectiveIndexInterval is now a guideline, not a rule 
(CASSANDRA-8993)
  * Use correct bounds for page cache eviction of compressed files 
(CASSANDRA-8746)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/fd0bdef5/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java 
b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java
index cfdbd17..f61225a 100644
--- a/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java
+++ b/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java
@@ -50,7 +50,8 @@ public class LazilyCompactedRow extends AbstractCompactedRow
 {
     private final List<? extends OnDiskAtomIterator> rows;
     private final CompactionController controller;
-    private final long maxPurgeableTimestamp;
+    private boolean hasCalculatedMaxPurgeableTimestamp = false;
+    private long maxPurgeableTimestamp;
     private final ColumnFamily emptyColumnFamily;
     private ColumnStats columnStats;
     private boolean closed;
@@ -77,19 +78,29 @@ public class LazilyCompactedRow extends AbstractCompactedRow
                 maxRowTombstone = rowTombstone;
         }
 
-        // tombstones with a localDeletionTime before this can be purged.  
This is the minimum timestamp for any sstable
-        // containing `key` outside of the set of sstables involved in this 
compaction.
-        maxPurgeableTimestamp = controller.maxPurgeableTimestamp(key);
-
         emptyColumnFamily = 
ArrayBackedSortedColumns.factory.create(controller.cfs.metadata);
         emptyColumnFamily.delete(maxRowTombstone);
-        if (maxRowTombstone.markedForDeleteAt < maxPurgeableTimestamp)
+        if (!maxRowTombstone.isLive() && maxRowTombstone.markedForDeleteAt < 
getMaxPurgeableTimestamp())
             emptyColumnFamily.purgeTombstones(controller.gcBefore);
 
         reducer = new Reducer();
         merger = Iterators.filter(MergeIterator.get(rows, 
emptyColumnFamily.getComparator().onDiskAtomComparator(), reducer), 
Predicates.notNull());
     }
 
+    /**
+     * tombstones with a localDeletionTime before this can be purged.  This is 
the minimum timestamp for any sstable
+     * containing `key` outside of the set of sstables involved in this 
compaction.
+     */
+    private long getMaxPurgeableTimestamp()
+    {
+        if (!hasCalculatedMaxPurgeableTimestamp)
+        {
+            hasCalculatedMaxPurgeableTimestamp = true;
+            maxPurgeableTimestamp = controller.maxPurgeableTimestamp(key);
+        }
+        return maxPurgeableTimestamp;
+    }
+
     private static void removeDeleted(ColumnFamily cf, boolean shouldPurge, 
DecoratedKey key, CompactionController controller)
     {
         // We should only purge cell tombstones if shouldPurge is true, but 
regardless, it's still ok to remove cells that
@@ -251,7 +262,7 @@ public class LazilyCompactedRow extends AbstractCompactedRow
                 RangeTombstone t = tombstone;
                 tombstone = null;
 
-                if (t.timestamp() < maxPurgeableTimestamp && 
t.data.isGcAble(controller.gcBefore))
+                if (t.timestamp() < getMaxPurgeableTimestamp() && 
t.data.isGcAble(controller.gcBefore))
                 {
                     indexBuilder.tombstoneTracker().update(t, true);
                     return null;
@@ -269,11 +280,13 @@ public class LazilyCompactedRow extends 
AbstractCompactedRow
             }
             else
             {
-                boolean shouldPurge = 
container.getSortedColumns().iterator().next().timestamp() < 
maxPurgeableTimestamp;
                 // when we clear() the container, it removes the deletion 
info, so this needs to be reset each time
                 container.delete(maxRowTombstone);
-                removeDeleted(container, shouldPurge, key, controller);
                 Iterator<Cell> iter = container.iterator();
+                Cell c = iter.next();
+                boolean shouldPurge = c.getLocalDeletionTime() < 
Integer.MAX_VALUE && c.timestamp() < getMaxPurgeableTimestamp();
+                removeDeleted(container, shouldPurge, key, controller);
+                iter = container.iterator();
                 if (!iter.hasNext())
                 {
                     // don't call clear() because that resets the deletion 
time. See CASSANDRA-7808.

Reply via email to