From 6ee4a32a87459850d56ed641c688a5fe4aa19215 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Wed, 14 Jul 2021 18:57:30 +0200
Subject: [PATCH] small fixes to coordinator

- inheritIO for docker compose
- wait shortly for script to check for failures
- use return value of start to set status to "failedStart" if it is false
---
 src/main/jastadd/Coordinator.jrag             | 22 +++++++------------
 .../inf/st/coordinator/MainCoordinator.java   |  9 +++++---
 2 files changed, 14 insertions(+), 17 deletions(-)

diff --git a/src/main/jastadd/Coordinator.jrag b/src/main/jastadd/Coordinator.jrag
index c7bd041..064b2c9 100644
--- a/src/main/jastadd/Coordinator.jrag
+++ b/src/main/jastadd/Coordinator.jrag
@@ -68,23 +68,11 @@ aspect Manipulation {
         return true;
       }
       System.out.println("Starting " + Arrays.toString(args));
-      ProcessBuilder builder = new ProcessBuilder(args);
+      ProcessBuilder builder = new ProcessBuilder(args).inheritIO();
 
       Process process = builder.start();
       process.waitFor();
 
-      try (java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream()))) {
-        System.out.println("Out of " + java.util.Arrays.toString(args) + ":\n" + reader.lines().collect(java.util.stream.Collectors.joining("\n")));
-      } catch (IOException e) {
-        e.printStackTrace();
-      }
-
-      try (java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getErrorStream()))) {
-        System.out.println("Err of " + java.util.Arrays.toString(args) + ":\n" + reader.lines().collect(java.util.stream.Collectors.joining("\n")));
-      } catch (IOException e) {
-        e.printStackTrace();
-      }
-
       return process.exitValue() == 0;
     }
     return false;
@@ -104,7 +92,13 @@ aspect Manipulation {
     }
 
     Process process = builder.start();
-    // Do not wait for process to be finished
+
+    // check if process has crashed within a short time
+    if (process.waitFor(2, java.util.concurrent.TimeUnit.SECONDS) && process.exitValue() != 0) {
+      process.getErrorStream().transferTo(System.err);
+      process.getInputStream().transferTo(System.out);
+      return false;
+    }
     return true;
   }
 
diff --git a/src/main/java/de/tudresden/inf/st/coordinator/MainCoordinator.java b/src/main/java/de/tudresden/inf/st/coordinator/MainCoordinator.java
index c3923eb..8b277ca 100644
--- a/src/main/java/de/tudresden/inf/st/coordinator/MainCoordinator.java
+++ b/src/main/java/de/tudresden/inf/st/coordinator/MainCoordinator.java
@@ -101,8 +101,8 @@ public class MainCoordinator implements Callable<Integer> {
         commandTopic = "coordinator/" + comp.getName();
         mainHandler.newConnection(commandTopic, bytes -> {
           try {
-            comp.getStartStrategy().start();
-            comp.setStatus("ready");
+            boolean successfullyStarted = comp.getStartStrategy().start();
+            comp.setStatus(successfullyStarted ? "ready" : "failedStart");
           } catch (IOException | InterruptedException e) {
             comp.setStatus("failedStart");
             e.printStackTrace();
@@ -127,7 +127,10 @@ public class MainCoordinator implements Callable<Integer> {
         }
       }
       if (!alreadyRunning.contains(comp) && !comp.getStartAsUp()) {
-        comp.getStartStrategy().start();
+        if (!comp.getStartStrategy().start()) {
+          // component has failed to start
+          comp.setStatus("failedStart");
+        }
         if (comp.hasAutoSetStatus()) {
           scheduleAutoSetStatus(comp);
         }
-- 
GitLab