From 5588d8f9aea8b48247abbadbe806d791658bced3 Mon Sep 17 00:00:00 2001 From: Rene Peinthor Date: Fri, 16 Feb 2024 13:31:42 +0100 Subject: [PATCH] AllLinesParser: Enable draining of stdout If draining isn't enabled, the AllLinesParser and Script timeout, because noone is reading the full output of the process and so the process can't finish and will timeout. This was noticed while `drbdsetup events --now` was writing around 1200 lines into stdout and always hang in a timeout. --- .../com/cloud/utils/script/OutputInterpreter.java | 5 +++++ .../src/test/java/com/cloud/utils/ScriptTest.java | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/utils/src/main/java/com/cloud/utils/script/OutputInterpreter.java b/utils/src/main/java/com/cloud/utils/script/OutputInterpreter.java index 03a9f5482364..d54d411e69ea 100644 --- a/utils/src/main/java/com/cloud/utils/script/OutputInterpreter.java +++ b/utils/src/main/java/com/cloud/utils/script/OutputInterpreter.java @@ -137,6 +137,11 @@ public String interpret(BufferedReader reader) throws IOException { public String getLines() { return allLines; } + + @Override + public boolean drain() { + return true; + } } public static class LineByLineOutputLogger extends OutputInterpreter { diff --git a/utils/src/test/java/com/cloud/utils/ScriptTest.java b/utils/src/test/java/com/cloud/utils/ScriptTest.java index 12963dc26378..e624ffc5e7fc 100644 --- a/utils/src/test/java/com/cloud/utils/ScriptTest.java +++ b/utils/src/test/java/com/cloud/utils/ScriptTest.java @@ -111,6 +111,20 @@ public String interpret(BufferedReader reader) throws IOException { Assert.assertNotNull(value); } + @Test + public void executeWithOutputInterpreterAllLinesParserLargeOutput() { + Assume.assumeTrue(SystemUtils.IS_OS_LINUX); + OutputInterpreter.AllLinesParser parser = new OutputInterpreter.AllLinesParser(); + Script script = new Script("seq"); + script.add("-f"); + script.add("my text to test cloudstack %g"); + script.add("4096"); // AllLinesParser doesn't work with that amount of data + String value = script.execute(parser); + // it is a stack trace in this case as string + Assert.assertNull(value); + Assert.assertEquals(129965, parser.getLines().length()); + } + @Test public void runSimpleBashScriptNotExisting() { Assume.assumeTrue(SystemUtils.IS_OS_LINUX);