From 0f5e529eb799865a957fda156b8a8b872d2f795d Mon Sep 17 00:00:00 2001 From: Daniel Schwarz Date: Tue, 8 Aug 2017 13:57:09 +0200 Subject: [PATCH] SONAR-8798 log exit value of terminated sub processes --- .../process/AbstractProcessMonitor.java | 18 ++++++++++++++++-- .../application/process/EsProcessMonitor.java | 5 +++-- .../process/ProcessCommandsProcessMonitor.java | 5 +++-- .../process/ProcessLauncherImpl.java | 17 ++++++++++------- .../ProcessCommandsProcessMonitorTest.java | 9 +++++---- 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java index 596db4939c5..d5d761234da 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java @@ -24,12 +24,21 @@ import java.io.IOException; import java.io.InputStream; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.process.ProcessId; abstract class AbstractProcessMonitor implements ProcessMonitor { + + private static final Logger LOG = LoggerFactory.getLogger(EsProcessMonitor.class); + private static final int EXPECTED_EXIT_VALUE = 0; + protected final Process process; + private final ProcessId processId; - protected AbstractProcessMonitor(Process process) { + protected AbstractProcessMonitor(Process process, ProcessId processId) { this.process = process; + this.processId = processId; } public InputStream getInputStream() { @@ -61,7 +70,12 @@ abstract class AbstractProcessMonitor implements ProcessMonitor { } public void waitFor() throws InterruptedException { - process.waitFor(); + int exitValue = process.waitFor(); + if (exitValue != EXPECTED_EXIT_VALUE) { + LOG.warn("Process exited with exit value [{}]: {}", processId.getKey(), exitValue); + } else { + LOG.debug("Process exited with exit value [{}]: {}", processId.getKey(), exitValue); + } } public void waitFor(long timeout, TimeUnit unit) throws InterruptedException { diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsProcessMonitor.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsProcessMonitor.java index 14ddd80220a..e7502535d54 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsProcessMonitor.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsProcessMonitor.java @@ -41,6 +41,7 @@ import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.transport.Netty4Plugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.sonar.process.ProcessId; import static java.util.Collections.singletonList; import static java.util.Collections.unmodifiableList; @@ -61,8 +62,8 @@ public class EsProcessMonitor extends AbstractProcessMonitor { private final EsCommand esCommand; private AtomicReference transportClient = new AtomicReference<>(null); - public EsProcessMonitor(Process process, EsCommand esCommand) throws MalformedURLException { - super(process); + public EsProcessMonitor(Process process, ProcessId processId, EsCommand esCommand) throws MalformedURLException { + super(process, processId); this.esCommand = esCommand; } diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessCommandsProcessMonitor.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessCommandsProcessMonitor.java index 734ce60c681..77ebdeeb521 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessCommandsProcessMonitor.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessCommandsProcessMonitor.java @@ -20,6 +20,7 @@ package org.sonar.application.process; import org.sonar.process.ProcessCommands; +import org.sonar.process.ProcessId; import static java.util.Objects.requireNonNull; @@ -27,8 +28,8 @@ class ProcessCommandsProcessMonitor extends AbstractProcessMonitor { private final ProcessCommands commands; - ProcessCommandsProcessMonitor(Process process, ProcessCommands commands) { - super(process); + ProcessCommandsProcessMonitor(Process process, ProcessId processId, ProcessCommands commands) { + super(process, processId); this.commands = requireNonNull(commands, "commands can't be null"); } diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java index b849c5f52c9..3ac0fd1dcd0 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java @@ -39,6 +39,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.process.AllProcessesCommands; import org.sonar.process.ProcessCommands; +import org.sonar.process.ProcessId; import static java.lang.String.format; import static org.sonar.process.ProcessEntryPoint.PROPERTY_PROCESS_INDEX; @@ -76,20 +77,21 @@ public class ProcessLauncherImpl implements ProcessLauncher { @Override public ProcessMonitor launch(EsCommand esCommand) { Process process = null; + ProcessId processId = esCommand.getProcessId(); try { writeConfFiles(esCommand); ProcessBuilder processBuilder = create(esCommand); - LOG.info("Launch process[{}]: {}", esCommand.getProcessId().getKey(), String.join(" ", processBuilder.command())); + LOG.info("Launch process[{}]: {}", processId.getKey(), String.join(" ", processBuilder.command())); process = processBuilder.start(); - return new EsProcessMonitor(process, esCommand); + return new EsProcessMonitor(process, processId, esCommand); } catch (Exception e) { // just in case if (process != null) { process.destroyForcibly(); } - throw new IllegalStateException(format("Fail to launch process [%s]", esCommand.getProcessId().getKey()), e); + throw new IllegalStateException(format("Fail to launch process [%s]", processId.getKey()), e); } } @@ -114,19 +116,20 @@ public class ProcessLauncherImpl implements ProcessLauncher { @Override public ProcessMonitor launch(JavaCommand javaCommand) { Process process = null; + ProcessId processId = javaCommand.getProcessId(); try { - ProcessCommands commands = allProcessesCommands.createAfterClean(javaCommand.getProcessId().getIpcIndex()); + ProcessCommands commands = allProcessesCommands.createAfterClean(processId.getIpcIndex()); ProcessBuilder processBuilder = create(javaCommand); - LOG.info("Launch process[{}]: {}", javaCommand.getProcessId().getKey(), String.join(" ", processBuilder.command())); + LOG.info("Launch process[{}]: {}", processId.getKey(), String.join(" ", processBuilder.command())); process = processBuilder.start(); - return new ProcessCommandsProcessMonitor(process, commands); + return new ProcessCommandsProcessMonitor(process, processId, commands); } catch (Exception e) { // just in case if (process != null) { process.destroyForcibly(); } - throw new IllegalStateException(format("Fail to launch process [%s]", javaCommand.getProcessId().getKey()), e); + throw new IllegalStateException(format("Fail to launch process [%s]", processId.getKey()), e); } } diff --git a/server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessCommandsProcessMonitorTest.java b/server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessCommandsProcessMonitorTest.java index e8e5c63e47a..c7a779bcb61 100644 --- a/server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessCommandsProcessMonitorTest.java +++ b/server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessCommandsProcessMonitorTest.java @@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit; import org.junit.Test; import org.mockito.Mockito; import org.sonar.process.ProcessCommands; +import org.sonar.process.ProcessId; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; @@ -41,7 +42,7 @@ public class ProcessCommandsProcessMonitorTest { Process process = mock(Process.class, RETURNS_DEEP_STUBS); ProcessCommands commands = mock(ProcessCommands.class, RETURNS_DEEP_STUBS); - ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, commands); + ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, ProcessId.WEB_SERVER, commands); underTest.waitFor(); verify(process).waitFor(); @@ -68,7 +69,7 @@ public class ProcessCommandsProcessMonitorTest { Process process = mock(Process.class, RETURNS_DEEP_STUBS); ProcessCommands commands = mock(ProcessCommands.class, RETURNS_DEEP_STUBS); - ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, commands); + ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, null, commands); underTest.askForStop(); verify(commands).askForStop(); @@ -89,7 +90,7 @@ public class ProcessCommandsProcessMonitorTest { Process process = mock(Process.class); when(process.getInputStream()).thenReturn(null); - ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, commands); + ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, null, commands); // no failures underTest.closeStreams(); @@ -102,7 +103,7 @@ public class ProcessCommandsProcessMonitorTest { Process process = mock(Process.class); when(process.getInputStream()).thenReturn(stream); - ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, mock(ProcessCommands.class, Mockito.RETURNS_MOCKS)); + ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, null, mock(ProcessCommands.class, Mockito.RETURNS_MOCKS)); // no failures underTest.closeStreams(); -- 2.39.5