]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4898 try to fix ping monitoring
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 28 Aug 2014 14:02:35 +0000 (16:02 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 28 Aug 2014 14:02:35 +0000 (16:02 +0200)
Sometimes child autokills because it did not receive pings in the last 30 seconds. I hope it comes from the parent process that is slow to start monitoring (send pings).

server/process/sonar-process/src/main/java/org/sonar/process/Monitor.java
server/process/sonar-process/src/main/java/org/sonar/process/MonitoredProcess.java
server/process/sonar-process/src/test/java/org/sonar/process/MonitorTestBase.java
sonar-application/src/main/java/org/sonar/application/App.java

index 1fe64d65ba0fc0d7b7bf31f20227efaa62a9b96f..0068992b3f03121d00ca2f0671af1fd7698cba2b 100644 (file)
@@ -22,8 +22,8 @@ package org.sonar.process;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
@@ -36,7 +36,7 @@ public class Monitor extends Thread implements Terminable {
   private static final long PING_DELAY_MS = 3000L;
 
   private long pingDelayMs = PING_DELAY_MS;
-  private volatile List<ProcessWrapper> processes;
+  private final List<ProcessWrapper> processes = new CopyOnWriteArrayList<ProcessWrapper>();
   private final ScheduledFuture<?> watch;
   private final ScheduledExecutorService monitorExecutionService;
 
@@ -45,7 +45,6 @@ public class Monitor extends Thread implements Terminable {
    */
   public Monitor() {
     super("Process Monitor");
-    processes = new ArrayList<ProcessWrapper>();
     monitorExecutionService = Executors.newScheduledThreadPool(1);
     watch = monitorExecutionService.scheduleAtFixedRate(new ProcessWatch(), 0L, getPingDelayMs(), TimeUnit.MILLISECONDS);
   }
@@ -84,13 +83,11 @@ public class Monitor extends Thread implements Terminable {
   /**
    * Registers and monitors process. Note that process is probably not ready yet.
    */
-  public void registerProcess(ProcessWrapper process) throws InterruptedException {
-    LOGGER.info("Registering process[{}] for monitoring.", process.getName());
-    synchronized (processes) {
-      processes.add(process);
-    }
+  public void monitor(ProcessWrapper process) throws InterruptedException {
+    LOGGER.info("Monitoring process[{}]", process.getName());
     // starts a monitoring thread
     process.start();
+    processes.add(process);
   }
 
   /**
@@ -102,19 +99,17 @@ public class Monitor extends Thread implements Terminable {
     try {
       boolean ok = true;
       while (isRunning && ok) {
-        synchronized (processes) {
-          LOGGER.debug("Monitoring {} processes.", processes.size());
-          for (ProcessWrapper process : processes) {
-            if (!ProcessUtils.isAlive(process.process())) {
-              LOGGER.info("{} is down, stopping all other processes", process.getName());
-              ok = false;
-              interrupt();
-            }
+        LOGGER.debug("Monitoring {} processes.", processes.size());
+        for (ProcessWrapper process : processes) {
+          if (!ProcessUtils.isAlive(process.process())) {
+            LOGGER.info("{} is down, stopping all other processes", process.getName());
+            ok = false;
+            interrupt();
           }
         }
-        if (ok) {
-          Thread.sleep(PING_DELAY_MS);
-        }
+      }
+      if (ok) {
+        Thread.sleep(PING_DELAY_MS);
       }
     } catch (InterruptedException e) {
       LOGGER.debug("Monitoring thread is interrupted");
@@ -150,7 +145,7 @@ public class Monitor extends Thread implements Terminable {
         this.join();
       }
     } catch (InterruptedException e) {
-      //Expected to be interrupted :)
+      // Expected to be interrupted :)
     }
   }
 }
index c36df449b9e0321c7322eb3e71fcaf36ed6a9719..f6a69834710708bded7db02269d81e4c649d9418 100644 (file)
@@ -31,7 +31,7 @@ public abstract class MonitoredProcess implements ProcessMXBean {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(MonitoredProcess.class);
 
-  private static final long AUTOKILL_TIMEOUT_MS = 30000L;
+  private static final long AUTOKILL_TIMEOUT_MS = 60000L;
   private static final long AUTOKILL_CHECK_DELAY_MS = 2000L;
   public static final String NAME_PROPERTY = "pName";
 
index 0980251cdc70a539ff4fcc3fdd20e8823603adbe..fb9c818d017a79a0788c719909fb212be7518168 100644 (file)
@@ -68,7 +68,7 @@ public class MonitorTestBase extends BaseProcessTest {
 
     // 1 start my monitor & register process
     monitor.start();
-    monitor.registerProcess(process);
+    monitor.monitor(process);
 
     // 2 terminate monitor, assert process is terminated
     monitor.terminate();
index 784d75ef299e8ce7cfd0d24eeb6a6dc8b30fdb29..23293a2efed58557c0f9be4b5e827e229b16081a 100644 (file)
@@ -70,7 +70,7 @@ public class App implements ProcessMXBean {
         .addClasspath("./lib/common/*")
         .addClasspath("./lib/search/*");
       if (elasticsearch.execute()) {
-        monitor.registerProcess(elasticsearch);
+        monitor.monitor(elasticsearch);
         if (elasticsearch.waitForReady()) {
           logger.info("search server is up");
 
@@ -92,7 +92,7 @@ public class App implements ProcessMXBean {
               server.addClasspath(driverPath);
             }
             if (server.execute()) {
-              monitor.registerProcess(server);
+              monitor.monitor(server);
               if (server.waitForReady()) {
                 success = true;
                 logger.info("web server is up");