You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by yu...@apache.org on 2015/07/08 19:16:48 UTC

[01/10] cassandra git commit: Fix growing pending background compaction

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.0 452d6a445 -> f283ed298
  refs/heads/cassandra-2.1 30df089d7 -> 58599a9a0
  refs/heads/cassandra-2.2 12ff1cda7 -> ce63a2e92
  refs/heads/trunk 5eed96789 -> 83e378737


Fix growing pending background compaction

patch by yukim; reviewed by benedict for CASSANDRA-9662


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

Branch: refs/heads/cassandra-2.0
Commit: f283ed29814403bde6350a2598cdd6e2c8b983d5
Parents: 452d6a4
Author: Yuki Morishita <yu...@apache.org>
Authored: Fri Jun 26 11:50:51 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 11:58:17 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                       |  3 ++-
 .../apache/cassandra/db/ColumnFamilyStore.java    | 13 +------------
 .../db/compaction/CompactionManager.java          | 18 +++++-------------
 .../cassandra/metrics/CompactionMetrics.java      |  6 +++---
 .../cassandra/db/compaction/CompactionsTest.java  | 12 +++++++++---
 5 files changed, 20 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index bd1db92..40bf463 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
 2.0.18
-* Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+ * Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+ * Fix growing pending background compaction (CASSANDRA-9662)
 
 
 2.0.17

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index bf1e779..00b2eb8 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -180,20 +180,9 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         {
             public void run()
             {
-                List<ColumnFamilyStore> submitted = new ArrayList<>();
                 for (Keyspace keyspace : Keyspace.all())
                     for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores())
-                        if (!CompactionManager.instance.submitBackground(cfs, false).isEmpty())
-                            submitted.add(cfs);
-
-                while (!submitted.isEmpty() && CompactionManager.instance.getActiveCompactions() < CompactionManager.instance.getMaximumCompactorThreads())
-                {
-                    List<ColumnFamilyStore> submitMore = ImmutableList.copyOf(submitted);
-                    submitted.clear();
-                    for (ColumnFamilyStore cfs : submitMore)
-                        if (!CompactionManager.instance.submitBackground(cfs, false).isEmpty())
-                            submitted.add(cfs);
-                }
+                        CompactionManager.instance.submitBackground(cfs);
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index c66eeb6..5b5b39e 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -128,11 +128,6 @@ public class CompactionManager implements CompactionManagerMBean
      */
     public List<Future<?>> submitBackground(final ColumnFamilyStore cfs)
     {
-        return submitBackground(cfs, true);
-    }
-
-    public List<Future<?>> submitBackground(final ColumnFamilyStore cfs, boolean autoFill)
-    {
         if (cfs.isAutoCompactionDisabled())
         {
             logger.debug("Autocompaction is disabled");
@@ -151,14 +146,11 @@ public class CompactionManager implements CompactionManagerMBean
                      cfs.keyspace.getName(),
                      cfs.name,
                      cfs.getCompactionStrategy().getClass().getSimpleName());
-        List<Future<?>> futures = new ArrayList<Future<?>>();
+        List<Future<?>> futures = new ArrayList<>();
 
         // we must schedule it at least once, otherwise compaction will stop for a CF until next flush
-        do {
-            compactingCF.add(cfs);
-            futures.add(executor.submit(new BackgroundCompactionTask(cfs)));
-            // if we have room for more compactions, then fill up executor
-        } while (autoFill && executor.getActiveCount() + futures.size() < executor.getMaximumPoolSize());
+        compactingCF.add(cfs);
+        futures.add(executor.submit(new BackgroundCompactionCandidate(cfs)));
 
         return futures;
     }
@@ -173,11 +165,11 @@ public class CompactionManager implements CompactionManagerMBean
 
     // the actual sstables to compact are not determined until we run the BCT; that way, if new sstables
     // are created between task submission and execution, we execute against the most up-to-date information
-    class BackgroundCompactionTask implements Runnable
+    class BackgroundCompactionCandidate implements Runnable
     {
         private final ColumnFamilyStore cfs;
 
-        BackgroundCompactionTask(ColumnFamilyStore cfs)
+        BackgroundCompactionCandidate(ColumnFamilyStore cfs)
         {
             this.cfs = cfs;
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
index b015130..f7a99e1 100644
--- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
@@ -58,14 +58,14 @@ public class CompactionMetrics implements CompactionManager.CompactionExecutorSt
             public Integer value()
             {
                 int n = 0;
+                // add estimate number of compactions need to be done
                 for (String keyspaceName : Schema.instance.getKeyspaces())
                 {
                     for (ColumnFamilyStore cfs : Keyspace.open(keyspaceName).getColumnFamilyStores())
                         n += cfs.getCompactionStrategy().getEstimatedRemainingTasks();
                 }
-                for (ThreadPoolExecutor collector : collectors)
-                    n += collector.getTaskCount() - collector.getCompletedTaskCount();
-                return n;
+                // add number of currently running compactions
+                return n + compactions.size();
             }
         });
         completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge<Long>()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
index 1879838..7da8d92 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
@@ -82,8 +82,10 @@ public class CompactionsTest extends SchemaLoader
         // enable compaction, submit background and wait for it to complete
         store.enableAutoCompaction();
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         // and sstable with ttl should be compacted
         assertEquals(1, store.getSSTables().size());
@@ -202,8 +204,10 @@ public class CompactionsTest extends SchemaLoader
         // enable compaction, submit background and wait for it to complete
         store.enableAutoCompaction();
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         // even though both sstables were candidate for tombstone compaction
         // it was not executed because they have an overlapping token range
@@ -222,8 +226,10 @@ public class CompactionsTest extends SchemaLoader
 
         //submit background task again and wait for it to complete
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         //we still have 2 sstables, since they were not compacted against each other
         assertEquals(2, store.getSSTables().size());


[04/10] cassandra git commit: Fix growing pending background compaction

Posted by yu...@apache.org.
Fix growing pending background compaction

patch by yukim; reviewed by benedict for CASSANDRA-9662


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

Branch: refs/heads/trunk
Commit: f283ed29814403bde6350a2598cdd6e2c8b983d5
Parents: 452d6a4
Author: Yuki Morishita <yu...@apache.org>
Authored: Fri Jun 26 11:50:51 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 11:58:17 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                       |  3 ++-
 .../apache/cassandra/db/ColumnFamilyStore.java    | 13 +------------
 .../db/compaction/CompactionManager.java          | 18 +++++-------------
 .../cassandra/metrics/CompactionMetrics.java      |  6 +++---
 .../cassandra/db/compaction/CompactionsTest.java  | 12 +++++++++---
 5 files changed, 20 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index bd1db92..40bf463 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
 2.0.18
-* Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+ * Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+ * Fix growing pending background compaction (CASSANDRA-9662)
 
 
 2.0.17

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index bf1e779..00b2eb8 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -180,20 +180,9 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         {
             public void run()
             {
-                List<ColumnFamilyStore> submitted = new ArrayList<>();
                 for (Keyspace keyspace : Keyspace.all())
                     for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores())
-                        if (!CompactionManager.instance.submitBackground(cfs, false).isEmpty())
-                            submitted.add(cfs);
-
-                while (!submitted.isEmpty() && CompactionManager.instance.getActiveCompactions() < CompactionManager.instance.getMaximumCompactorThreads())
-                {
-                    List<ColumnFamilyStore> submitMore = ImmutableList.copyOf(submitted);
-                    submitted.clear();
-                    for (ColumnFamilyStore cfs : submitMore)
-                        if (!CompactionManager.instance.submitBackground(cfs, false).isEmpty())
-                            submitted.add(cfs);
-                }
+                        CompactionManager.instance.submitBackground(cfs);
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index c66eeb6..5b5b39e 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -128,11 +128,6 @@ public class CompactionManager implements CompactionManagerMBean
      */
     public List<Future<?>> submitBackground(final ColumnFamilyStore cfs)
     {
-        return submitBackground(cfs, true);
-    }
-
-    public List<Future<?>> submitBackground(final ColumnFamilyStore cfs, boolean autoFill)
-    {
         if (cfs.isAutoCompactionDisabled())
         {
             logger.debug("Autocompaction is disabled");
@@ -151,14 +146,11 @@ public class CompactionManager implements CompactionManagerMBean
                      cfs.keyspace.getName(),
                      cfs.name,
                      cfs.getCompactionStrategy().getClass().getSimpleName());
-        List<Future<?>> futures = new ArrayList<Future<?>>();
+        List<Future<?>> futures = new ArrayList<>();
 
         // we must schedule it at least once, otherwise compaction will stop for a CF until next flush
-        do {
-            compactingCF.add(cfs);
-            futures.add(executor.submit(new BackgroundCompactionTask(cfs)));
-            // if we have room for more compactions, then fill up executor
-        } while (autoFill && executor.getActiveCount() + futures.size() < executor.getMaximumPoolSize());
+        compactingCF.add(cfs);
+        futures.add(executor.submit(new BackgroundCompactionCandidate(cfs)));
 
         return futures;
     }
@@ -173,11 +165,11 @@ public class CompactionManager implements CompactionManagerMBean
 
     // the actual sstables to compact are not determined until we run the BCT; that way, if new sstables
     // are created between task submission and execution, we execute against the most up-to-date information
-    class BackgroundCompactionTask implements Runnable
+    class BackgroundCompactionCandidate implements Runnable
     {
         private final ColumnFamilyStore cfs;
 
-        BackgroundCompactionTask(ColumnFamilyStore cfs)
+        BackgroundCompactionCandidate(ColumnFamilyStore cfs)
         {
             this.cfs = cfs;
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
index b015130..f7a99e1 100644
--- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
@@ -58,14 +58,14 @@ public class CompactionMetrics implements CompactionManager.CompactionExecutorSt
             public Integer value()
             {
                 int n = 0;
+                // add estimate number of compactions need to be done
                 for (String keyspaceName : Schema.instance.getKeyspaces())
                 {
                     for (ColumnFamilyStore cfs : Keyspace.open(keyspaceName).getColumnFamilyStores())
                         n += cfs.getCompactionStrategy().getEstimatedRemainingTasks();
                 }
-                for (ThreadPoolExecutor collector : collectors)
-                    n += collector.getTaskCount() - collector.getCompletedTaskCount();
-                return n;
+                // add number of currently running compactions
+                return n + compactions.size();
             }
         });
         completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge<Long>()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
index 1879838..7da8d92 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
@@ -82,8 +82,10 @@ public class CompactionsTest extends SchemaLoader
         // enable compaction, submit background and wait for it to complete
         store.enableAutoCompaction();
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         // and sstable with ttl should be compacted
         assertEquals(1, store.getSSTables().size());
@@ -202,8 +204,10 @@ public class CompactionsTest extends SchemaLoader
         // enable compaction, submit background and wait for it to complete
         store.enableAutoCompaction();
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         // even though both sstables were candidate for tombstone compaction
         // it was not executed because they have an overlapping token range
@@ -222,8 +226,10 @@ public class CompactionsTest extends SchemaLoader
 
         //submit background task again and wait for it to complete
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         //we still have 2 sstables, since they were not compacted against each other
         assertEquals(2, store.getSSTables().size());


[06/10] cassandra git commit: Merge branch 'cassandra-2.0' into cassandra-2.1

Posted by yu...@apache.org.
Merge branch 'cassandra-2.0' into cassandra-2.1


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

Branch: refs/heads/cassandra-2.1
Commit: 58599a9a0793e8ec9ebd73e3ce9616f81783ff2c
Parents: 30df089 f283ed2
Author: Yuki Morishita <yu...@apache.org>
Authored: Wed Jul 8 12:06:51 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 12:06:51 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/ColumnFamilyStore.java  | 13 +--------
 .../db/compaction/CompactionManager.java        | 28 +++++++-------------
 .../cassandra/metrics/CompactionMetrics.java    |  6 ++---
 .../db/compaction/CompactionsTest.java          | 12 ++++++---
 5 files changed, 24 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 0fbadbc,40bf463..bdc5dc2
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,25 -1,9 +1,26 @@@
 -2.0.18
 +2.1.9
 + * (cqlsh) Allow the SSL protocol version to be specified through the
 +   config file or environment variables (CASSANDRA-9544)
 +Merged from 2.0:
   * Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+  * Fix growing pending background compaction (CASSANDRA-9662)
  
  
 -2.0.17
 +2.1.8
 + * (cqlsh) Fix bad check for CQL compatibility when DESCRIBE'ing
 +   COMPACT STORAGE tables with no clustering columns
 + * Warn when an extra-large partition is compacted (CASSANDRA-9643)
 + * Eliminate strong self-reference chains in sstable ref tidiers (CASSANDRA-9656)
 + * Ensure StreamSession uses canonical sstable reader instances (CASSANDRA-9700) 
 + * Ensure memtable book keeping is not corrupted in the event we shrink usage (CASSANDRA-9681)
 + * Update internal python driver for cqlsh (CASSANDRA-9064)
 + * Fix IndexOutOfBoundsException when inserting tuple with too many
 +   elements using the string literal notation (CASSANDRA-9559)
 + * Allow JMX over SSL directly from nodetool (CASSANDRA-9090)
 + * Fix incorrect result for IN queries where column not found (CASSANDRA-9540)
 + * Enable describe on indices (CASSANDRA-7814)
 + * ColumnFamilyStore.selectAndReference may block during compaction (CASSANDRA-9637)
 +Merged from 2.0:
   * Avoid NPE in AuthSuccess#decode (CASSANDRA-9727)
   * Add listen_address to system.local (CASSANDRA-9603)
   * Bug fixes to resultset metadata construction (CASSANDRA-9636)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index 205f89e,5b5b39e..1e4c54a
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@@ -181,19 -145,12 +176,16 @@@ public class CompactionManager implemen
          logger.debug("Scheduling a background task check for {}.{} with {}",
                       cfs.keyspace.getName(),
                       cfs.name,
 -                     cfs.getCompactionStrategy().getClass().getSimpleName());
 +                     cfs.getCompactionStrategy().getName());
-         List<Future<?>> futures = new ArrayList<Future<?>>();
+         List<Future<?>> futures = new ArrayList<>();
 -
          // we must schedule it at least once, otherwise compaction will stop for a CF until next flush
-         do {
-             if (executor.isShutdown())
-             {
-                 logger.info("Executor has shut down, not submitting background task");
-                 return Collections.emptyList();
-             }
-             compactingCF.add(cfs);
-             futures.add(executor.submit(new BackgroundCompactionTask(cfs)));
-             // if we have room for more compactions, then fill up executor
-         } while (autoFill && executor.getActiveCount() + futures.size() < executor.getMaximumPoolSize());
++        if (executor.isShutdown())
++        {
++            logger.info("Executor has shut down, not submitting background task");
++            return Collections.emptyList();
++        }
+         compactingCF.add(cfs);
+         futures.add(executor.submit(new BackgroundCompactionCandidate(cfs)));
  
          return futures;
      }
@@@ -206,15 -163,9 +198,15 @@@
          return false;
      }
  
 +    public void finishCompactionsAndShutdown(long timeout, TimeUnit unit) throws InterruptedException
 +    {
 +        executor.shutdown();
 +        executor.awaitTermination(timeout, unit);
 +    }
 +
      // the actual sstables to compact are not determined until we run the BCT; that way, if new sstables
      // are created between task submission and execution, we execute against the most up-to-date information
-     class BackgroundCompactionTask implements Runnable
+     class BackgroundCompactionCandidate implements Runnable
      {
          private final ColumnFamilyStore cfs;
  

http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------


[03/10] cassandra git commit: Fix growing pending background compaction

Posted by yu...@apache.org.
Fix growing pending background compaction

patch by yukim; reviewed by benedict for CASSANDRA-9662


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

Branch: refs/heads/cassandra-2.2
Commit: f283ed29814403bde6350a2598cdd6e2c8b983d5
Parents: 452d6a4
Author: Yuki Morishita <yu...@apache.org>
Authored: Fri Jun 26 11:50:51 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 11:58:17 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                       |  3 ++-
 .../apache/cassandra/db/ColumnFamilyStore.java    | 13 +------------
 .../db/compaction/CompactionManager.java          | 18 +++++-------------
 .../cassandra/metrics/CompactionMetrics.java      |  6 +++---
 .../cassandra/db/compaction/CompactionsTest.java  | 12 +++++++++---
 5 files changed, 20 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index bd1db92..40bf463 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
 2.0.18
-* Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+ * Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+ * Fix growing pending background compaction (CASSANDRA-9662)
 
 
 2.0.17

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index bf1e779..00b2eb8 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -180,20 +180,9 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         {
             public void run()
             {
-                List<ColumnFamilyStore> submitted = new ArrayList<>();
                 for (Keyspace keyspace : Keyspace.all())
                     for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores())
-                        if (!CompactionManager.instance.submitBackground(cfs, false).isEmpty())
-                            submitted.add(cfs);
-
-                while (!submitted.isEmpty() && CompactionManager.instance.getActiveCompactions() < CompactionManager.instance.getMaximumCompactorThreads())
-                {
-                    List<ColumnFamilyStore> submitMore = ImmutableList.copyOf(submitted);
-                    submitted.clear();
-                    for (ColumnFamilyStore cfs : submitMore)
-                        if (!CompactionManager.instance.submitBackground(cfs, false).isEmpty())
-                            submitted.add(cfs);
-                }
+                        CompactionManager.instance.submitBackground(cfs);
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index c66eeb6..5b5b39e 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -128,11 +128,6 @@ public class CompactionManager implements CompactionManagerMBean
      */
     public List<Future<?>> submitBackground(final ColumnFamilyStore cfs)
     {
-        return submitBackground(cfs, true);
-    }
-
-    public List<Future<?>> submitBackground(final ColumnFamilyStore cfs, boolean autoFill)
-    {
         if (cfs.isAutoCompactionDisabled())
         {
             logger.debug("Autocompaction is disabled");
@@ -151,14 +146,11 @@ public class CompactionManager implements CompactionManagerMBean
                      cfs.keyspace.getName(),
                      cfs.name,
                      cfs.getCompactionStrategy().getClass().getSimpleName());
-        List<Future<?>> futures = new ArrayList<Future<?>>();
+        List<Future<?>> futures = new ArrayList<>();
 
         // we must schedule it at least once, otherwise compaction will stop for a CF until next flush
-        do {
-            compactingCF.add(cfs);
-            futures.add(executor.submit(new BackgroundCompactionTask(cfs)));
-            // if we have room for more compactions, then fill up executor
-        } while (autoFill && executor.getActiveCount() + futures.size() < executor.getMaximumPoolSize());
+        compactingCF.add(cfs);
+        futures.add(executor.submit(new BackgroundCompactionCandidate(cfs)));
 
         return futures;
     }
@@ -173,11 +165,11 @@ public class CompactionManager implements CompactionManagerMBean
 
     // the actual sstables to compact are not determined until we run the BCT; that way, if new sstables
     // are created between task submission and execution, we execute against the most up-to-date information
-    class BackgroundCompactionTask implements Runnable
+    class BackgroundCompactionCandidate implements Runnable
     {
         private final ColumnFamilyStore cfs;
 
-        BackgroundCompactionTask(ColumnFamilyStore cfs)
+        BackgroundCompactionCandidate(ColumnFamilyStore cfs)
         {
             this.cfs = cfs;
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
index b015130..f7a99e1 100644
--- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
@@ -58,14 +58,14 @@ public class CompactionMetrics implements CompactionManager.CompactionExecutorSt
             public Integer value()
             {
                 int n = 0;
+                // add estimate number of compactions need to be done
                 for (String keyspaceName : Schema.instance.getKeyspaces())
                 {
                     for (ColumnFamilyStore cfs : Keyspace.open(keyspaceName).getColumnFamilyStores())
                         n += cfs.getCompactionStrategy().getEstimatedRemainingTasks();
                 }
-                for (ThreadPoolExecutor collector : collectors)
-                    n += collector.getTaskCount() - collector.getCompletedTaskCount();
-                return n;
+                // add number of currently running compactions
+                return n + compactions.size();
             }
         });
         completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge<Long>()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
index 1879838..7da8d92 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
@@ -82,8 +82,10 @@ public class CompactionsTest extends SchemaLoader
         // enable compaction, submit background and wait for it to complete
         store.enableAutoCompaction();
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         // and sstable with ttl should be compacted
         assertEquals(1, store.getSSTables().size());
@@ -202,8 +204,10 @@ public class CompactionsTest extends SchemaLoader
         // enable compaction, submit background and wait for it to complete
         store.enableAutoCompaction();
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         // even though both sstables were candidate for tombstone compaction
         // it was not executed because they have an overlapping token range
@@ -222,8 +226,10 @@ public class CompactionsTest extends SchemaLoader
 
         //submit background task again and wait for it to complete
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         //we still have 2 sstables, since they were not compacted against each other
         assertEquals(2, store.getSSTables().size());


[07/10] cassandra git commit: Merge branch 'cassandra-2.0' into cassandra-2.1

Posted by yu...@apache.org.
Merge branch 'cassandra-2.0' into cassandra-2.1


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

Branch: refs/heads/trunk
Commit: 58599a9a0793e8ec9ebd73e3ce9616f81783ff2c
Parents: 30df089 f283ed2
Author: Yuki Morishita <yu...@apache.org>
Authored: Wed Jul 8 12:06:51 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 12:06:51 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/ColumnFamilyStore.java  | 13 +--------
 .../db/compaction/CompactionManager.java        | 28 +++++++-------------
 .../cassandra/metrics/CompactionMetrics.java    |  6 ++---
 .../db/compaction/CompactionsTest.java          | 12 ++++++---
 5 files changed, 24 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 0fbadbc,40bf463..bdc5dc2
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,25 -1,9 +1,26 @@@
 -2.0.18
 +2.1.9
 + * (cqlsh) Allow the SSL protocol version to be specified through the
 +   config file or environment variables (CASSANDRA-9544)
 +Merged from 2.0:
   * Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+  * Fix growing pending background compaction (CASSANDRA-9662)
  
  
 -2.0.17
 +2.1.8
 + * (cqlsh) Fix bad check for CQL compatibility when DESCRIBE'ing
 +   COMPACT STORAGE tables with no clustering columns
 + * Warn when an extra-large partition is compacted (CASSANDRA-9643)
 + * Eliminate strong self-reference chains in sstable ref tidiers (CASSANDRA-9656)
 + * Ensure StreamSession uses canonical sstable reader instances (CASSANDRA-9700) 
 + * Ensure memtable book keeping is not corrupted in the event we shrink usage (CASSANDRA-9681)
 + * Update internal python driver for cqlsh (CASSANDRA-9064)
 + * Fix IndexOutOfBoundsException when inserting tuple with too many
 +   elements using the string literal notation (CASSANDRA-9559)
 + * Allow JMX over SSL directly from nodetool (CASSANDRA-9090)
 + * Fix incorrect result for IN queries where column not found (CASSANDRA-9540)
 + * Enable describe on indices (CASSANDRA-7814)
 + * ColumnFamilyStore.selectAndReference may block during compaction (CASSANDRA-9637)
 +Merged from 2.0:
   * Avoid NPE in AuthSuccess#decode (CASSANDRA-9727)
   * Add listen_address to system.local (CASSANDRA-9603)
   * Bug fixes to resultset metadata construction (CASSANDRA-9636)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index 205f89e,5b5b39e..1e4c54a
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@@ -181,19 -145,12 +176,16 @@@ public class CompactionManager implemen
          logger.debug("Scheduling a background task check for {}.{} with {}",
                       cfs.keyspace.getName(),
                       cfs.name,
 -                     cfs.getCompactionStrategy().getClass().getSimpleName());
 +                     cfs.getCompactionStrategy().getName());
-         List<Future<?>> futures = new ArrayList<Future<?>>();
+         List<Future<?>> futures = new ArrayList<>();
 -
          // we must schedule it at least once, otherwise compaction will stop for a CF until next flush
-         do {
-             if (executor.isShutdown())
-             {
-                 logger.info("Executor has shut down, not submitting background task");
-                 return Collections.emptyList();
-             }
-             compactingCF.add(cfs);
-             futures.add(executor.submit(new BackgroundCompactionTask(cfs)));
-             // if we have room for more compactions, then fill up executor
-         } while (autoFill && executor.getActiveCount() + futures.size() < executor.getMaximumPoolSize());
++        if (executor.isShutdown())
++        {
++            logger.info("Executor has shut down, not submitting background task");
++            return Collections.emptyList();
++        }
+         compactingCF.add(cfs);
+         futures.add(executor.submit(new BackgroundCompactionCandidate(cfs)));
  
          return futures;
      }
@@@ -206,15 -163,9 +198,15 @@@
          return false;
      }
  
 +    public void finishCompactionsAndShutdown(long timeout, TimeUnit unit) throws InterruptedException
 +    {
 +        executor.shutdown();
 +        executor.awaitTermination(timeout, unit);
 +    }
 +
      // the actual sstables to compact are not determined until we run the BCT; that way, if new sstables
      // are created between task submission and execution, we execute against the most up-to-date information
-     class BackgroundCompactionTask implements Runnable
+     class BackgroundCompactionCandidate implements Runnable
      {
          private final ColumnFamilyStore cfs;
  

http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------


[08/10] cassandra git commit: Merge branch 'cassandra-2.1' into cassandra-2.2

Posted by yu...@apache.org.
Merge branch 'cassandra-2.1' into cassandra-2.2


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

Branch: refs/heads/cassandra-2.2
Commit: ce63a2e921d457058665b9efc86aee4f7ce41799
Parents: 12ff1cd 58599a9
Author: Yuki Morishita <yu...@apache.org>
Authored: Wed Jul 8 12:08:09 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 12:08:09 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/ColumnFamilyStore.java  | 13 +--------
 .../db/compaction/CompactionManager.java        | 28 +++++++-------------
 .../cassandra/metrics/CompactionMetrics.java    |  6 ++---
 .../db/compaction/CompactionsTest.java          | 12 ++++++---
 5 files changed, 24 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 864eed2,bdc5dc2..2172672
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,35 -1,15 +1,36 @@@
 -2.1.9
 +2.2.0-rc3
 +Merged from 2.0:
   * (cqlsh) Allow the SSL protocol version to be specified through the
     config file or environment variables (CASSANDRA-9544)
 -Merged from 2.0:
 - * Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
 + * Scrub (recover) sstables even when -Index.db is missing (CASSANDRA-9591)
+  * Fix growing pending background compaction (CASSANDRA-9662)
  
  
 -2.1.8
 +2.2.0-rc2
 + * Re-enable memory-mapped I/O on Windows (CASSANDRA-9658)
 + * Warn when an extra-large partition is compacted (CASSANDRA-9643)
 + * (cqlsh) Allow setting the initial connection timeout (CASSANDRA-9601)
 + * BulkLoader has --transport-factory option but does not use it (CASSANDRA-9675)
 + * Allow JMX over SSL directly from nodetool (CASSANDRA-9090)
 + * Update cqlsh for UDFs (CASSANDRA-7556)
 + * Change Windows kernel default timer resolution (CASSANDRA-9634)
 + * Deprected sstable2json and json2sstable (CASSANDRA-9618)
 + * Allow native functions in user-defined aggregates (CASSANDRA-9542)
 + * Don't repair system_distributed by default (CASSANDRA-9621)
 + * Fix mixing min, max, and count aggregates for blob type (CASSANRA-9622)
 + * Rename class for DATE type in Java driver (CASSANDRA-9563)
 + * Duplicate compilation of UDFs on coordinator (CASSANDRA-9475)
 + * Fix connection leak in CqlRecordWriter (CASSANDRA-9576)
 + * Mlockall before opening system sstables & remove boot_without_jna option (CASSANDRA-9573)
 + * Add functions to convert timeuuid to date or time, deprecate dateOf and unixTimestampOf (CASSANDRA-9229)
 + * Make sure we cancel non-compacting sstables from LifecycleTransaction (CASSANDRA-9566)
 + * Fix deprecated repair JMX API (CASSANDRA-9570)
 + * Add logback metrics (CASSANDRA-9378)
 + * Update and refactor ant test/test-compression to run the tests in parallel (CASSANDRA-9583)
 + * Fix upgrading to new directory for secondary index (CASSANDRA-9687)
 +Merged from 2.1:
   * (cqlsh) Fix bad check for CQL compatibility when DESCRIBE'ing
     COMPACT STORAGE tables with no clustering columns
 - * Warn when an extra-large partition is compacted (CASSANDRA-9643)
   * Eliminate strong self-reference chains in sstable ref tidiers (CASSANDRA-9656)
   * Ensure StreamSession uses canonical sstable reader instances (CASSANDRA-9700) 
   * Ensure memtable book keeping is not corrupted in the event we shrink usage (CASSANDRA-9681)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/metrics/CompactionMetrics.java
index a62e3c4,f7a99e1..eb00728
--- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
@@@ -53,24 -53,24 +53,24 @@@ public class CompactionMetrics implemen
  
      public CompactionMetrics(final ThreadPoolExecutor... collectors)
      {
 -        pendingTasks = Metrics.newGauge(factory.createMetricName("PendingTasks"), new Gauge<Integer>()
 +        pendingTasks = Metrics.register(factory.createMetricName("PendingTasks"), new Gauge<Integer>()
          {
 -            public Integer value()
 +            public Integer getValue()
              {
                  int n = 0;
+                 // add estimate number of compactions need to be done
                  for (String keyspaceName : Schema.instance.getKeyspaces())
                  {
                      for (ColumnFamilyStore cfs : Keyspace.open(keyspaceName).getColumnFamilyStores())
                          n += cfs.getCompactionStrategy().getEstimatedRemainingTasks();
                  }
-                 for (ThreadPoolExecutor collector : collectors)
-                     n += collector.getTaskCount() - collector.getCompletedTaskCount();
-                 return n;
+                 // add number of currently running compactions
+                 return n + compactions.size();
              }
          });
 -        completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge<Long>()
 +        completedTasks = Metrics.register(factory.createMetricName("CompletedTasks"), new Gauge<Long>()
          {
 -            public Long value()
 +            public Long getValue()
              {
                  long completedTasks = 0;
                  for (ThreadPoolExecutor collector : collectors)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------


[05/10] cassandra git commit: Merge branch 'cassandra-2.0' into cassandra-2.1

Posted by yu...@apache.org.
Merge branch 'cassandra-2.0' into cassandra-2.1


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

Branch: refs/heads/cassandra-2.2
Commit: 58599a9a0793e8ec9ebd73e3ce9616f81783ff2c
Parents: 30df089 f283ed2
Author: Yuki Morishita <yu...@apache.org>
Authored: Wed Jul 8 12:06:51 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 12:06:51 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/ColumnFamilyStore.java  | 13 +--------
 .../db/compaction/CompactionManager.java        | 28 +++++++-------------
 .../cassandra/metrics/CompactionMetrics.java    |  6 ++---
 .../db/compaction/CompactionsTest.java          | 12 ++++++---
 5 files changed, 24 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 0fbadbc,40bf463..bdc5dc2
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,25 -1,9 +1,26 @@@
 -2.0.18
 +2.1.9
 + * (cqlsh) Allow the SSL protocol version to be specified through the
 +   config file or environment variables (CASSANDRA-9544)
 +Merged from 2.0:
   * Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+  * Fix growing pending background compaction (CASSANDRA-9662)
  
  
 -2.0.17
 +2.1.8
 + * (cqlsh) Fix bad check for CQL compatibility when DESCRIBE'ing
 +   COMPACT STORAGE tables with no clustering columns
 + * Warn when an extra-large partition is compacted (CASSANDRA-9643)
 + * Eliminate strong self-reference chains in sstable ref tidiers (CASSANDRA-9656)
 + * Ensure StreamSession uses canonical sstable reader instances (CASSANDRA-9700) 
 + * Ensure memtable book keeping is not corrupted in the event we shrink usage (CASSANDRA-9681)
 + * Update internal python driver for cqlsh (CASSANDRA-9064)
 + * Fix IndexOutOfBoundsException when inserting tuple with too many
 +   elements using the string literal notation (CASSANDRA-9559)
 + * Allow JMX over SSL directly from nodetool (CASSANDRA-9090)
 + * Fix incorrect result for IN queries where column not found (CASSANDRA-9540)
 + * Enable describe on indices (CASSANDRA-7814)
 + * ColumnFamilyStore.selectAndReference may block during compaction (CASSANDRA-9637)
 +Merged from 2.0:
   * Avoid NPE in AuthSuccess#decode (CASSANDRA-9727)
   * Add listen_address to system.local (CASSANDRA-9603)
   * Bug fixes to resultset metadata construction (CASSANDRA-9636)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index 205f89e,5b5b39e..1e4c54a
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@@ -181,19 -145,12 +176,16 @@@ public class CompactionManager implemen
          logger.debug("Scheduling a background task check for {}.{} with {}",
                       cfs.keyspace.getName(),
                       cfs.name,
 -                     cfs.getCompactionStrategy().getClass().getSimpleName());
 +                     cfs.getCompactionStrategy().getName());
-         List<Future<?>> futures = new ArrayList<Future<?>>();
+         List<Future<?>> futures = new ArrayList<>();
 -
          // we must schedule it at least once, otherwise compaction will stop for a CF until next flush
-         do {
-             if (executor.isShutdown())
-             {
-                 logger.info("Executor has shut down, not submitting background task");
-                 return Collections.emptyList();
-             }
-             compactingCF.add(cfs);
-             futures.add(executor.submit(new BackgroundCompactionTask(cfs)));
-             // if we have room for more compactions, then fill up executor
-         } while (autoFill && executor.getActiveCount() + futures.size() < executor.getMaximumPoolSize());
++        if (executor.isShutdown())
++        {
++            logger.info("Executor has shut down, not submitting background task");
++            return Collections.emptyList();
++        }
+         compactingCF.add(cfs);
+         futures.add(executor.submit(new BackgroundCompactionCandidate(cfs)));
  
          return futures;
      }
@@@ -206,15 -163,9 +198,15 @@@
          return false;
      }
  
 +    public void finishCompactionsAndShutdown(long timeout, TimeUnit unit) throws InterruptedException
 +    {
 +        executor.shutdown();
 +        executor.awaitTermination(timeout, unit);
 +    }
 +
      // the actual sstables to compact are not determined until we run the BCT; that way, if new sstables
      // are created between task submission and execution, we execute against the most up-to-date information
-     class BackgroundCompactionTask implements Runnable
+     class BackgroundCompactionCandidate implements Runnable
      {
          private final ColumnFamilyStore cfs;
  

http://git-wip-us.apache.org/repos/asf/cassandra/blob/58599a9a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------


[10/10] cassandra git commit: Merge branch 'cassandra-2.2' into trunk

Posted by yu...@apache.org.
Merge branch 'cassandra-2.2' into trunk


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

Branch: refs/heads/trunk
Commit: 83e378737888ad47931ac713b50188f77da2ff56
Parents: 5eed967 ce63a2e
Author: Yuki Morishita <yu...@apache.org>
Authored: Wed Jul 8 12:16:31 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 12:16:31 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/ColumnFamilyStore.java  | 13 +--------
 .../db/compaction/CompactionManager.java        | 28 +++++++-------------
 .../cassandra/metrics/CompactionMetrics.java    |  6 ++---
 .../db/compaction/CompactionsTest.java          | 12 ++++++---
 5 files changed, 24 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/83e37873/CHANGES.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/83e37873/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/83e37873/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index e3e9b03,4038aa7..6cf2e18
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@@ -180,19 -176,16 +175,16 @@@ public class CompactionManager implemen
          logger.debug("Scheduling a background task check for {}.{} with {}",
                       cfs.keyspace.getName(),
                       cfs.name,
 -                     cfs.getCompactionStrategy().getName());
 +                     cfs.getCompactionStrategyManager().getName());
-         List<Future<?>> futures = new ArrayList<Future<?>>();
+         List<Future<?>> futures = new ArrayList<>();
          // we must schedule it at least once, otherwise compaction will stop for a CF until next flush
-         do {
-             if (executor.isShutdown())
-             {
-                 logger.info("Executor has shut down, not submitting background task");
-                 return Collections.emptyList();
-             }
-             compactingCF.add(cfs);
-             futures.add(executor.submit(new BackgroundCompactionTask(cfs)));
-             // if we have room for more compactions, then fill up executor
-         } while (autoFill && executor.getActiveCount() + futures.size() < executor.getMaximumPoolSize());
+         if (executor.isShutdown())
+         {
+             logger.info("Executor has shut down, not submitting background task");
+             return Collections.emptyList();
+         }
+         compactingCF.add(cfs);
+         futures.add(executor.submit(new BackgroundCompactionCandidate(cfs)));
  
          return futures;
      }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/83e37873/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/metrics/CompactionMetrics.java
index 20a5685,eb00728..19eadc8
--- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
@@@ -61,11 -62,10 +62,10 @@@ public class CompactionMetrics implemen
                  for (String keyspaceName : Schema.instance.getKeyspaces())
                  {
                      for (ColumnFamilyStore cfs : Keyspace.open(keyspaceName).getColumnFamilyStores())
 -                        n += cfs.getCompactionStrategy().getEstimatedRemainingTasks();
 +                        n += cfs.getCompactionStrategyManager().getEstimatedRemainingTasks();
                  }
-                 for (ThreadPoolExecutor collector : collectors)
-                     n += collector.getTaskCount() - collector.getCompletedTaskCount();
-                 return n;
+                 // add number of currently running compactions
+                 return n + compactions.size();
              }
          });
          completedTasks = Metrics.register(factory.createMetricName("CompletedTasks"), new Gauge<Long>()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/83e37873/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------


[09/10] cassandra git commit: Merge branch 'cassandra-2.1' into cassandra-2.2

Posted by yu...@apache.org.
Merge branch 'cassandra-2.1' into cassandra-2.2


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

Branch: refs/heads/trunk
Commit: ce63a2e921d457058665b9efc86aee4f7ce41799
Parents: 12ff1cd 58599a9
Author: Yuki Morishita <yu...@apache.org>
Authored: Wed Jul 8 12:08:09 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 12:08:09 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/db/ColumnFamilyStore.java  | 13 +--------
 .../db/compaction/CompactionManager.java        | 28 +++++++-------------
 .../cassandra/metrics/CompactionMetrics.java    |  6 ++---
 .../db/compaction/CompactionsTest.java          | 12 ++++++---
 5 files changed, 24 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 864eed2,bdc5dc2..2172672
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,35 -1,15 +1,36 @@@
 -2.1.9
 +2.2.0-rc3
 +Merged from 2.0:
   * (cqlsh) Allow the SSL protocol version to be specified through the
     config file or environment variables (CASSANDRA-9544)
 -Merged from 2.0:
 - * Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
 + * Scrub (recover) sstables even when -Index.db is missing (CASSANDRA-9591)
+  * Fix growing pending background compaction (CASSANDRA-9662)
  
  
 -2.1.8
 +2.2.0-rc2
 + * Re-enable memory-mapped I/O on Windows (CASSANDRA-9658)
 + * Warn when an extra-large partition is compacted (CASSANDRA-9643)
 + * (cqlsh) Allow setting the initial connection timeout (CASSANDRA-9601)
 + * BulkLoader has --transport-factory option but does not use it (CASSANDRA-9675)
 + * Allow JMX over SSL directly from nodetool (CASSANDRA-9090)
 + * Update cqlsh for UDFs (CASSANDRA-7556)
 + * Change Windows kernel default timer resolution (CASSANDRA-9634)
 + * Deprected sstable2json and json2sstable (CASSANDRA-9618)
 + * Allow native functions in user-defined aggregates (CASSANDRA-9542)
 + * Don't repair system_distributed by default (CASSANDRA-9621)
 + * Fix mixing min, max, and count aggregates for blob type (CASSANRA-9622)
 + * Rename class for DATE type in Java driver (CASSANDRA-9563)
 + * Duplicate compilation of UDFs on coordinator (CASSANDRA-9475)
 + * Fix connection leak in CqlRecordWriter (CASSANDRA-9576)
 + * Mlockall before opening system sstables & remove boot_without_jna option (CASSANDRA-9573)
 + * Add functions to convert timeuuid to date or time, deprecate dateOf and unixTimestampOf (CASSANDRA-9229)
 + * Make sure we cancel non-compacting sstables from LifecycleTransaction (CASSANDRA-9566)
 + * Fix deprecated repair JMX API (CASSANDRA-9570)
 + * Add logback metrics (CASSANDRA-9378)
 + * Update and refactor ant test/test-compression to run the tests in parallel (CASSANDRA-9583)
 + * Fix upgrading to new directory for secondary index (CASSANDRA-9687)
 +Merged from 2.1:
   * (cqlsh) Fix bad check for CQL compatibility when DESCRIBE'ing
     COMPACT STORAGE tables with no clustering columns
 - * Warn when an extra-large partition is compacted (CASSANDRA-9643)
   * Eliminate strong self-reference chains in sstable ref tidiers (CASSANDRA-9656)
   * Ensure StreamSession uses canonical sstable reader instances (CASSANDRA-9700) 
   * Ensure memtable book keeping is not corrupted in the event we shrink usage (CASSANDRA-9681)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/metrics/CompactionMetrics.java
index a62e3c4,f7a99e1..eb00728
--- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
@@@ -53,24 -53,24 +53,24 @@@ public class CompactionMetrics implemen
  
      public CompactionMetrics(final ThreadPoolExecutor... collectors)
      {
 -        pendingTasks = Metrics.newGauge(factory.createMetricName("PendingTasks"), new Gauge<Integer>()
 +        pendingTasks = Metrics.register(factory.createMetricName("PendingTasks"), new Gauge<Integer>()
          {
 -            public Integer value()
 +            public Integer getValue()
              {
                  int n = 0;
+                 // add estimate number of compactions need to be done
                  for (String keyspaceName : Schema.instance.getKeyspaces())
                  {
                      for (ColumnFamilyStore cfs : Keyspace.open(keyspaceName).getColumnFamilyStores())
                          n += cfs.getCompactionStrategy().getEstimatedRemainingTasks();
                  }
-                 for (ThreadPoolExecutor collector : collectors)
-                     n += collector.getTaskCount() - collector.getCompletedTaskCount();
-                 return n;
+                 // add number of currently running compactions
+                 return n + compactions.size();
              }
          });
 -        completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge<Long>()
 +        completedTasks = Metrics.register(factory.createMetricName("CompletedTasks"), new Gauge<Long>()
          {
 -            public Long value()
 +            public Long getValue()
              {
                  long completedTasks = 0;
                  for (ThreadPoolExecutor collector : collectors)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce63a2e9/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------


[02/10] cassandra git commit: Fix growing pending background compaction

Posted by yu...@apache.org.
Fix growing pending background compaction

patch by yukim; reviewed by benedict for CASSANDRA-9662


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

Branch: refs/heads/cassandra-2.1
Commit: f283ed29814403bde6350a2598cdd6e2c8b983d5
Parents: 452d6a4
Author: Yuki Morishita <yu...@apache.org>
Authored: Fri Jun 26 11:50:51 2015 -0500
Committer: Yuki Morishita <yu...@apache.org>
Committed: Wed Jul 8 11:58:17 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                       |  3 ++-
 .../apache/cassandra/db/ColumnFamilyStore.java    | 13 +------------
 .../db/compaction/CompactionManager.java          | 18 +++++-------------
 .../cassandra/metrics/CompactionMetrics.java      |  6 +++---
 .../cassandra/db/compaction/CompactionsTest.java  | 12 +++++++++---
 5 files changed, 20 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index bd1db92..40bf463 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
 2.0.18
-* Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+ * Scrub (recover) sstables even when -Index.db is missing, (CASSANDRA-9591)
+ * Fix growing pending background compaction (CASSANDRA-9662)
 
 
 2.0.17

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index bf1e779..00b2eb8 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -180,20 +180,9 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         {
             public void run()
             {
-                List<ColumnFamilyStore> submitted = new ArrayList<>();
                 for (Keyspace keyspace : Keyspace.all())
                     for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores())
-                        if (!CompactionManager.instance.submitBackground(cfs, false).isEmpty())
-                            submitted.add(cfs);
-
-                while (!submitted.isEmpty() && CompactionManager.instance.getActiveCompactions() < CompactionManager.instance.getMaximumCompactorThreads())
-                {
-                    List<ColumnFamilyStore> submitMore = ImmutableList.copyOf(submitted);
-                    submitted.clear();
-                    for (ColumnFamilyStore cfs : submitMore)
-                        if (!CompactionManager.instance.submitBackground(cfs, false).isEmpty())
-                            submitted.add(cfs);
-                }
+                        CompactionManager.instance.submitBackground(cfs);
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index c66eeb6..5b5b39e 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -128,11 +128,6 @@ public class CompactionManager implements CompactionManagerMBean
      */
     public List<Future<?>> submitBackground(final ColumnFamilyStore cfs)
     {
-        return submitBackground(cfs, true);
-    }
-
-    public List<Future<?>> submitBackground(final ColumnFamilyStore cfs, boolean autoFill)
-    {
         if (cfs.isAutoCompactionDisabled())
         {
             logger.debug("Autocompaction is disabled");
@@ -151,14 +146,11 @@ public class CompactionManager implements CompactionManagerMBean
                      cfs.keyspace.getName(),
                      cfs.name,
                      cfs.getCompactionStrategy().getClass().getSimpleName());
-        List<Future<?>> futures = new ArrayList<Future<?>>();
+        List<Future<?>> futures = new ArrayList<>();
 
         // we must schedule it at least once, otherwise compaction will stop for a CF until next flush
-        do {
-            compactingCF.add(cfs);
-            futures.add(executor.submit(new BackgroundCompactionTask(cfs)));
-            // if we have room for more compactions, then fill up executor
-        } while (autoFill && executor.getActiveCount() + futures.size() < executor.getMaximumPoolSize());
+        compactingCF.add(cfs);
+        futures.add(executor.submit(new BackgroundCompactionCandidate(cfs)));
 
         return futures;
     }
@@ -173,11 +165,11 @@ public class CompactionManager implements CompactionManagerMBean
 
     // the actual sstables to compact are not determined until we run the BCT; that way, if new sstables
     // are created between task submission and execution, we execute against the most up-to-date information
-    class BackgroundCompactionTask implements Runnable
+    class BackgroundCompactionCandidate implements Runnable
     {
         private final ColumnFamilyStore cfs;
 
-        BackgroundCompactionTask(ColumnFamilyStore cfs)
+        BackgroundCompactionCandidate(ColumnFamilyStore cfs)
         {
             this.cfs = cfs;
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
index b015130..f7a99e1 100644
--- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
@@ -58,14 +58,14 @@ public class CompactionMetrics implements CompactionManager.CompactionExecutorSt
             public Integer value()
             {
                 int n = 0;
+                // add estimate number of compactions need to be done
                 for (String keyspaceName : Schema.instance.getKeyspaces())
                 {
                     for (ColumnFamilyStore cfs : Keyspace.open(keyspaceName).getColumnFamilyStores())
                         n += cfs.getCompactionStrategy().getEstimatedRemainingTasks();
                 }
-                for (ThreadPoolExecutor collector : collectors)
-                    n += collector.getTaskCount() - collector.getCompletedTaskCount();
-                return n;
+                // add number of currently running compactions
+                return n + compactions.size();
             }
         });
         completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge<Long>()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f283ed29/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
index 1879838..7da8d92 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
@@ -82,8 +82,10 @@ public class CompactionsTest extends SchemaLoader
         // enable compaction, submit background and wait for it to complete
         store.enableAutoCompaction();
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         // and sstable with ttl should be compacted
         assertEquals(1, store.getSSTables().size());
@@ -202,8 +204,10 @@ public class CompactionsTest extends SchemaLoader
         // enable compaction, submit background and wait for it to complete
         store.enableAutoCompaction();
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         // even though both sstables were candidate for tombstone compaction
         // it was not executed because they have an overlapping token range
@@ -222,8 +226,10 @@ public class CompactionsTest extends SchemaLoader
 
         //submit background task again and wait for it to complete
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
-        while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0)
+        do
+        {
             TimeUnit.SECONDS.sleep(1);
+        } while (CompactionManager.instance.getPendingTasks() > 0 || CompactionManager.instance.getActiveCompactions() > 0);
 
         //we still have 2 sstables, since they were not compacted against each other
         assertEquals(2, store.getSSTables().size());