Move System.exit on OOM into a separate thread
patch by jbellis; reviewed by marcuse for CASSANDRA-5273


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

Branch: refs/heads/trunk
Commit: bf28e8d4b84afd5f9821ad965274768b8d4ca179
Parents: de2ee6e
Author: Jonathan Ellis <jbel...@apache.org>
Authored: Wed May 22 10:32:36 2013 -0500
Committer: Jonathan Ellis <jbel...@apache.org>
Committed: Wed May 22 10:33:09 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../apache/cassandra/service/CassandraDaemon.java  |   12 +++++++++++-
 2 files changed, 12 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/bf28e8d4/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 3902dec..21faf5a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 1.2.6
+ * Move System.exit on OOM into a separate thread (CASSANDRA-5273)
  * Write row markers when serializing schema (CASSANDRA-5572)
  * Check only SSTables for the requested range when streaming (CASSANDRA-5569)
  * Improve batchlog replay behavior and hint ttl handling (CASSANDRA-5314)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bf28e8d4/src/java/org/apache/cassandra/service/CassandraDaemon.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java 
b/src/java/org/apache/cassandra/service/CassandraDaemon.java
index 40c453d..343d497 100644
--- a/src/java/org/apache/cassandra/service/CassandraDaemon.java
+++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java
@@ -58,6 +58,16 @@ public class CassandraDaemon
         initLog4j();
     }
 
+    // Have a dedicated thread to call exit to avoid deadlock in the case 
where the thread that wants to invoke exit
+    // belongs to an executor that our shutdown hook wants to wait to exit 
gracefully. See CASSANDRA-5273.
+    private static final Thread exitThread = new Thread(new Runnable()
+    {
+        public void run()
+        {
+            System.exit(100);
+        }
+    }, "Exit invoker");
+
     /**
      * Initialize logging in such a way that it checks for config changes 
every 10 seconds.
      */
@@ -178,7 +188,7 @@ public class CassandraDaemon
                 {
                     // some code, like FileChannel.map, will wrap an 
OutOfMemoryError in another exception
                     if (e2 instanceof OutOfMemoryError)
-                        System.exit(100);
+                        exitThread.start();
 
                     if (e2 instanceof FSError)
                     {

Reply via email to