From 37c35a97bed6030a1b6c1265e5e556b1e9232dfc Mon Sep 17 00:00:00 2001 From: Roman Isbrecht Date: Mon, 19 Jun 2023 13:17:50 +0200 Subject: [PATCH 1/6] Add --write-log-retry-count option This option allows the consumer to define how often the write loop will retry writing to the provided output stream instead of having a hardcoded default which in some cases is not sufficient enough. --- .../runner/bootstrap/commands/PipelineRunOptions.java | 4 ++++ .../src/main/java/io/jenkins/jenkinsfile/runner/Runner.java | 6 ++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java index c277cd14..75446d4b 100644 --- a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java +++ b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java @@ -75,4 +75,8 @@ public class PipelineRunOptions extends PipelineOptions { description = "Disable writing build logs to stdout. " + "Plugins that handle build logs will process them as usual") public boolean noBuildLogs = false; + + @CommandLine.Option(names = { "-wlrc", "--write-log-retry-count" }, + description = "Retry count for writing logs to output stream.") + public int writeLogRetryCount = 10; } diff --git a/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java b/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java index 4883ba9b..51394353 100644 --- a/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java +++ b/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java @@ -119,7 +119,7 @@ public int run(PipelineRunOptions runOptions) throws Exception { b = f.getStartCondition().get(); if (!runOptions.noBuildLogs) { - writeLogTo(System.out); + writeLogTo(System.out, runOptions.writeLogRetryCount); } f.get(); // wait for the completion @@ -156,9 +156,7 @@ private CauseAction createCauseAction(String cause) { return new CauseAction(c); } - private void writeLogTo(PrintStream out) throws IOException, InterruptedException { - final int retryCnt = 10; - + private void writeLogTo(PrintStream out, int retryCnt) throws IOException, InterruptedException { // read output in a retry loop, by default try only once // writeWholeLogTo may fail with FileNotFound // exception on a slow/busy machine, if it takes From 8d4afe20e5612dbd5c13678a8aafe5ba933d4b73 Mon Sep 17 00:00:00 2001 From: Sergey Yurevich Date: Wed, 21 Jun 2023 17:04:17 +0000 Subject: [PATCH 2/6] Replace retry counter by duration --- .../bootstrap/commands/PipelineRunOptions.java | 6 +++--- .../java/io/jenkins/jenkinsfile/runner/Runner.java | 13 +++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java index 75446d4b..897e0cc1 100644 --- a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java +++ b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java @@ -76,7 +76,7 @@ public class PipelineRunOptions extends PipelineOptions { "Plugins that handle build logs will process them as usual") public boolean noBuildLogs = false; - @CommandLine.Option(names = { "-wlrc", "--write-log-retry-count" }, - description = "Retry count for writing logs to output stream.") - public int writeLogRetryCount = 10; + @CommandLine.Option(names = { "-wlrd", "--write-log-retry-duration" }, + description = "Duration in seconds to retry writing logs to output stream.") + public int writeLogRetryDuration = 60; } diff --git a/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java b/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java index 51394353..0c7fd636 100644 --- a/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java +++ b/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java @@ -119,7 +119,7 @@ public int run(PipelineRunOptions runOptions) throws Exception { b = f.getStartCondition().get(); if (!runOptions.noBuildLogs) { - writeLogTo(System.out, runOptions.writeLogRetryCount); + writeLogTo(System.out, runOptions.writeLogRetryDuration); } f.get(); // wait for the completion @@ -156,22 +156,23 @@ private CauseAction createCauseAction(String cause) { return new CauseAction(c); } - private void writeLogTo(PrintStream out, int retryCnt) throws IOException, InterruptedException { - // read output in a retry loop, by default try only once + private void writeLogTo(PrintStream out, int retryDuration) throws IOException, InterruptedException { + // read output in a retry loop, // writeWholeLogTo may fail with FileNotFound // exception on a slow/busy machine, if it takes // longish to create the log file int retryInterval = 100; - for (int i=0;i<=retryCnt;) { + long durationMillis = retryDuration * 1000; + long startTime = System.currentTimeMillis(); + while (true) { try { b.writeWholeLogTo(out); break; } catch (FileNotFoundException | NoSuchFileException e) { - if ( i == retryCnt ) { + if ( System.currentTimeMillis() - startTime > durationMillis ) { throw e; } - i++; Thread.sleep(retryInterval); } } From 707e44efd660b2b85caea8255147ac16b2c9f505 Mon Sep 17 00:00:00 2001 From: Sergey Yurevich Date: Mon, 26 Jun 2023 10:08:32 +0000 Subject: [PATCH 3/6] Set default to 1sec and improve description. --- .../runner/bootstrap/commands/PipelineRunOptions.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java index 897e0cc1..74d95647 100644 --- a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java +++ b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java @@ -77,6 +77,7 @@ public class PipelineRunOptions extends PipelineOptions { public boolean noBuildLogs = false; @CommandLine.Option(names = { "-wlrd", "--write-log-retry-duration" }, - description = "Duration in seconds to retry writing logs to output stream.") - public int writeLogRetryDuration = 60; + description = "Initializing build log forwarding to stdout may fail if the build log has not been created yet. This option sets an overall duration in seconds for retries. A delay between retries is 100ms. +Duration in seconds to retry writing logs to output stream.") + public int writeLogRetryDuration = 1; } From 512f3f0e2ca56a10d1b4ceb49ccc96406ad992e4 Mon Sep 17 00:00:00 2001 From: Sergey Yurevich Date: Mon, 26 Jun 2023 10:53:27 +0000 Subject: [PATCH 4/6] Fix description --- .../runner/bootstrap/commands/PipelineRunOptions.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java index 74d95647..3ac3b096 100644 --- a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java +++ b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java @@ -77,7 +77,7 @@ public class PipelineRunOptions extends PipelineOptions { public boolean noBuildLogs = false; @CommandLine.Option(names = { "-wlrd", "--write-log-retry-duration" }, - description = "Initializing build log forwarding to stdout may fail if the build log has not been created yet. This option sets an overall duration in seconds for retries. A delay between retries is 100ms. -Duration in seconds to retry writing logs to output stream.") + description = "Initializing build log forwarding to stdout may fail if the build log has not been created yet. " + + "This option sets an overall duration in seconds for retries. A delay between retries is 100ms") public int writeLogRetryDuration = 1; } From 1354cecc028e4169730de860da633667527166a3 Mon Sep 17 00:00:00 2001 From: Sergey Yurevich <67111083+syurevich@users.noreply.github.com> Date: Wed, 28 Jun 2023 11:18:40 +0200 Subject: [PATCH 5/6] Change option name and update description Co-authored-by: Andreas Brehmer <38314220+anbrsap@users.noreply.github.com> --- .../runner/bootstrap/commands/PipelineRunOptions.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java index 3ac3b096..71fbdee0 100644 --- a/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java +++ b/bootstrap/src/main/java/io/jenkins/jenkinsfile/runner/bootstrap/commands/PipelineRunOptions.java @@ -76,8 +76,9 @@ public class PipelineRunOptions extends PipelineOptions { "Plugins that handle build logs will process them as usual") public boolean noBuildLogs = false; - @CommandLine.Option(names = { "-wlrd", "--write-log-retry-duration" }, + @CommandLine.Option(names = { "-wlit", "--write-log-init-timeout" }, description = "Initializing build log forwarding to stdout may fail if the build log has not been created yet. " + - "This option sets an overall duration in seconds for retries. A delay between retries is 100ms") - public int writeLogRetryDuration = 1; + " This option defines the maximum time (in seconds) to wait for build log creation." + + " Defaults to 1 second.") + public int writeLogInitTimeoutSeconds = 1; } From c5eec753719fa374b740067da2d1ed9304ac0a63 Mon Sep 17 00:00:00 2001 From: Sergey Yurevich Date: Wed, 28 Jun 2023 09:27:20 +0000 Subject: [PATCH 6/6] Use renamed option in Runner.java --- .../main/java/io/jenkins/jenkinsfile/runner/Runner.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java b/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java index 0c7fd636..90bcf093 100644 --- a/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java +++ b/payload/src/main/java/io/jenkins/jenkinsfile/runner/Runner.java @@ -119,7 +119,7 @@ public int run(PipelineRunOptions runOptions) throws Exception { b = f.getStartCondition().get(); if (!runOptions.noBuildLogs) { - writeLogTo(System.out, runOptions.writeLogRetryDuration); + writeLogTo(System.out, runOptions.writeLogInitTimeoutSeconds); } f.get(); // wait for the completion @@ -156,13 +156,13 @@ private CauseAction createCauseAction(String cause) { return new CauseAction(c); } - private void writeLogTo(PrintStream out, int retryDuration) throws IOException, InterruptedException { + private void writeLogTo(PrintStream out, int timeoutSeconds) throws IOException, InterruptedException { // read output in a retry loop, // writeWholeLogTo may fail with FileNotFound // exception on a slow/busy machine, if it takes // longish to create the log file int retryInterval = 100; - long durationMillis = retryDuration * 1000; + long timeoutMillis = timeoutSeconds * 1000; long startTime = System.currentTimeMillis(); while (true) { try { @@ -170,7 +170,7 @@ private void writeLogTo(PrintStream out, int retryDuration) throws IOException, break; } catch (FileNotFoundException | NoSuchFileException e) { - if ( System.currentTimeMillis() - startTime > durationMillis ) { + if ( System.currentTimeMillis() - startTime > timeoutMillis ) { throw e; } Thread.sleep(retryInterval);