You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by av...@apache.org on 2020/08/13 08:46:45 UTC
[ignite] branch ignite-ducktape updated: Fail fast (#8147)
This is an automated email from the ASF dual-hosted git repository.
av pushed a commit to branch ignite-ducktape
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/ignite-ducktape by this push:
new 879fa1f Fail fast (#8147)
879fa1f is described below
commit 879fa1f53d2f757059868cf21d9c9761ed49de19
Author: Anton Vinogradov <av...@apache.org>
AuthorDate: Thu Aug 13 11:46:17 2020 +0300
Fail fast (#8147)
---
.../ducktest/utils/IgniteAwareApplication.java | 55 ++++++++++++++++++----
.../ignitetest/services/utils/ignite_aware_app.py | 11 ++++-
.../tests/ignitetest/tests/utils/ignite_test.py | 2 +-
3 files changed, 55 insertions(+), 13 deletions(-)
diff --git a/modules/ducktests/src/main/java/org/apache/ignite/internal/ducktest/utils/IgniteAwareApplication.java b/modules/ducktests/src/main/java/org/apache/ignite/internal/ducktest/utils/IgniteAwareApplication.java
index 7a173a5..5e610f1 100644
--- a/modules/ducktests/src/main/java/org/apache/ignite/internal/ducktest/utils/IgniteAwareApplication.java
+++ b/modules/ducktests/src/main/java/org/apache/ignite/internal/ducktest/utils/IgniteAwareApplication.java
@@ -37,6 +37,9 @@ public abstract class IgniteAwareApplication {
/** App finished. */
private static final String APP_FINISHED = "IGNITE_APPLICATION_FINISHED";
+ /** App broken. */
+ private static final String APP_BROKEN = "IGNITE_APPLICATION_BROKEN";
+
/** App terminated. */
private static final String APP_TERMINATED = "IGNITE_APPLICATION_TERMINATED";
@@ -46,9 +49,15 @@ public abstract class IgniteAwareApplication {
/** Finished. */
private static volatile boolean finished;
+ /** Broken. */
+ private static volatile boolean broken;
+
/** Terminated. */
private static volatile boolean terminated;
+ /** Shutdown hook. */
+ private static volatile Thread hook;
+
/** Ignite. */
protected Ignite ignite;
@@ -59,10 +68,15 @@ public abstract class IgniteAwareApplication {
* Default constructor.
*/
protected IgniteAwareApplication() {
- Runtime.getRuntime().addShutdownHook(new Thread(() -> {
- terminate();
+ Runtime.getRuntime().addShutdownHook(hook = new Thread(() -> {
+ log.info("SIGTERM recorded.");
- while (!finished()) {
+ if (!finished && !broken)
+ terminate();
+ else
+ log.info("Application already done [finished=" + finished + ", broken=" + broken + "]");
+
+ while (!finished && !broken) {
log.info("Waiting for graceful termnation.");
try {
@@ -72,8 +86,6 @@ public abstract class IgniteAwareApplication {
e.printStackTrace();
}
}
-
- log.info("SIGTERM recorded.");
}));
log.info("ShutdownHook registered.");
@@ -95,25 +107,44 @@ public abstract class IgniteAwareApplication {
*/
protected void markFinished() {
assert !finished;
+ assert !broken;
log.info(APP_FINISHED);
+ removeShutdownHook();
+
finished = true;
}
/**
*
*/
- protected void markSyncExecutionComplete() {
- markInitialized();
- markFinished();
+ private void markBroken() {
+ assert !finished;
+ assert !broken;
+
+ log.info(APP_BROKEN);
+
+ removeShutdownHook();
+
+ broken = true;
}
/**
*
*/
- private boolean finished() {
- return finished;
+ private void removeShutdownHook() {
+ Runtime.getRuntime().removeShutdownHook(hook);
+
+ log.info("Shutdown hook removed.");
+ }
+
+ /**
+ *
+ */
+ protected void markSyncExecutionComplete() {
+ markInitialized();
+ markFinished();
}
/**
@@ -173,6 +204,10 @@ public abstract class IgniteAwareApplication {
}
catch (Throwable th) {
log.error("Unexpected Application failure... ", th);
+
+ recordResult("ERROR", th.getMessage());
+
+ markBroken();
}
finally {
log.info("Application finished.");
diff --git a/modules/ducktests/tests/ignitetest/services/utils/ignite_aware_app.py b/modules/ducktests/tests/ignitetest/services/utils/ignite_aware_app.py
index b05f5a1..29e0a2c 100644
--- a/modules/ducktests/tests/ignitetest/services/utils/ignite_aware_app.py
+++ b/modules/ducktests/tests/ignitetest/services/utils/ignite_aware_app.py
@@ -49,7 +49,13 @@ class IgniteAwareApplicationService(IgniteAwareService):
self.logger.info("Waiting for Ignite aware Application (%s) to start..." % self.java_class_name)
self.await_event("Topology snapshot", self.timeout_sec, from_the_beginning=True)
- self.await_event("IGNITE_APPLICATION_INITIALIZED", self.timeout_sec, from_the_beginning=True)
+ self.await_event("IGNITE_APPLICATION_INITIALIZED\\|IGNITE_APPLICATION_BROKEN", self.timeout_sec,
+ from_the_beginning=True)
+
+ try:
+ self.await_event("IGNITE_APPLICATION_INITIALIZED", 1, from_the_beginning=True)
+ except Exception:
+ raise Exception("Java application execution failed. %s" % self.extract_result("ERROR"))
def start_cmd(self, node):
cmd = self.env()
@@ -70,7 +76,8 @@ class IgniteAwareApplicationService(IgniteAwareService):
assert stopped, "Node %s: did not stop within the specified timeout of %s seconds" % \
(str(node.account), str(self.stop_timeout_sec))
- self.await_event("IGNITE_APPLICATION_FINISHED", from_the_beginning=True, timeout_sec=timeout_sec)
+ self.await_event("IGNITE_APPLICATION_FINISHED\\|IGNITE_APPLICATION_BROKEN", from_the_beginning=True,
+ timeout_sec=timeout_sec)
def clean_node(self, node):
if self.alive(node):
diff --git a/modules/ducktests/tests/ignitetest/tests/utils/ignite_test.py b/modules/ducktests/tests/ignitetest/tests/utils/ignite_test.py
index df0d30e..c0c35c7 100644
--- a/modules/ducktests/tests/ignitetest/tests/utils/ignite_test.py
+++ b/modules/ducktests/tests/ignitetest/tests/utils/ignite_test.py
@@ -34,7 +34,7 @@ class IgniteTest(Test):
Print stage mark.
:param msg: Stage mark message.
"""
- self.logger.info("[TEST_STAGE] " + msg + "...")
+ self.logger.info("[TEST_STAGE] " + msg)
@staticmethod
def monotonic():