From 808d62d1616d2d33a1449d6d6e3791c92cbcbaf6 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Thu, 20 May 2021 14:23:27 +0200 Subject: [PATCH] Make sure the IpClient does not block forever when something wrong happens --- .../org/mvndaemon/mvnd/sync/IpcClient.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/sync/src/main/java/org/mvndaemon/mvnd/sync/IpcClient.java b/sync/src/main/java/org/mvndaemon/mvnd/sync/IpcClient.java index 2fb4c93f..7fb71856 100644 --- a/sync/src/main/java/org/mvndaemon/mvnd/sync/IpcClient.java +++ b/sync/src/main/java/org/mvndaemon/mvnd/sync/IpcClient.java @@ -39,7 +39,8 @@ import java.util.Random; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; -import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -144,18 +145,28 @@ public class IpcClient { .redirectError(discard) .start(); - Future future = ForkJoinPool.commonPool().submit(() -> { + ExecutorService es = Executors.newSingleThreadExecutor(); + Future future = es.submit(() -> { Socket s = ss.accept(); DataInputStream dis = new DataInputStream(s.getInputStream()); int rand2 = dis.readInt(); int port2 = dis.readInt(); return new int[] { rand2, port2 }; }); - int[] res = future.get(5, TimeUnit.SECONDS); + int[] res; + try { + res = future.get(5, TimeUnit.SECONDS); + } catch (Exception e) { + process.destroyForcibly(); + throw e; + } finally { + es.shutdownNow(); + ss.close(); + } if (rand != res[0]) { process.destroyForcibly(); + throw new IllegalStateException("IpcServer did not respond with the correct random"); } - ss.close(); int port = res[1]; Socket socket = new Socket();