You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ma...@apache.org on 2015/03/23 09:21:04 UTC

cassandra git commit: Only calculate maxPurgableTimestamp if we know there are tombstones

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 <ma...@apache.org>
Authored: Fri Mar 6 17:34:28 2015 +0100
Committer: Marcus Eriksson <ma...@apache.org>
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.