[NO ISSUE][TX][FAIL] Halt on LogFlusher failure
- user model changes: no
- storage format changes: no
- interface changes: no
- cures cancer: no
Change-Id: I69c4bf6c9669601e6613a9435de046d72b0baf6d
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2464
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: abdullah alamoudi <bamousaa@gmail.com>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
diff --git a/asterixdb/asterix-transactions/pom.xml b/asterixdb/asterix-transactions/pom.xml
index 57332ba..ad044cb 100644
--- a/asterixdb/asterix-transactions/pom.xml
+++ b/asterixdb/asterix-transactions/pom.xml
@@ -155,5 +155,9 @@
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.hyracks</groupId>
+ <artifactId>hyracks-util</artifactId>
+ </dependency>
</dependencies>
</project>
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManager.java
index e3788b7..ce65de0 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManager.java
@@ -56,6 +56,7 @@
import org.apache.asterix.common.transactions.TxnLogFile;
import org.apache.hyracks.api.lifecycle.ILifeCycleComponent;
import org.apache.hyracks.api.util.InvokeUtil;
+import org.apache.hyracks.util.ExitUtil;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
@@ -714,8 +715,9 @@
emptyQ.add(flushPage.getLogPageSize() == logMgr.getLogPageSize() ? flushPage : stashQ.remove());
}
} catch (Exception e) {
- LOGGER.log(Level.ERROR, "LogFlusher is terminating abnormally. System is in unusable state.", e);
- throw e;
+ LOGGER.log(Level.ERROR, "LogFlusher is terminating abnormally. System is in unusable state; halting", e);
+ ExitUtil.halt(44);
+ throw new AssertionError("not reachable");
} finally {
if (interrupted) {
Thread.currentThread().interrupt();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCShutdownHook.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCShutdownHook.java
index 020e564..ccac00e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCShutdownHook.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCShutdownHook.java
@@ -18,6 +18,7 @@
*/
package org.apache.hyracks.control.nc;
+import org.apache.hyracks.util.ExitUtil;
import org.apache.hyracks.util.ThreadDumpUtil;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
@@ -52,11 +53,11 @@
try {
LOGGER.info("Watchdog is angry. Killing shutdown hook");
} finally {
- Runtime.getRuntime().halt(66); // NOSONAR last resort
+ ExitUtil.halt(ExitUtil.EXIT_CODE_SHUTDOWN_TIMED_OUT);
}
}
} catch (Throwable th) { // NOSONAR must catch them all
- Runtime.getRuntime().halt(77); // NOSONAR last resort
+ ExitUtil.halt(ExitUtil.EXIT_CODE_WATCHDOG_FAILED);
}
};
}
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExitUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExitUtil.java
index c54c9dc..523480a 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExitUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExitUtil.java
@@ -28,6 +28,9 @@
private static final ExitThread exitThread = new ExitThread();
+ public static final int EXIT_CODE_SHUTDOWN_TIMED_OUT = 66;
+ public static final int EXIT_CODE_WATCHDOG_FAILED = 77;
+
private ExitUtil() {
}
@@ -40,6 +43,18 @@
exitThread.start();
}
+ @SuppressWarnings("squid:S2142") // catch interrupted
+ public static void halt(int status) {
+ LOGGER.fatal("JVM halting with status " + status + "; bye!", new Throwable("halt stacktrace"));
+ try {
+ // try to give time for the log to be emitted...
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ Runtime.getRuntime().halt(status);
+ }
+
private static class ExitThread extends Thread {
private int status;