]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4898 - Fixed hangs when exiting after a failure.
authorStephane Gamard <stephane.gamard@searchbox.com>
Thu, 24 Jul 2014 16:28:42 +0000 (18:28 +0200)
committerStephane Gamard <stephane.gamard@searchbox.com>
Thu, 24 Jul 2014 16:40:05 +0000 (18:40 +0200)
server/sonar-process/src/main/java/org/sonar/process/Monitor.java
server/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java
sonar-application/src/main/java/org/sonar/application/App.java

index 5339226c444286618a180cf1c6acb81bb6621ef3..75fd0ef8200735217071692d31f20f191704b15e 100644 (file)
@@ -40,14 +40,16 @@ public class Monitor extends Thread {
   private volatile List<ProcessWrapper> processes;
   private volatile Map<String, Long> pings;
 
+  private ProcessWatch processWatch;
   private ScheduledFuture<?> watch;
-  private final ScheduledExecutorService monitor;
+  private ScheduledExecutorService monitor;
 
   public Monitor() {
     processes = new ArrayList<ProcessWrapper>();
     pings = new HashMap<String, Long>();
     monitor = Executors.newScheduledThreadPool(1);
-    watch = monitor.scheduleWithFixedDelay(new ProcessWatch(), 0, 3, TimeUnit.SECONDS);
+    processWatch = new ProcessWatch();
+    watch = monitor.scheduleWithFixedDelay(processWatch, 0, 3, TimeUnit.SECONDS);
   }
 
   public void registerProcess(ProcessWrapper processWrapper) {
@@ -69,9 +71,11 @@ public class Monitor extends Thread {
     public void run() {
       for (ProcessWrapper process : processes) {
         try {
-          long time = process.getProcessMXBean().ping();
-          LOGGER.debug("PINGED '{}'", process.getName());
-          pings.put(process.getName(), time);
+          if (process.getProcessMXBean() != null) {
+            long time = process.getProcessMXBean().ping();
+            LOGGER.debug("PINGED '{}'", process.getName());
+            pings.put(process.getName(), time);
+          }
         } catch (Exception e) {
           LOGGER.error("Error while pinging {}", process.getName(), e);
         }
@@ -85,24 +89,30 @@ public class Monitor extends Thread {
   }
 
   public void run() {
-    boolean everythingOK = true;
     try {
-      while (everythingOK) {
+      while (true) {
         for (ProcessWrapper process : processes) {
           if (!processIsValid(process)) {
             LOGGER.warn("Monitor::run() -- Process '{}' is not valid. Exiting monitor", process.getName());
-            everythingOK = false;
-            break;
+            this.interrupt();
           }
         }
         Thread.sleep(3000L);
       }
-
     } catch (InterruptedException e) {
-      LOGGER.info("Monitoring thread is interrupted.");
+      LOGGER.debug("Monitoring thread is interrupted.");
     } finally {
-      watch.cancel(true);
+      terminate();
+    }
+  }
+
+  public void terminate() {
+    if (monitor != null) {
       monitor.shutdownNow();
+      watch.cancel(true);
+      watch = null;
+      processWatch = null;
     }
   }
+
 }
index 24568612d7c38b2a2e0e65d7dffa9a1720b1b0f5..263e3c6c242cf36ee7f8af14f8424ae5fce8c6a8 100644 (file)
@@ -31,7 +31,6 @@ import javax.management.MBeanServerConnection;
 import javax.management.remote.JMXConnector;
 import javax.management.remote.JMXConnectorFactory;
 import javax.management.remote.JMXServiceURL;
-
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -155,6 +154,7 @@ public class ProcessWrapper extends Thread {
       waitUntilFinish(errorGobbler);
       closeStreams(process);
       FileUtils.deleteQuietly(propertiesFile);
+      processMXBean = null;
     }
     LOGGER.trace("ProcessWrapper::run() END");
   }
@@ -254,7 +254,12 @@ public class ProcessWrapper extends Thread {
   public void terminate() {
     if (processMXBean != null) {
       processMXBean.terminate();
-      this.interrupt();
+      try {
+        this.join();
+      } catch (InterruptedException e) {
+        // ignore
+      }
+      processMXBean = null;
     }
   }
 
index f80d2591a5f18f549067e06158a0b983eafce5c0..a2b63eab3e8fc8deb213bee892b126fd0cb44935 100644 (file)
@@ -26,12 +26,10 @@ import org.sonar.process.Process;
 import org.sonar.process.ProcessMXBean;
 import org.sonar.process.ProcessWrapper;
 
-import javax.annotation.Nullable;
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.MBeanRegistrationException;
 import javax.management.MBeanServer;
 import javax.management.NotCompliantMBeanException;
-
 import java.lang.management.ManagementFactory;
 
 public class App implements ProcessMXBean {
@@ -114,6 +112,7 @@ public class App implements ProcessMXBean {
       // TODO ignore ?
 
     } finally {
+      LOGGER.debug("Closing App because monitor is gone.");
       terminate();
     }
   }
@@ -125,20 +124,8 @@ public class App implements ProcessMXBean {
       logger.info("Shutting down server");
       monitor.interrupt();
       monitor = null;
-      terminateAndWait(elasticsearch);
-      terminateAndWait(server);
-    }
-
-  }
-
-  private void terminateAndWait(@Nullable ProcessWrapper process) {
-    if (process != null) {
-      process.terminate();
-      try {
-        process.join();
-      } catch (InterruptedException e) {
-        LOGGER.warn("Process '{}' did not gracefully shutdown.", process.getName());
-      }
+      elasticsearch.terminate();
+      server.terminate();
     }
   }