From bad215d7a92f3d07872e014c0aa85efbfb1f6618 Mon Sep 17 00:00:00 2001 From: Stan Brubaker <120737309+stanbrub@users.noreply.github.com> Date: Thu, 13 Jul 2023 13:31:16 -0600 Subject: [PATCH] Improved Docker Restart Time Between Benchmarks (#148) --- .../experimental/ExperimentalTestRunner.java | 3 +- .../mergescale/ScaleTestRunner.java | 2 +- .../tests/standard/StandardTestRunner.java | 2 +- .../tests/standard/kafka/KafkaTestRunner.java | 5 +- .../standard/parquet/ParquetTestSetup.java | 2 +- .../io/deephaven/benchmark/util/Exec.java | 48 +++++++++++++------ 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/it/java/io/deephaven/benchmark/tests/experimental/ExperimentalTestRunner.java b/src/it/java/io/deephaven/benchmark/tests/experimental/ExperimentalTestRunner.java index eb469caa..7a48f545 100644 --- a/src/it/java/io/deephaven/benchmark/tests/experimental/ExperimentalTestRunner.java +++ b/src/it/java/io/deephaven/benchmark/tests/experimental/ExperimentalTestRunner.java @@ -231,7 +231,8 @@ String listStr(String... values) { void restartDocker(Bench api) { var dockerComposeFile = api.property("docker.compose.file", ""); - Exec.restartDocker(dockerComposeFile); + var deephavenHostPort = api.property("deephaven.addr", ""); + Exec.restartDocker(dockerComposeFile, deephavenHostPort); } void generateQuotesTable(long rowCount) { diff --git a/src/it/java/io/deephaven/benchmark/tests/experimental/mergescale/ScaleTestRunner.java b/src/it/java/io/deephaven/benchmark/tests/experimental/mergescale/ScaleTestRunner.java index aac58700..24797726 100644 --- a/src/it/java/io/deephaven/benchmark/tests/experimental/mergescale/ScaleTestRunner.java +++ b/src/it/java/io/deephaven/benchmark/tests/experimental/mergescale/ScaleTestRunner.java @@ -82,7 +82,7 @@ void runTest(String testName, String tableName, long baseRowCount, long rowCount void restartDocker(Bench api) { var timer = api.timer(); - if (!Exec.restartDocker(api.property("docker.compose.file", ""))) + if (!Exec.restartDocker(api.property("docker.compose.file", ""), api.property("deephaven.addr", ""))) return; var metrics = new Metrics(Timer.now(), "test-runner", "setup", "docker"); metrics.set("restart", timer.duration().toMillis(), "standard"); diff --git a/src/it/java/io/deephaven/benchmark/tests/standard/StandardTestRunner.java b/src/it/java/io/deephaven/benchmark/tests/standard/StandardTestRunner.java index fdcb847e..0d5d8d47 100644 --- a/src/it/java/io/deephaven/benchmark/tests/standard/StandardTestRunner.java +++ b/src/it/java/io/deephaven/benchmark/tests/standard/StandardTestRunner.java @@ -279,7 +279,7 @@ Bench initialize(Object testInst) { void restartDocker(Bench api) { var timer = api.timer(); - if (!Exec.restartDocker(api.property("docker.compose.file", ""))) + if (!Exec.restartDocker(api.property("docker.compose.file", ""), api.property("deephaven.addr", ""))) return; var metrics = new Metrics(Timer.now(), "test-runner", "setup", "docker"); metrics.set("restart", timer.duration().toMillis(), "standard"); diff --git a/src/it/java/io/deephaven/benchmark/tests/standard/kafka/KafkaTestRunner.java b/src/it/java/io/deephaven/benchmark/tests/standard/kafka/KafkaTestRunner.java index f138288f..5a99f3a8 100644 --- a/src/it/java/io/deephaven/benchmark/tests/standard/kafka/KafkaTestRunner.java +++ b/src/it/java/io/deephaven/benchmark/tests/standard/kafka/KafkaTestRunner.java @@ -181,11 +181,12 @@ private String getResultTableSize(String operation) { private void restartDocker(Bench api, int heapGigs) { String dockerComposeFile = api.property("docker.compose.file", ""); - if (dockerComposeFile.isBlank()) + String deephavenHostPort = api.property("deephaven.addr", ""); + if (dockerComposeFile.isBlank() || deephavenHostPort.isBlank()) return; dockerComposeFile = makeHeapAdjustedDockerCompose(dockerComposeFile, heapGigs); var timer = api.timer(); - Exec.restartDocker(dockerComposeFile); + Exec.restartDocker(dockerComposeFile, deephavenHostPort); var metrics = new Metrics(Timer.now(), "test-runner", "setup", "docker"); metrics.set("restart", timer.duration().toMillis(), "standard"); api.metrics().add(metrics); diff --git a/src/it/java/io/deephaven/benchmark/tests/standard/parquet/ParquetTestSetup.java b/src/it/java/io/deephaven/benchmark/tests/standard/parquet/ParquetTestSetup.java index 466b957d..a2ca3d12 100644 --- a/src/it/java/io/deephaven/benchmark/tests/standard/parquet/ParquetTestSetup.java +++ b/src/it/java/io/deephaven/benchmark/tests/standard/parquet/ParquetTestSetup.java @@ -38,7 +38,7 @@ Bench initialize(Object testInst) { void restartDocker(Bench api) { var timer = api.timer(); - if (!Exec.restartDocker(api.property("docker.compose.file", ""))) + if (!Exec.restartDocker(api.property("docker.compose.file", ""), api.property("deephaven.addr", ""))) return; var metrics = new Metrics(Timer.now(), "test-runner", "setup", "docker"); metrics.set("restart", timer.duration().toMillis(), "standard"); diff --git a/src/main/java/io/deephaven/benchmark/util/Exec.java b/src/main/java/io/deephaven/benchmark/util/Exec.java index d75a1342..f5379058 100644 --- a/src/main/java/io/deephaven/benchmark/util/Exec.java +++ b/src/main/java/io/deephaven/benchmark/util/Exec.java @@ -1,29 +1,35 @@ /* Copyright (c) 2022-2023 Deephaven Data Labs and Patent Pending */ package io.deephaven.benchmark.util; -import java.io.*; +import java.net.*; import java.util.concurrent.TimeUnit; /** * Utils for executing processes from the command line. *
- * Note: No effort has been made to make this secure or prevent any horror.ss + * Note: No effort has been made to make this secure */ public class Exec { /** - * Restart a docker container usingdocker compose
. If the given compose file is blank skip.
+ * Restart a docker container using docker compose
. If the given compose file property is blank skip.
*
* @param dockerComposeFile the path to the relevant docker-compose.yml
+ * @param deephavenHostPort the host:port of the Deephaven service
* @return true if attempted docker restart, otherwise false
*/
- static public boolean restartDocker(String dockerComposeFile) {
- if (dockerComposeFile.isBlank())
+ static public boolean restartDocker(String dockerComposeFile, String deephavenHostPort) {
+ if (dockerComposeFile.isBlank() || deephavenHostPort.isBlank())
return false;
- exec("sudo docker compose -f " + dockerComposeFile + " down");
- Threads.sleep(1000);
+ exec("sudo docker compose -f " + dockerComposeFile + " down --timeout 0");
exec("sudo docker compose -f " + dockerComposeFile + " up -d");
- Threads.sleep(3000);
- return true;
+ long beginTime = System.currentTimeMillis();
+ while (System.currentTimeMillis() - beginTime < 10000) {
+ var status = getUrlStatus("http://" + deephavenHostPort + "/ide/");
+ if (status)
+ return true;
+ Threads.sleep(100);
+ }
+ return false;
}
/**
@@ -46,12 +52,24 @@ static public int exec(String command) {
}
}
- static String copyToString(InputStream input) throws Exception {
- var out = new StringWriter();
- try (InputStream in = input) {
- for (int i = 0; i < in.available(); i++)
- out.write(in.read());
- return out.toString();
+ static boolean getUrlStatus(String uri) {
+ var url = createUrl(uri);
+ try {
+ var connect = url.openConnection();
+ if (!(connect instanceof HttpURLConnection))
+ return false;
+ var code = ((HttpURLConnection) connect).getResponseCode();
+ return (code == 200);
+ } catch (Exception ex) {
+ return false;
+ }
+ }
+
+ static URL createUrl(String uri) {
+ try {
+ return new URL(uri);
+ } catch (MalformedURLException e) {
+ throw new RuntimeException("Bad URL: " + uri);
}
}