From 43179fc214e491ab3ec8ef9a04de256551eced7e Mon Sep 17 00:00:00 2001 From: Micha Date: Mon, 6 Sep 2021 19:01:26 +0200 Subject: [PATCH 1/2] Fixed the problem that the SDK gets stuck if the benchmark signals reaction terminates with an assert error. Now, the assertion is catched and logged, the termination steps are further executed and the SDK test case checks whether an exception has been thrown at the end. --- pom.xml | 2 +- .../sdk/utils/CommandQueueListener.java | 48 +++++++-------- .../BenchmarkSignalsReaction.java | 59 ++++++++++--------- .../hobbit/sdk/DummyBenchmarkTestRunner.java | 1 + 4 files changed, 57 insertions(+), 53 deletions(-) diff --git a/pom.xml b/pom.xml index 21b6b073..5fa56b8c 100755 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.hobbit hobbit-java-sdk - 1.1.18 + 1.1.19-SNAPSHOT UTF-8 diff --git a/src/main/java/org/hobbit/sdk/utils/CommandQueueListener.java b/src/main/java/org/hobbit/sdk/utils/CommandQueueListener.java index f7ad2141..d429599f 100755 --- a/src/main/java/org/hobbit/sdk/utils/CommandQueueListener.java +++ b/src/main/java/org/hobbit/sdk/utils/CommandQueueListener.java @@ -1,24 +1,14 @@ package org.hobbit.sdk.utils; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.QueueingConsumer; -import org.hobbit.core.Commands; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Semaphore; + +import org.hobbit.core.Constants; import org.hobbit.core.components.AbstractPlatformConnectorComponent; -import org.hobbit.core.data.StartCommandData; -import org.hobbit.core.rabbit.RabbitMQUtils; import org.hobbit.sdk.utils.commandreactions.CommandReaction; -import org.hobbit.core.Constants; -import org.junit.contrib.java.lang.system.EnvironmentVariables; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.Objects; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Semaphore; - /** * @author Roman Katerinenko */ @@ -29,9 +19,11 @@ public class CommandQueueListener extends AbstractPlatformConnectorComponent { private final Semaphore terminationSemaphore = new Semaphore(0, true); private final CountDownLatch countDownLatch = new CountDownLatch(1); - private CommandReaction[] commandReactions=new CommandReaction[0]; + private CommandReaction[] commandReactions = new CommandReaction[0]; private String replyTo; - private final EnvironmentVariables environmentVariables = new EnvironmentVariables(); +// private final EnvironmentVariables environmentVariables = new EnvironmentVariables(); + + private boolean catchedExceptions = false; @Override public void init() throws Exception { @@ -50,27 +42,30 @@ public void run() throws Exception { logger.debug("Terminated"); } - public String submit(String imageName, String[] envVariables){ + public String submit(String imageName, String[] envVariables) { return super.createContainer(imageName, envVariables); } - public String createContainer(String imageName, String[] envVariables){ + public String createContainer(String imageName, String[] envVariables) { return super.createContainer(imageName, envVariables); } - public String createContainer(String imageName, String containerType, String[] envVariables){ + public String createContainer(String imageName, String containerType, String[] envVariables) { String ret = super.createContainer(imageName, containerType, envVariables); return ret; } - // @Override protected void handleCmd(byte[] bytes, String replyTo) { this.replyTo = replyTo; - super.handleCmd(bytes, replyTo); + try { + super.handleCmd(bytes, replyTo); + } catch (Throwable e) { + logger.error("Catched exception while handling command.", e); + catchedExceptions = true; + } } - public void waitForInitialisation() throws InterruptedException { countDownLatch.await(); } @@ -94,10 +89,15 @@ public void receiveCommand(byte command, byte[] data) { for (CommandReaction commandReaction : commandReactions) { try { commandReaction.handleCmd(command, data, replyTo); - } catch (Exception e) { - logger.error("Failed to handle command with {}",commandReaction.getClass().getSimpleName(), e); + } catch (Throwable e) { + logger.error("Failed to handle command with {}", commandReaction.getClass().getSimpleName(), e); + catchedExceptions = true; } } } + public boolean anyExceptions() { + return catchedExceptions; + } + } \ No newline at end of file diff --git a/src/main/java/org/hobbit/sdk/utils/commandreactions/BenchmarkSignalsReaction.java b/src/main/java/org/hobbit/sdk/utils/commandreactions/BenchmarkSignalsReaction.java index cbead10c..051e4b98 100755 --- a/src/main/java/org/hobbit/sdk/utils/commandreactions/BenchmarkSignalsReaction.java +++ b/src/main/java/org/hobbit/sdk/utils/commandreactions/BenchmarkSignalsReaction.java @@ -1,6 +1,8 @@ package org.hobbit.sdk.utils.commandreactions; import com.google.gson.Gson; + +import org.apache.jena.rdf.model.ModelFactory; import org.hobbit.core.Commands; import org.hobbit.core.components.Component; import org.hobbit.core.rabbit.RabbitMQUtils; @@ -15,7 +17,6 @@ import java.util.List; import java.util.Map; - public class BenchmarkSignalsReaction implements CommandReaction { private static final Logger logger = LoggerFactory.getLogger(BenchmarkSignalsReaction.class); @@ -51,23 +52,23 @@ public class BenchmarkSignalsReaction implements CommandReaction { private boolean startBenchmarkCommandSent = false; private Map customContainers = new HashMap<>(); private Map customContainersRunning = new HashMap<>(); - //private String systemContainerId = null; + // private String systemContainerId = null; - public BenchmarkSignalsReaction(CommandReactionsBuilder builder){ + public BenchmarkSignalsReaction(CommandReactionsBuilder builder) { this.componentsExecutor = builder.componentsExecutor; this.commandQueueListener = builder.commandQueueListener; - this.benchmarkController=builder.benchmarkController; - this.dataGenerator=builder.dataGenerator; - this.taskGenerator=builder.taskGenerator; - this.evalStorage=builder.evalStorage; - this.evalModule=builder.evalModule; - this.systemAdapter=builder.systemAdapter; + this.benchmarkController = builder.benchmarkController; + this.dataGenerator = builder.dataGenerator; + this.taskGenerator = builder.taskGenerator; + this.evalStorage = builder.evalStorage; + this.evalModule = builder.evalModule; + this.systemAdapter = builder.systemAdapter; this.benchmarkControllerImageName = builder.benchmarkControllerImageName; this.dataGeneratorImageName = builder.dataGeneratorImageName; this.taskGeneratorImageName = builder.taskGeneratorImageName; - this.evalStorageImageName = builder.evalStorageImageName ; + this.evalStorageImageName = builder.evalStorageImageName; this.evalModuleImageName = builder.evalModuleImageName; this.systemAdapterImageName = builder.systemAdapterImageName; this.customContainers = builder.customContainers; @@ -76,18 +77,19 @@ public BenchmarkSignalsReaction(CommandReactionsBuilder builder){ @Override public void handleCmd(Byte command, byte[] bytes, String replyTo) throws Exception { - if (command == Commands.BENCHMARK_FINISHED_SIGNAL){ + if (command == Commands.BENCHMARK_FINISHED_SIGNAL) { logger.debug("BENCHMARK_FINISHED_SIGNAL received"); try { assert bytes != null; assert bytes.length != 0; componentsExecutor.resultModel = RabbitMQUtils.readModel(bytes); - + } catch (Throwable e) { + // The exception will be handled somewhere else. However, we should make sure + // that there is some model set + componentsExecutor.resultModel = ModelFactory.createDefaultModel(); + } finally { commandQueueListener.terminate(); componentsExecutor.shutdown(); - } catch (InterruptedException e) { - System.out.println(e.getMessage()); - //Assert.fail(e.getMessage()); } } @@ -114,37 +116,38 @@ public void handleCmd(Byte command, byte[] bytes, String replyTo) throws Excepti if (command == Commands.SYSTEM_READY_SIGNAL) { systemReady = true; logger.debug("SYSTEM_READY_SIGNAL signal received"); - if(!System.getenv().containsKey("SYSTEM_CONTAINER_ID")) - throw new Exception("SYSTEM_CONTAINER_ID is not specified as env variable. Specify it where you submit system/create system container in checkHealth"); + if (!System.getenv().containsKey("SYSTEM_CONTAINER_ID")) + throw new Exception( + "SYSTEM_CONTAINER_ID is not specified as env variable. Specify it where you submit system/create system container in checkHealth"); } - synchronized (this){ + synchronized (this) { List waitForComponents = new ArrayList<>(); - if(!benchmarkReady) + if (!benchmarkReady) waitForComponents.add("benchmarkController"); - if(dataGenerator!=null && !dataGenReady) + if (dataGenerator != null && !dataGenReady) waitForComponents.add("dataGenerator"); - if(taskGenerator!=null && !taskGenReady) + if (taskGenerator != null && !taskGenReady) waitForComponents.add("taskGenerator"); - if(evalStorage!=null && !evalStorageReady) + if (evalStorage != null && !evalStorageReady) waitForComponents.add("evalStorage"); - if(!systemReady) + if (!systemReady) waitForComponents.add("systemAdapter"); - if(waitForComponents.size()>0) + if (waitForComponents.size() > 0) logger.debug("Waiting ready signals for {}", String.join(", ", waitForComponents)); - else if (!startBenchmarkCommandSent){ + else if (!startBenchmarkCommandSent) { logger.debug("sending START_BENCHMARK_SIGNAL"); try { - new CommandSender(Commands.START_BENCHMARK_SIGNAL, System.getenv().get("SYSTEM_CONTAINER_ID")).send(); + new CommandSender(Commands.START_BENCHMARK_SIGNAL, System.getenv().get("SYSTEM_CONTAINER_ID")) + .send(); startBenchmarkCommandSent = true; } catch (Exception e) { logger.error("Failed to send START_BENCHMARK_SIGNAL: {}", e.getMessage()); - //Assert.fail(e.getMessage()); + // Assert.fail(e.getMessage()); } } } } - } diff --git a/src/test/java/org/hobbit/sdk/DummyBenchmarkTestRunner.java b/src/test/java/org/hobbit/sdk/DummyBenchmarkTestRunner.java index 3343269e..03f91391 100644 --- a/src/test/java/org/hobbit/sdk/DummyBenchmarkTestRunner.java +++ b/src/test/java/org/hobbit/sdk/DummyBenchmarkTestRunner.java @@ -175,6 +175,7 @@ private void checkHealth(Boolean dockerize) throws Exception { rabbitMqDockerizer.stop(); Assert.assertFalse(componentsExecutor.anyExceptions()); + Assert.assertFalse(commandQueueListener.anyExceptions()); } public static Model createBenchmarkParameters() throws IOException { From 9a7b26d22e262eaca9a48218be72a3ed90600091 Mon Sep 17 00:00:00 2001 From: Micha Date: Thu, 16 Sep 2021 16:28:12 +0200 Subject: [PATCH 2/2] Fixed a problem in the ComamndReactionsBuilder and the ContainerCommandsReaction classes. After the fix, the cleaned image names are only used for running containers but never for images themselves (including the mapping from image name to component object). Increased the versions of the hobbit controller project and the docker client library. --- .gitignore | 3 +++ pom.xml | 4 ++-- .../utils/commandreactions/CommandReactionsBuilder.java | 9 +++++---- .../commandreactions/ContainerCommandsReaction.java | 4 ++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index be3bf956..e35e1023 100755 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ /*.iml /dependency-reduced-pom.xml /Dockerfile +.classpath +.project +.settings diff --git a/pom.xml b/pom.xml index 5fa56b8c..25f9074a 100755 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ org.hobbit platform-controller - 2.0.5 + 2.0.15 test @@ -101,7 +101,7 @@ com.spotify docker-client - 8.11.7 + 8.16.0 diff --git a/src/main/java/org/hobbit/sdk/utils/commandreactions/CommandReactionsBuilder.java b/src/main/java/org/hobbit/sdk/utils/commandreactions/CommandReactionsBuilder.java index 88b35168..2fa33489 100755 --- a/src/main/java/org/hobbit/sdk/utils/commandreactions/CommandReactionsBuilder.java +++ b/src/main/java/org/hobbit/sdk/utils/commandreactions/CommandReactionsBuilder.java @@ -90,10 +90,11 @@ public CommandReactionsBuilder systemAdapterImageName(String value){ } public CommandReactionsBuilder customContainerImage(Component component, String imageName){ - String[] splitted = imageName.split("/"); - String cleanedImageName=splitted[splitted.length-1].split(":")[0]; - - customContainers.put(cleanedImageName, component); +// String[] splitted = imageName.split("/"); +// String cleanedImageName=splitted[splitted.length-1].split(":")[0]; +// +// customContainers.put(cleanedImageName, component); + customContainers.put(imageName, component); return this; } diff --git a/src/main/java/org/hobbit/sdk/utils/commandreactions/ContainerCommandsReaction.java b/src/main/java/org/hobbit/sdk/utils/commandreactions/ContainerCommandsReaction.java index a4bf17f0..7927be66 100755 --- a/src/main/java/org/hobbit/sdk/utils/commandreactions/ContainerCommandsReaction.java +++ b/src/main/java/org/hobbit/sdk/utils/commandreactions/ContainerCommandsReaction.java @@ -129,8 +129,8 @@ public void handleCmd(Byte command, byte[] bytes, String replyTo) throws Excepti compToSubmit = systemAdapter; containerId = cleanedImageName+"_"+systemContainersCount; systemContainersCount++; - }else if(customContainers.containsKey(cleanedImageName)){ - compToSubmit = customContainers.get(cleanedImageName); + }else if(customContainers.containsKey(startCommandData.image)){ + compToSubmit = customContainers.get(startCommandData.image); int runningCustomContainersCount = (customContainersRunning.containsKey(cleanedImageName)? customContainersRunning.get(cleanedImageName)+1 :0); containerId = cleanedImageName+"_"+runningCustomContainersCount; customContainersRunning.put(cleanedImageName, runningCustomContainersCount);