You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/01/12 17:47:23 UTC

svn commit: r898414 - /incubator/cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java

Author: jbellis
Date: Tue Jan 12 16:47:23 2010
New Revision: 898414

URL: http://svn.apache.org/viewvc?rev=898414&view=rev
Log:
avoid creating a new thread for each requested GC.  easier for telemetery (and better design anyway) to re-use the same thread.  patch by jbellis

Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java?rev=898414&r1=898413&r2=898414&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java Tue Jan 12 16:47:23 2010
@@ -29,7 +29,6 @@
 import org.apache.log4j.Logger;
 
 import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.io.*;
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -37,7 +36,6 @@
 import org.apache.cassandra.service.AntiEntropyService;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.WrappedRunnable;
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
 
 import java.net.InetAddress;
@@ -53,6 +51,8 @@
     private static final Logger logger = Logger.getLogger(CompactionManager.class);
     public static final CompactionManager instance;
 
+    private static volatile boolean gcRequested;
+
     private int minimumCompactionThreshold = 4; // compact this many sstables min at a time
     private int maximumCompactionThreshold = 32; // compact this many sstables max at a time
 
@@ -68,11 +68,40 @@
         {
             throw new RuntimeException(e);
         }
+
+        /**
+         * thread that requests GCs to clean out obsolete sstables, sleeping rpc timeout first so that most in-progress ops can complete
+         * (thus, no longer reference the sstables in question)
+         */
+        new Thread(new Runnable()
+        {
+            final long gcDelay = DatabaseDescriptor.getRpcTimeout();
+
+            public void run()
+            {
+                while (true)
+                {
+                    try
+                    {
+                        Thread.sleep(gcDelay * 10);
+                        if (gcRequested)
+                        {
+                            Thread.sleep(gcDelay);
+                            System.gc();
+                            gcRequested = false;
+                        }
+                    }
+                    catch (InterruptedException e)
+                    {
+                        throw new AssertionError(e);
+                    }
+                }
+            }
+        }, "COMPACTION-GC-INVOKER").start();
     }
 
     private CompactionExecutor executor = new CompactionExecutor();
     private Map<ColumnFamilyStore, Integer> estimatedCompactions = new NonBlockingHashMap<ColumnFamilyStore, Integer>();
-    private static final NamedThreadFactory gcThreadFactory = new NamedThreadFactory("GC-INVOKER");
 
     /**
      * Call this whenever a compaction might be needed on the given columnfamily.
@@ -308,7 +337,7 @@
 
         SSTableReader ssTable = writer.closeAndOpenReader(DatabaseDescriptor.getKeysCachedFraction(table.name, cfs.getColumnFamilyName()));
         cfs.replaceCompactedSSTables(sstables, Arrays.asList(ssTable));
-        gcAfterRpcTimeout();
+        gcRequested = true;
         submitMinorIfNeeded(cfs);
 
         String format = "Compacted to %s.  %d/%d bytes for %d keys.  Time: %dms.";
@@ -409,7 +438,7 @@
         {
             cfs.replaceCompactedSSTables(originalSSTables, sstables);
         }
-        CompactionManager.gcAfterRpcTimeout();
+        gcRequested = true;
     }
 
     /**
@@ -441,22 +470,6 @@
         }
     }
 
-    /**
-     * perform a GC to clean out obsolete sstables, sleeping rpc timeout first so that most in-progress ops can complete
-     * (thus, no longer reference the sstables in question)
-     */
-    static void gcAfterRpcTimeout()
-    {
-        gcThreadFactory.newThread(new WrappedRunnable()
-        {
-            public void runMayThrow() throws InterruptedException
-            {
-                Thread.sleep(DatabaseDescriptor.getRpcTimeout());
-                System.gc();
-            }
-        }).start();
-    }
-
     /*
     * Group files of similar size into buckets.
     */