Repository: cassandra
Updated Branches:
  refs/heads/trunk 7e7cb6e37 -> 95f966697


Shutdown JVM on file descriptor exhaustion

patch by jmckenzie, reviewed by marcuse for CASSANDRA-7579


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

Branch: refs/heads/trunk
Commit: f25da979f605d2484042e275284d55ce7d6f9142
Parents: 6e62030
Author: Joshua McKenzie <jmcken...@apache.org>
Authored: Mon Oct 27 13:49:07 2014 -0500
Committer: Joshua McKenzie <jmcken...@apache.org>
Committed: Mon Oct 27 13:49:07 2014 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/cache/AutoSavingCache.java |  2 +
 .../org/apache/cassandra/cli/CliClient.java     |  4 +-
 src/java/org/apache/cassandra/cli/CliMain.java  |  2 +
 .../apache/cassandra/cli/CliSessionState.java   |  2 +
 .../cassandra/config/DatabaseDescriptor.java    |  2 +
 .../cassandra/db/BlacklistedDirectories.java    |  3 +
 .../apache/cassandra/db/ColumnFamilyStore.java  |  1 +
 .../cassandra/db/HintedHandOffManager.java      |  2 +
 .../compaction/AbstractCompactionStrategy.java  |  2 +
 src/java/org/apache/cassandra/gms/Gossiper.java |  1 +
 .../hadoop/ColumnFamilyRecordWriter.java        |  2 +
 .../apache/cassandra/hadoop/HadoopCompat.java   |  2 +
 .../cassandra/hadoop/cql3/CqlRecordWriter.java  |  6 +-
 .../cassandra/hadoop/pig/CassandraStorage.java  |  4 +-
 .../apache/cassandra/hadoop/pig/CqlStorage.java |  2 +
 .../cassandra/io/compress/SnappyCompressor.java |  3 +
 .../cassandra/io/util/MmappedSegmentedFile.java |  2 +
 .../cassandra/locator/CloudstackSnitch.java     |  2 +
 .../cassandra/net/OutboundTcpConnection.java    |  2 +
 .../apache/cassandra/service/ClientState.java   |  2 +
 .../cassandra/streaming/StreamLockfile.java     |  2 +
 .../cassandra/streaming/StreamSession.java      |  2 +
 .../thrift/CustomTThreadPoolServer.java         |  6 +-
 .../org/apache/cassandra/tools/BulkLoader.java  |  2 +
 .../org/apache/cassandra/tools/NodeTool.java    |  4 +-
 .../apache/cassandra/tools/SSTableImport.java   |  2 +
 .../cassandra/tools/StandaloneScrubber.java     |  2 +
 .../cassandra/tools/StandaloneSplitter.java     |  2 +
 .../cassandra/tools/StandaloneUpgrader.java     |  2 +
 .../org/apache/cassandra/transport/Client.java  |  2 +
 .../cassandra/transport/FrameCompressor.java    |  3 +
 .../transport/messages/BatchMessage.java        |  2 +
 .../transport/messages/ExecuteMessage.java      |  2 +
 .../transport/messages/PrepareMessage.java      |  2 +
 .../transport/messages/QueryMessage.java        |  2 +
 .../org/apache/cassandra/utils/CLibrary.java    |  1 +
 .../org/apache/cassandra/utils/FBUtilities.java |  1 +
 src/java/org/apache/cassandra/utils/Hex.java    |  1 +
 .../cassandra/utils/JVMStabilityInspector.java  |  8 ++
 .../org/apache/cassandra/db/CommitLogTest.java  |  1 -
 .../utils/JVMStabilityInspectorTest.java        | 36 ++++++++
 .../apache/cassandra/utils/KillerForTests.java  | 86 ++++++++++----------
 43 files changed, 169 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 4e978a3..fbcf460 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.2
+ * Shutdown JVM on file descriptor exhaustion (CASSANDRA-7579)
  * Add 'die' policy for commit log and disk failure (CASSANDRA-7927)
  * Fix installing as service on Windows (CASSANDRA-8115)
  * Fix CREATE TABLE for CQL2 (CASSANDRA-8144)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/cache/AutoSavingCache.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cache/AutoSavingCache.java 
b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
index d8fd5e0..1a861f8 100644
--- a/src/java/org/apache/cassandra/cache/AutoSavingCache.java
+++ b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
@@ -43,6 +43,7 @@ import 
org.apache.cassandra.io.util.LengthAvailableInputStream;
 import org.apache.cassandra.io.util.SequentialWriter;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.Pair;
 
 public class AutoSavingCache<K extends CacheKey, V> extends 
InstrumentingCache<K, V>
@@ -142,6 +143,7 @@ public class AutoSavingCache<K extends CacheKey, V> extends 
InstrumentingCache<K
             }
             catch (Exception e)
             {
+                JVMStabilityInspector.inspectThrowable(e);
                 logger.debug(String.format("harmless error reading saved cache 
%s", path.getAbsolutePath()), e);
             }
             finally

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/cli/CliClient.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/CliClient.java 
b/src/java/org/apache/cassandra/cli/CliClient.java
index c6b3bcd..45728c5 100644
--- a/src/java/org/apache/cassandra/cli/CliClient.java
+++ b/src/java/org/apache/cassandra/cli/CliClient.java
@@ -32,7 +32,6 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 
-import org.apache.cassandra.serializers.MarshalException;
 import org.apache.commons.lang3.StringUtils;
 
 import org.antlr.runtime.tree.Tree;
@@ -44,10 +43,12 @@ import org.apache.cassandra.db.compaction.OperationType;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.locator.SimpleSnitch;
+import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.thrift.*;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.UUIDGen;
 import org.apache.thrift.TBaseHelper;
 import org.apache.thrift.TException;
@@ -1658,6 +1659,7 @@ public class CliClient
             }
             catch (Exception ne)
             {
+                JVMStabilityInspector.inspectThrowable(ne);
                 String functions = Function.getFunctionNames();
                 sessionState.out.println("Type '" + defaultType + "' was not 
found. Available: " + functions
                                          + " Or any class which extends 
o.a.c.db.marshal.AbstractType.");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/cli/CliMain.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/CliMain.java 
b/src/java/org/apache/cassandra/cli/CliMain.java
index 7cfc77b..862b1af 100644
--- a/src/java/org/apache/cassandra/cli/CliMain.java
+++ b/src/java/org/apache/cassandra/cli/CliMain.java
@@ -28,6 +28,7 @@ import org.apache.cassandra.auth.IAuthenticator;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.thrift.*;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.thrift.TException;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.transport.TTransport;
@@ -139,6 +140,7 @@ public class CliMain
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             sessionState.err.println("Exception retrieving information about 
the cassandra node, check you have connected to the thrift port.");
 
             e.printStackTrace(sessionState.err);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/cli/CliSessionState.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/CliSessionState.java 
b/src/java/org/apache/cassandra/cli/CliSessionState.java
index f0de713..2bfe7fc 100644
--- a/src/java/org/apache/cassandra/cli/CliSessionState.java
+++ b/src/java/org/apache/cassandra/cli/CliSessionState.java
@@ -25,6 +25,7 @@ import 
org.apache.cassandra.config.EncryptionOptions.ClientEncryptionOptions;
 import org.apache.cassandra.thrift.ITransportFactory;
 import org.apache.cassandra.thrift.TFramedTransportFactory;
 import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 
 /**
  * Used to hold the state for the CLI.
@@ -86,6 +87,7 @@ public class CliSessionState
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             err.printf("WARNING: Could not connect to the JMX on %s:%d - some 
information won't be shown.%n%n", hostName, jmxPort);
         }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java 
b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 34bd39a..ba84610 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -68,6 +68,7 @@ import org.apache.cassandra.scheduler.NoScheduler;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.memory.HeapPool;
 import org.apache.cassandra.utils.memory.NativePool;
 import org.apache.cassandra.utils.memory.MemtablePool;
@@ -142,6 +143,7 @@ public class DatabaseDescriptor
         {
             logger.error("Fatal error during configuration loading", e);
             System.err.println(e.getMessage() + "\nFatal error during 
configuration loading; unable to start. See log for stacktrace.");
+            JVMStabilityInspector.inspectThrowable(e);
             System.exit(1);
         }
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/db/BlacklistedDirectories.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/BlacklistedDirectories.java 
b/src/java/org/apache/cassandra/db/BlacklistedDirectories.java
index de6c968..f47fd57 100644
--- a/src/java/org/apache/cassandra/db/BlacklistedDirectories.java
+++ b/src/java/org/apache/cassandra/db/BlacklistedDirectories.java
@@ -29,6 +29,8 @@ import java.util.concurrent.CopyOnWriteArraySet;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.apache.cassandra.utils.JVMStabilityInspector;
+
 public class BlacklistedDirectories implements BlacklistedDirectoriesMBean
 {
     public static final String MBEAN_NAME = 
"org.apache.cassandra.db:type=BlacklistedDirectories";
@@ -48,6 +50,7 @@ public class BlacklistedDirectories implements 
BlacklistedDirectoriesMBean
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             logger.error("error registering MBean {}", MBEAN_NAME, e);
             //Allow the server to start even if the bean can't be registered
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/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 a45d1b2..184399a 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -362,6 +362,7 @@ public class ColumnFamilyStore implements 
ColumnFamilyStoreMBean
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             // this shouldn't block anything.
             logger.warn("Failed unregistering mbean: {}", mbeanName, e);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/db/HintedHandOffManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/HintedHandOffManager.java 
b/src/java/org/apache/cassandra/db/HintedHandOffManager.java
index 2eb49c7..593bebc 100644
--- a/src/java/org/apache/cassandra/db/HintedHandOffManager.java
+++ b/src/java/org/apache/cassandra/db/HintedHandOffManager.java
@@ -65,6 +65,7 @@ import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.service.*;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.UUIDGen;
 import org.cliffc.high_scale_lib.NonBlockingHashSet;
 
@@ -222,6 +223,7 @@ public class HintedHandOffManager implements 
HintedHandOffManagerMBean
                 }
                 catch (Exception e)
                 {
+                    JVMStabilityInspector.inspectThrowable(e);
                     logger.warn("Could not delete hints for {}: {}", endpoint, 
e);
                 }
             }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java 
b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
index 97696a8..288c475 100644
--- 
a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
+++ 
b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
@@ -35,6 +35,7 @@ import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.SSTableReader;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 
 /**
  * Pluggable compaction strategy determines how SSTables get merged.
@@ -308,6 +309,7 @@ public abstract class AbstractCompactionStrategy
                 }
                 catch (Throwable t2)
                 {
+                    JVMStabilityInspector.inspectThrowable(t2);
                     if (t == null)
                         t = t2;
                     else

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/gms/Gossiper.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java 
b/src/java/org/apache/cassandra/gms/Gossiper.java
index 3fdee88..7e60881 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -178,6 +178,7 @@ public class Gossiper implements 
IFailureDetectionEventListener, GossiperMBean
             }
             catch (Exception e)
             {
+                JVMStabilityInspector.inspectThrowable(e);
                 logger.error("Gossip error", e);
             }
             finally

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordWriter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordWriter.java 
b/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordWriter.java
index d6a873b..a1b04f0 100644
--- a/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordWriter.java
+++ b/src/java/org/apache/cassandra/hadoop/ColumnFamilyRecordWriter.java
@@ -26,6 +26,7 @@ import java.util.*;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.thrift.*;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.Pair;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.mapreduce.TaskAttemptContext;
@@ -198,6 +199,7 @@ final class ColumnFamilyRecordWriter extends 
AbstractColumnFamilyRecordWriter<By
                     }
                     catch (Exception e)
                     {
+                        JVMStabilityInspector.inspectThrowable(e);
                         closeInternal();
                         if (!iter.hasNext())
                         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/hadoop/HadoopCompat.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/hadoop/HadoopCompat.java 
b/src/java/org/apache/cassandra/hadoop/HadoopCompat.java
index f2f7033..bfc4ff6 100644
--- a/src/java/org/apache/cassandra/hadoop/HadoopCompat.java
+++ b/src/java/org/apache/cassandra/hadoop/HadoopCompat.java
@@ -36,6 +36,7 @@ import org.apache.hadoop.mapreduce.StatusReporter;
 import org.apache.hadoop.mapreduce.TaskAttemptContext;
 import org.apache.hadoop.mapreduce.TaskAttemptID;
 import org.apache.hadoop.mapreduce.TaskInputOutputContext;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 
 /*
  * This is based on ContextFactory.java from hadoop-2.0.x sources.
@@ -131,6 +132,7 @@ public class HadoopCompat {
                     get_counter = Class.forName(PACKAGE + 
".TaskAttemptContext").getMethod("getCounter", String.class,
                             String.class);
                 } catch (Exception e) {
+                    JVMStabilityInspector.inspectThrowable(e);
                     get_counter = Class.forName(PACKAGE + 
".TaskInputOutputContext").getMethod("getCounter",
                             String.class, String.class);
                 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordWriter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordWriter.java 
b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordWriter.java
index 5075be4..ff1989d 100644
--- a/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordWriter.java
+++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlRecordWriter.java
@@ -23,8 +23,6 @@ import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.cassandra.hadoop.HadoopCompat;
-import org.apache.hadoop.util.Progressable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -38,11 +36,14 @@ import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.hadoop.AbstractColumnFamilyOutputFormat;
 import org.apache.cassandra.hadoop.AbstractColumnFamilyRecordWriter;
 import org.apache.cassandra.hadoop.ConfigHelper;
+import org.apache.cassandra.hadoop.HadoopCompat;
 import org.apache.cassandra.thrift.*;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.mapreduce.TaskAttemptContext;
+import org.apache.hadoop.util.Progressable;
 import org.apache.thrift.TException;
 import org.apache.thrift.transport.TTransport;
 
@@ -250,6 +251,7 @@ class CqlRecordWriter extends 
AbstractColumnFamilyRecordWriter<Map<String, ByteB
                     }
                     catch (Exception e)
                     {
+                        JVMStabilityInspector.inspectThrowable(e);
                         closeInternal();
                         if (!iter.hasNext())
                         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java 
b/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java
index 14d30d5..6b22fac 100644
--- a/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java
+++ b/src/java/org/apache/cassandra/hadoop/pig/CassandraStorage.java
@@ -35,6 +35,7 @@ import org.apache.cassandra.thrift.*;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Hex;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.hadoop.mapreduce.*;
 import org.apache.pig.Expression;
 import org.apache.pig.ResourceSchema;
@@ -236,7 +237,8 @@ public class CassandraStorage extends 
AbstractCassandraStorage
                 }
                 catch (Exception e)
                 {
-                    cql3Table = true;                  
+                    JVMStabilityInspector.inspectThrowable(e);
+                    cql3Table = true;
                 }
                 if (hasColumn)
                 {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java 
b/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java
index bb3ba36..7a6be71 100644
--- a/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java
+++ b/src/java/org/apache/cassandra/hadoop/pig/CqlStorage.java
@@ -34,6 +34,7 @@ import org.apache.cassandra.hadoop.cql3.CqlConfigHelper;
 import org.apache.cassandra.thrift.*;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.hadoop.mapreduce.*;
 import org.apache.pig.Expression;
 import org.apache.pig.Expression.OpType;
@@ -602,6 +603,7 @@ public class CqlStorage extends AbstractCassandraStorage
                 }
                 catch (Exception e)
                 {
+                    JVMStabilityInspector.inspectThrowable(e);
                     // no compact column at value_alias
                 }
             }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java 
b/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java
index 7ceaa95..3583201 100644
--- a/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java
+++ b/src/java/org/apache/cassandra/io/compress/SnappyCompressor.java
@@ -27,6 +27,8 @@ import org.slf4j.LoggerFactory;
 import org.xerial.snappy.Snappy;
 import org.xerial.snappy.SnappyError;
 
+import org.apache.cassandra.utils.JVMStabilityInspector;
+
 public class SnappyCompressor implements ICompressor
 {
     public static final SnappyCompressor instance = new SnappyCompressor();
@@ -57,6 +59,7 @@ public class SnappyCompressor implements ICompressor
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             return false;
         }
         catch (NoClassDefFoundError e)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java 
b/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java
index 450553b..ccc03fc 100644
--- a/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java
+++ b/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java
@@ -28,6 +28,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.io.FSReadError;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 
 public class MmappedSegmentedFile extends SegmentedFile
 {
@@ -105,6 +106,7 @@ public class MmappedSegmentedFile extends SegmentedFile
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             // This is not supposed to happen
             logger.error("Error while unmapping segments", e);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/locator/CloudstackSnitch.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/locator/CloudstackSnitch.java 
b/src/java/org/apache/cassandra/locator/CloudstackSnitch.java
index 0200f0f..7f72ae2 100644
--- a/src/java/org/apache/cassandra/locator/CloudstackSnitch.java
+++ b/src/java/org/apache/cassandra/locator/CloudstackSnitch.java
@@ -41,6 +41,7 @@ import org.apache.cassandra.gms.EndpointState;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 
 /**
  * A snitch that assumes a Cloudstack Zone follows the typical convention
@@ -160,6 +161,7 @@ public class CloudstackSnitch extends 
AbstractNetworkTopologySnitch
             } 
             catch (Exception e) 
             {
+                JVMStabilityInspector.inspectThrowable(e);
                 continue;
             }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/net/OutboundTcpConnection.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/net/OutboundTcpConnection.java 
b/src/java/org/apache/cassandra/net/OutboundTcpConnection.java
index e1cb7a2..996e606 100644
--- a/src/java/org/apache/cassandra/net/OutboundTcpConnection.java
+++ b/src/java/org/apache/cassandra/net/OutboundTcpConnection.java
@@ -48,6 +48,7 @@ import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.tracing.TraceState;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.UUIDGen;
 import org.xerial.snappy.SnappyOutputStream;
 
@@ -168,6 +169,7 @@ public class OutboundTcpConnection extends Thread
                 }
                 catch (Exception e)
                 {
+                    JVMStabilityInspector.inspectThrowable(e);
                     // really shouldn't get here, as exception handling in 
writeConnected() is reasonably robust
                     // but we want to catch anything bad we don't drop the 
messages in the current batch
                     logger.error("error processing a message intended for {}", 
poolReference.endPoint(), e);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/service/ClientState.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/ClientState.java 
b/src/java/org/apache/cassandra/service/ClientState.java
index 492a07a..b4b162c 100644
--- a/src/java/org/apache/cassandra/service/ClientState.java
+++ b/src/java/org/apache/cassandra/service/ClientState.java
@@ -40,6 +40,7 @@ import org.apache.cassandra.exceptions.UnauthorizedException;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.thrift.ThriftValidation;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.SemanticVersion;
 
@@ -84,6 +85,7 @@ public class ClientState
             }
             catch (Exception e)
             {
+                JVMStabilityInspector.inspectThrowable(e);
                 logger.info("Cannot use class {} as query handler ({}), 
ignoring by defaulting on normal query handling", customHandlerClass, 
e.getMessage());
             }
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/streaming/StreamLockfile.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/streaming/StreamLockfile.java 
b/src/java/org/apache/cassandra/streaming/StreamLockfile.java
index 4d20479..0b1d832 100644
--- a/src/java/org/apache/cassandra/streaming/StreamLockfile.java
+++ b/src/java/org/apache/cassandra/streaming/StreamLockfile.java
@@ -35,6 +35,7 @@ import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.SSTable;
 import org.apache.cassandra.io.sstable.SSTableWriter;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 
 /**
  * Encapsulates the behavior for 'locking' any streamed sttables to a node.
@@ -105,6 +106,7 @@ public class StreamLockfile
             }
             catch (Exception e)
             {
+                JVMStabilityInspector.inspectThrowable(e);
                 logger.warn("failed to delete a potentially stale sstable {}", 
file);
             }
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/streaming/StreamSession.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/streaming/StreamSession.java 
b/src/java/org/apache/cassandra/streaming/StreamSession.java
index 3ba296c..b03d28a 100644
--- a/src/java/org/apache/cassandra/streaming/StreamSession.java
+++ b/src/java/org/apache/cassandra/streaming/StreamSession.java
@@ -43,6 +43,7 @@ import org.apache.cassandra.metrics.StreamingMetrics;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.streaming.messages.*;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.Pair;
 
 /**
@@ -217,6 +218,7 @@ public class StreamSession implements 
IEndpointStateChangeSubscriber
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             onError(e);
         }
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/thrift/CustomTThreadPoolServer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/thrift/CustomTThreadPoolServer.java 
b/src/java/org/apache/cassandra/thrift/CustomTThreadPoolServer.java
index f7a602c..59246df 100644
--- a/src/java/org/apache/cassandra/thrift/CustomTThreadPoolServer.java
+++ b/src/java/org/apache/cassandra/thrift/CustomTThreadPoolServer.java
@@ -33,6 +33,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions.ClientEncryptionOptions;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.thrift.TException;
 import org.apache.thrift.TProcessor;
 import org.apache.thrift.protocol.TProtocol;
@@ -214,9 +215,10 @@ public class CustomTThreadPoolServer extends TServer
             {
                 logger.error("Thrift error occurred during processing of 
message.", tx);
             }
-            catch (Exception x)
+            catch (Exception e)
             {
-                logger.error("Error occurred during processing of message.", 
x);
+                JVMStabilityInspector.inspectThrowable(e);
+                logger.error("Error occurred during processing of message.", 
e);
             }
             finally
             {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/tools/BulkLoader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/BulkLoader.java 
b/src/java/org/apache/cassandra/tools/BulkLoader.java
index 50e340b..84870a0 100644
--- a/src/java/org/apache/cassandra/tools/BulkLoader.java
+++ b/src/java/org/apache/cassandra/tools/BulkLoader.java
@@ -43,6 +43,7 @@ import org.apache.cassandra.io.sstable.SSTableLoader;
 import org.apache.cassandra.streaming.*;
 import org.apache.cassandra.thrift.*;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.OutputHandler;
 
 public class BulkLoader
@@ -107,6 +108,7 @@ public class BulkLoader
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             System.err.println(e.getMessage());
             if (e.getCause() != null)
                 System.err.println(e.getCause());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/tools/NodeTool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java 
b/src/java/org/apache/cassandra/tools/NodeTool.java
index 7b332f2..d5180f0 100644
--- a/src/java/org/apache/cassandra/tools/NodeTool.java
+++ b/src/java/org/apache/cassandra/tools/NodeTool.java
@@ -54,6 +54,7 @@ import org.apache.cassandra.streaming.SessionInfo;
 import org.apache.cassandra.streaming.StreamState;
 import org.apache.cassandra.utils.EstimatedHistogram;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
@@ -2170,8 +2171,9 @@ public class NodeTool
             try
             {
                 probe.stopCassandraDaemon();
-            } catch (Exception ignored)
+            } catch (Exception e)
             {
+                JVMStabilityInspector.inspectThrowable(e);
                 // ignored
             }
             System.out.println("Cassandra has shutdown.");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/tools/SSTableImport.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/SSTableImport.java 
b/src/java/org/apache/cassandra/tools/SSTableImport.java
index 75ad26f..edad02a 100644
--- a/src/java/org/apache/cassandra/tools/SSTableImport.java
+++ b/src/java/org/apache/cassandra/tools/SSTableImport.java
@@ -46,6 +46,7 @@ import org.apache.cassandra.io.sstable.SSTableWriter;
 import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.codehaus.jackson.JsonFactory;
 import org.codehaus.jackson.JsonParser;
 import org.codehaus.jackson.JsonToken;
@@ -514,6 +515,7 @@ public class SSTableImport
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             e.printStackTrace();
             System.err.println("ERROR: " + e.getMessage());
             System.exit(-1);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java 
b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
index 78d4d9e..42799a5 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
@@ -32,6 +32,7 @@ import 
org.apache.cassandra.db.compaction.LeveledCompactionStrategy;
 import org.apache.cassandra.db.compaction.LeveledManifest;
 import org.apache.cassandra.db.compaction.Scrubber;
 import org.apache.cassandra.io.sstable.*;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.OutputHandler;
 
 import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
@@ -86,6 +87,7 @@ public class StandaloneScrubber
                 }
                 catch (Exception e)
                 {
+                    JVMStabilityInspector.inspectThrowable(e);
                     System.err.println(String.format("Error Loading %s: %s", 
entry.getKey(), e.getMessage()));
                     if (options.debug)
                         e.printStackTrace(System.err);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java 
b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
index 75ad959..9d1fbf8 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
@@ -30,6 +30,7 @@ import org.apache.cassandra.db.Directories;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.compaction.SSTableSplitter;
 import org.apache.cassandra.io.sstable.*;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.Pair;
 
 import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
@@ -131,6 +132,7 @@ public class StandaloneSplitter
                 }
                 catch (Exception e)
                 {
+                    JVMStabilityInspector.inspectThrowable(e);
                     System.err.println(String.format("Error Loading %s: %s", 
fn.getKey(), e.getMessage()));
                     if (options.debug)
                         e.printStackTrace(System.err);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java 
b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
index 55f206e..f632dfd 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
@@ -29,6 +29,7 @@ import org.apache.cassandra.db.Directories;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.compaction.Upgrader;
 import org.apache.cassandra.io.sstable.*;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.OutputHandler;
 
 import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
@@ -80,6 +81,7 @@ public class StandaloneUpgrader
                 }
                 catch (Exception e)
                 {
+                    JVMStabilityInspector.inspectThrowable(e);
                     System.err.println(String.format("Error Loading %s: %s", 
entry.getKey(), e.getMessage()));
                     if (options.debug)
                         e.printStackTrace(System.err);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/transport/Client.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/transport/Client.java 
b/src/java/org/apache/cassandra/transport/Client.java
index 989b954..c7c3103 100644
--- a/src/java/org/apache/cassandra/transport/Client.java
+++ b/src/java/org/apache/cassandra/transport/Client.java
@@ -38,6 +38,7 @@ import org.apache.cassandra.db.marshal.Int32Type;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.transport.messages.*;
 import org.apache.cassandra.utils.Hex;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MD5Digest;
 
 import static 
org.apache.cassandra.config.EncryptionOptions.ClientEncryptionOptions;
@@ -80,6 +81,7 @@ public class Client extends SimpleClient
             }
             catch (Exception e)
             {
+                JVMStabilityInspector.inspectThrowable(e);
                 System.err.println("ERROR: " + e.getMessage());
             }
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/transport/FrameCompressor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/transport/FrameCompressor.java 
b/src/java/org/apache/cassandra/transport/FrameCompressor.java
index 8ab735f..fa337ec 100644
--- a/src/java/org/apache/cassandra/transport/FrameCompressor.java
+++ b/src/java/org/apache/cassandra/transport/FrameCompressor.java
@@ -27,6 +27,8 @@ import org.xerial.snappy.SnappyError;
 import net.jpountz.lz4.LZ4Exception;
 import net.jpountz.lz4.LZ4Factory;
 
+import org.apache.cassandra.utils.JVMStabilityInspector;
+
 public interface FrameCompressor
 {
     public Frame compress(Frame frame) throws IOException;
@@ -48,6 +50,7 @@ public interface FrameCompressor
             }
             catch (Exception e)
             {
+                JVMStabilityInspector.inspectThrowable(e);
                 i = null;
             }
             catch (NoClassDefFoundError e)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java 
b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
index 19fa6aa..ff791ef 100644
--- a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
@@ -35,6 +35,7 @@ import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.*;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MD5Digest;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -220,6 +221,7 @@ public class BatchMessage extends Message.Request
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             return ErrorMessage.fromException(e);
         }
         finally

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java 
b/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
index 78182b2..324ae00 100644
--- a/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
@@ -33,6 +33,7 @@ import 
org.apache.cassandra.exceptions.PreparedQueryNotFoundException;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.*;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MD5Digest;
 import org.apache.cassandra.utils.UUIDGen;
 
@@ -141,6 +142,7 @@ public class ExecuteMessage extends Message.Request
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             return ErrorMessage.fromException(e);
         }
         finally

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java 
b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
index 2899cf8..221b9ca 100644
--- a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
@@ -26,6 +26,7 @@ import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.*;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.UUIDGen;
 
 public class PrepareMessage extends Message.Request
@@ -83,6 +84,7 @@ public class PrepareMessage extends Message.Request
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             return ErrorMessage.fromException(e);
         }
         finally

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java 
b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
index 377cdaf..ff50422 100644
--- a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
@@ -31,6 +31,7 @@ import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.*;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.UUIDGen;
 
 /**
@@ -126,6 +127,7 @@ public class QueryMessage extends Message.Request
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             if (!((e instanceof RequestValidationException) || (e instanceof 
RequestExecutionException)))
                 logger.error("Unexpected error during query", e);
             return ErrorMessage.fromException(e);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/utils/CLibrary.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/CLibrary.java 
b/src/java/org/apache/cassandra/utils/CLibrary.java
index 1927578..1c771af 100644
--- a/src/java/org/apache/cassandra/utils/CLibrary.java
+++ b/src/java/org/apache/cassandra/utils/CLibrary.java
@@ -296,6 +296,7 @@ public final class CLibrary
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             logger.warn("unable to read fd field from FileDescriptor");
         }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/utils/FBUtilities.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java 
b/src/java/org/apache/cassandra/utils/FBUtilities.java
index 7e9adab..01b7923 100644
--- a/src/java/org/apache/cassandra/utils/FBUtilities.java
+++ b/src/java/org/apache/cassandra/utils/FBUtilities.java
@@ -364,6 +364,7 @@ public class FBUtilities
         }
         catch (Exception e)
         {
+            JVMStabilityInspector.inspectThrowable(e);
             logger.warn("Unable to load version.properties", e);
             return "debug version";
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/utils/Hex.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/Hex.java 
b/src/java/org/apache/cassandra/utils/Hex.java
index 5ba0b1a..f018f26 100644
--- a/src/java/org/apache/cassandra/utils/Hex.java
+++ b/src/java/org/apache/cassandra/utils/Hex.java
@@ -105,6 +105,7 @@ public class Hex
             }
             catch (Exception e)
             {
+                JVMStabilityInspector.inspectThrowable(e);
                 // Swallowing as we'll just use a copying constructor
             }
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java 
b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
index bcff172..2883ab3 100644
--- a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
+++ b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
@@ -17,6 +17,9 @@
  */
 package org.apache.cassandra.utils;
 
+import java.io.FileNotFoundException;
+import java.net.SocketException;
+
 import com.google.common.annotations.VisibleForTesting;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,6 +53,11 @@ public final class JVMStabilityInspector
 
         if (DatabaseDescriptor.getDiskFailurePolicy() == 
Config.DiskFailurePolicy.die)
             if (t instanceof FSError || t instanceof CorruptSSTableException)
+            isUnstable = true;
+
+        // Check for file handle exhaustion
+        if (t instanceof FileNotFoundException || t instanceof SocketException)
+            if (t.getMessage().contains("Too many open files"))
                 isUnstable = true;
 
         if (isUnstable)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/test/unit/org/apache/cassandra/db/CommitLogTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/CommitLogTest.java 
b/test/unit/org/apache/cassandra/db/CommitLogTest.java
index 8a1bb0c..9e59797 100644
--- a/test/unit/org/apache/cassandra/db/CommitLogTest.java
+++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java
@@ -302,7 +302,6 @@ public class CommitLogTest extends SchemaLoader
         KillerForTests killerForTests = new KillerForTests();
         JVMStabilityInspector.Killer originalKiller = 
JVMStabilityInspector.replaceKiller(killerForTests);
         Config.CommitFailurePolicy oldPolicy = 
DatabaseDescriptor.getCommitFailurePolicy();
-
         try
         {
             
DatabaseDescriptor.setCommitFailurePolicy(Config.CommitFailurePolicy.die);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java 
b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
index e2a5107..494b3b1 100644
--- a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
+++ b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
@@ -5,7 +5,14 @@ import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.FSReadError;
 import org.junit.Test;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketException;
+import java.util.ArrayList;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -48,4 +55,33 @@ public class JVMStabilityInspectorTest
         }
     }
 
+    @Test
+    public void fileHandleTest() throws FileNotFoundException
+    {
+        KillerForTests killerForTests = new KillerForTests();
+        JVMStabilityInspector.Killer originalKiller = 
JVMStabilityInspector.replaceKiller(killerForTests);
+
+        try
+        {
+            killerForTests.reset();
+            JVMStabilityInspector.inspectThrowable(new SocketException("Should 
not fail"));
+            assertFalse(killerForTests.wasKilled());
+
+            killerForTests.reset();
+            JVMStabilityInspector.inspectThrowable(new 
FileNotFoundException("Also should not fail"));
+            assertFalse(killerForTests.wasKilled());
+
+            killerForTests.reset();
+            JVMStabilityInspector.inspectThrowable(new SocketException("Too 
many open files"));
+            assertTrue(killerForTests.wasKilled());
+
+            killerForTests.reset();
+            JVMStabilityInspector.inspectCommitLogThrowable(new 
FileNotFoundException("Too many open files"));
+            assertTrue(killerForTests.wasKilled());
+        }
+        finally
+        {
+            JVMStabilityInspector.replaceKiller(originalKiller);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f25da979/test/unit/org/apache/cassandra/utils/KillerForTests.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/utils/KillerForTests.java 
b/test/unit/org/apache/cassandra/utils/KillerForTests.java
index 83cd7fc..d488f97 100644
--- a/test/unit/org/apache/cassandra/utils/KillerForTests.java
+++ b/test/unit/org/apache/cassandra/utils/KillerForTests.java
@@ -1,43 +1,43 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.utils;
-
-/**
- * Responsible for stubbing out the System.exit() logic during unit tests.
- */
-public class KillerForTests extends JVMStabilityInspector.Killer
-{
-    private boolean killed = false;
-
-    @Override
-    protected void killCurrentJVM(Throwable t)
-    {
-        killed = true;
-    }
-
-    public boolean wasKilled()
-    {
-        return killed;
-    }
-
-    public void reset()
-    {
-        killed = false;
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.utils;
+
+/**
+ * Responsible for stubbing out the System.exit() logic during unit tests.
+ */
+public class KillerForTests extends JVMStabilityInspector.Killer
+{
+    private boolean killed = false;
+
+    @Override
+    protected void killCurrentJVM(Throwable t)
+    {
+        killed = true;
+    }
+
+    public boolean wasKilled()
+    {
+        return killed;
+    }
+
+    public void reset()
+    {
+        killed = false;
+    }
+}

Reply via email to