diff --git a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java index ce5ea38bcd..ab3471c489 100644 --- a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java +++ b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java @@ -48,6 +48,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 */ @@ -68,6 +69,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 e10ffc86bd..eb8dbf96dd 100644 --- a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java +++ b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java @@ -59,6 +59,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 {