From 09e5a70bfb0a9f0d709e481e47de3ecfbd14d54c Mon Sep 17 00:00:00 2001 From: Marco Collovati Date: Wed, 11 Sep 2024 09:07:29 +0200 Subject: [PATCH] fix: wait for output reading to complete before parsing version (#19921) NodeInstall.getVersion currently does not block waiting for STDOUT and STDERR to be read completely. This causes random failure during node installation because of forcing an empty version. This change waits for future to complete before parsing the version value. --- .../server/frontend/installer/NodeInstaller.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/flow-server/src/main/java/com/vaadin/flow/server/frontend/installer/NodeInstaller.java b/flow-server/src/main/java/com/vaadin/flow/server/frontend/installer/NodeInstaller.java index b94cd955b0c..ce7c546b48a 100644 --- a/flow-server/src/main/java/com/vaadin/flow/server/frontend/installer/NodeInstaller.java +++ b/flow-server/src/main/java/com/vaadin/flow/server/frontend/installer/NodeInstaller.java @@ -26,6 +26,9 @@ import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; @@ -559,8 +562,14 @@ private static FrontendVersion getVersion(String tool, throw new IOException("Process exited with non 0 exit code. (" + exitCode + ")"); } - return FrontendUtils.parseFrontendVersion( - streamConsumer.getNow(new Pair<>("", "")).getFirst()); + String version; + try { + version = streamConsumer.get(1, TimeUnit.SECONDS).getFirst(); + } catch (ExecutionException | TimeoutException e) { + getLogger().debug("Cannot read {} version", tool, e); + version = ""; + } + return FrontendUtils.parseFrontendVersion(version); } catch (InterruptedException | IOException e) { throw new InstallationException(String.format( "Unable to detect version of %s. %s", tool,