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

Reply via email to