Repository: cassandra Updated Branches: refs/heads/trunk b91250556 -> 0db507454
Release references to compacted overlapping sstables during compaction Patch by benedict; reviewed by marcuse for CASSANDRA-7819 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/0793e569 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/0793e569 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/0793e569 Branch: refs/heads/trunk Commit: 0793e569b4ae5f3a74fbff272fed8ef8332f0557 Parents: 4743811 Author: Marcus Eriksson <[email protected]> Authored: Thu Oct 2 11:08:38 2014 +0200 Committer: Marcus Eriksson <[email protected]> Committed: Thu Oct 2 11:32:34 2014 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../db/compaction/CompactionController.java | 24 ++++++++++++++++++-- .../cassandra/db/compaction/CompactionTask.java | 7 ++++++ 3 files changed, 30 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/0793e569/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 6b42b6a..95218cb 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.1.1 + * Release references to overlapping sstables during compaction (CASSANDRA-7819) * Send notification when opening compaction results early (CASSANDRA-8034) * Make native server start block until properly bound (CASSANDRA-7885) * (cqlsh) Fix IPv6 support (CASSANDRA-7988) http://git-wip-us.apache.org/repos/asf/cassandra/blob/0793e569/src/java/org/apache/cassandra/db/compaction/CompactionController.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionController.java b/src/java/org/apache/cassandra/db/compaction/CompactionController.java index 2bd9c86..ef27805 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionController.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionController.java @@ -41,8 +41,8 @@ public class CompactionController implements AutoCloseable private static final Logger logger = LoggerFactory.getLogger(CompactionController.class); public final ColumnFamilyStore cfs; - private final DataTracker.SSTableIntervalTree overlappingTree; - private final Set<SSTableReader> overlappingSSTables; + private DataTracker.SSTableIntervalTree overlappingTree; + private Set<SSTableReader> overlappingSSTables; private final Set<SSTableReader> compacting; public final int gcBefore; @@ -58,6 +58,26 @@ public class CompactionController implements AutoCloseable this.cfs = cfs; this.gcBefore = gcBefore; this.compacting = compacting; + refreshOverlaps(); + } + + void maybeRefreshOverlaps() + { + for (SSTableReader reader : overlappingSSTables) + { + if (reader.isMarkedCompacted()) + { + refreshOverlaps(); + return; + } + } + } + + private void refreshOverlaps() + { + if (this.overlappingSSTables != null) + SSTableReader.releaseReferences(overlappingSSTables); + Set<SSTableReader> overlapping = compacting == null ? null : cfs.getAndReferenceOverlappingSSTables(compacting); this.overlappingSSTables = overlapping == null ? Collections.<SSTableReader>emptySet() : overlapping; this.overlappingTree = overlapping == null ? null : DataTracker.buildIntervalTree(overlapping); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0793e569/src/java/org/apache/cassandra/db/compaction/CompactionTask.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java index 6217348..d2ae04a 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java @@ -160,6 +160,7 @@ public class CompactionTask extends AbstractCompactionTask long maxAge = getMaxDataAge(actuallyCompact); if (collector != null) collector.beginCompaction(ci); + long lastCheckObsoletion = start; SSTableRewriter writer = new SSTableRewriter(cfs, sstables, maxAge, compactionType, offline); try { @@ -187,6 +188,12 @@ public class CompactionTask extends AbstractCompactionTask writer.switchWriter(createCompactionWriter(sstableDirectory, keysPerSSTable, minRepairedAt)); } } + + if (System.nanoTime() - lastCheckObsoletion > TimeUnit.MINUTES.toNanos(1L)) + { + controller.maybeRefreshOverlaps(); + lastCheckObsoletion = System.nanoTime(); + } } // don't replace old sstables yet, as we need to mark the compaction finished in the system table
