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 using docker 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); } }