From b07f824fe45c5cea498c7170488b793c1f66e721 Mon Sep 17 00:00:00 2001 From: Stephane Gamard Date: Mon, 21 Jul 2014 14:37:37 +0200 Subject: [PATCH] SONAR-5410 - Fixed process hang when child fails to start --- .../main/java/org/sonar/process/Monitor.java | 4 ++- .../main/java/org/sonar/process/Process.java | 3 ++- .../org/sonar/process/ProcessWrapper.java | 2 -- .../java/org/sonar/start/StartServer.java | 27 +++++++++++-------- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/server/sonar-process/src/main/java/org/sonar/process/Monitor.java b/server/sonar-process/src/main/java/org/sonar/process/Monitor.java index d321bce9dcb..a01a49e1745 100644 --- a/server/sonar-process/src/main/java/org/sonar/process/Monitor.java +++ b/server/sonar-process/src/main/java/org/sonar/process/Monitor.java @@ -102,7 +102,9 @@ public class Monitor extends Thread { try { Thread.sleep(1000); } catch (InterruptedException e) { - e.printStackTrace(); + LOGGER.warn("Monitoring thread has been interrupted. Closing"); + watch.cancel(true); + monitor.shutdownNow(); } } watch.cancel(true); diff --git a/server/sonar-process/src/main/java/org/sonar/process/Process.java b/server/sonar-process/src/main/java/org/sonar/process/Process.java index a18809168c6..045a5dcd0b9 100644 --- a/server/sonar-process/src/main/java/org/sonar/process/Process.java +++ b/server/sonar-process/src/main/java/org/sonar/process/Process.java @@ -129,6 +129,7 @@ public abstract class Process implements ProcessMXBean { throw new IllegalStateException("Process is not a compliant MBean", e); } + shutdownHook = new Thread(new Runnable() { @Override public void run() { @@ -183,7 +184,7 @@ public abstract class Process implements ProcessMXBean { try { shutdownHook.join(); } catch (InterruptedException e) { - e.printStackTrace(); + System.exit(-1); } } LOGGER.trace("Process[{}]::terminate() END", name); diff --git a/server/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java b/server/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java index 6a892569d74..2ec28711b70 100644 --- a/server/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java +++ b/server/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java @@ -254,8 +254,6 @@ public class ProcessWrapper extends Thread { if (this.processMXBean != null) { this.processMXBean.terminate(); waitUntilFinish(this); - } else { - process.destroy(); } } diff --git a/sonar-start/src/main/java/org/sonar/start/StartServer.java b/sonar-start/src/main/java/org/sonar/start/StartServer.java index 0723111fea8..0f4c555ad84 100644 --- a/sonar-start/src/main/java/org/sonar/start/StartServer.java +++ b/sonar-start/src/main/java/org/sonar/start/StartServer.java @@ -65,25 +65,30 @@ public final class StartServer { shutdownHook = new Thread(new Runnable() { @Override public void run() { - stop(); + LOGGER.info("Shutting down all node services"); + monitor.interrupt(); + terminateAndWait(elasticsearch); + terminateAndWait(sonarqube); } }); Runtime.getRuntime().addShutdownHook(shutdownHook); } - public void shutdown() { + public void stop(boolean waitForCompletion) { Runtime.getRuntime().removeShutdownHook(shutdownHook); - this.stop(); + shutdownHook.start(); + if (waitForCompletion) { + try { + shutdownHook.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } public void stop() { - LOGGER.info("Shutting down all node services"); - terminateAndWait(elasticsearch); - terminateAndWait(sonarqube); - - //TODO should not have to explicitly exit... - System.exit(1); + stop(false); } private void terminateAndWait(ProcessWrapper process) { @@ -140,7 +145,7 @@ public final class StartServer { try { monitor.join(); } catch (InterruptedException e) { - e.printStackTrace(); + this.stop(true); } // Start SQ @@ -160,7 +165,7 @@ public final class StartServer { // } catch (InterruptedException e) { // LOGGER.warn("Shutting down the node..."); // } - shutdown(); + this.stop(true); } -- 2.39.5