diff --git a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java index de396bb69c..2884bc212f 100644 --- a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java +++ b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java @@ -45,6 +45,7 @@ public final class JVMStabilityInspector /** * Certain Throwables and Exceptions represent "Die" conditions for the server. + * This recursively checks the input Throwable's cause hierarchy until null. * @param t * The Throwable to check for server-stop conditions */ @@ -65,6 +66,9 @@ public final class JVMStabilityInspector if (isUnstable) killer.killCurrentJVM(t); + + if (t.getCause() != null) + inspectThrowable(t.getCause()); } public static void inspectCommitLogThrowable(Throwable t) diff --git a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java index f588244367..7142f97259 100644 --- a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java +++ b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java @@ -58,6 +58,15 @@ public class JVMStabilityInspectorTest killerForTests.reset(); JVMStabilityInspector.inspectCommitLogThrowable(new Throwable()); assertTrue(killerForTests.wasKilled()); + + killerForTests.reset(); + JVMStabilityInspector.inspectThrowable(new Exception(new IOException())); + assertFalse(killerForTests.wasKilled()); + + killerForTests.reset(); + JVMStabilityInspector.inspectThrowable(new Exception(new OutOfMemoryError())); + assertTrue(killerForTests.wasKilled()); + } finally {