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.