From 8b08398b19b3f5da7ab3915dc62ebe9871f95b84 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 28 Apr 2022 13:03:06 -0400 Subject: [PATCH] Allowing `FilePathDynamicContext` to block waiting for an agent to reconnect. Not great since the CPS VM thread will only grant 5s. Better would be to avoid unnecessary use of `StepContext.get(FilePath.class)` (which implicitly requires a live `Channel`); perhaps `FilePathRepresentation` should become an API. Amends b65ff1cd10a77700c017ac5bf660b75de1eb8c56. https://github.com/jenkinsci/workflow-durable-task-step-plugin/pull/180#issuecomment-1112413559 --- .../support/steps/FilePathDynamicContext.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/workflow/support/steps/FilePathDynamicContext.java b/src/main/java/org/jenkinsci/plugins/workflow/support/steps/FilePathDynamicContext.java index 8f4d6cef..14b1fa6b 100644 --- a/src/main/java/org/jenkinsci/plugins/workflow/support/steps/FilePathDynamicContext.java +++ b/src/main/java/org/jenkinsci/plugins/workflow/support/steps/FilePathDynamicContext.java @@ -62,24 +62,27 @@ FilePath f = FilePathUtils.find(r.slave, r.path); if (f != null) { LOGGER.log(Level.FINE, "serving {0}:{1}", new Object[] {r.slave, r.path}); + return f; } else { - IOException e = new IOException("Unable to create live FilePath for " + r.slave); Computer c = Jenkins.get().getComputer(r.slave); - if (c != null) { + if (c != null && !c.isConnecting()) { + IOException e = new IOException("Unable to create live FilePath for " + r.slave); for (Computer.TerminationRequest tr : c.getTerminatedBy()) { e.addSuppressed(tr); } - } - TaskListener listener = context.get(TaskListener.class); - if (listener != null) { - OfflineCause oc = c.getOfflineCause(); - if (oc != null) { - listener.getLogger().println(c.getDisplayName() + " was marked offline: " + oc); + TaskListener listener = context.get(TaskListener.class); + if (listener != null) { + OfflineCause oc = c.getOfflineCause(); + if (oc != null) { + listener.getLogger().println(c.getDisplayName() + " was marked offline: " + oc); + } } + throw e; } - throw e; + LOGGER.fine(() -> "Waiting to see if " + r.slave + " will come online"); + Thread.sleep(500); + return get(context); } - return f; } /**