From: Eric Hartmann Date: Tue, 8 Aug 2017 13:58:32 +0000 (+0200) Subject: SONAR-8798 log stderr of subprocesses X-Git-Tag: 6.6-RC1~677 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=5baef74cbd25b8fcc149b2bed64b18a5677cfc66;p=sonarqube.git SONAR-8798 log stderr of subprocesses --- 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 d5d761234da..f778b6e354f 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 @@ -45,6 +45,10 @@ abstract class AbstractProcessMonitor implements ProcessMonitor { return process.getInputStream(); } + public InputStream getErrorStream() { + return process.getErrorStream(); + } + public void closeStreams() { closeQuietly(process.getInputStream()); closeQuietly(process.getOutputStream()); diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitor.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitor.java index 81260cf5ec6..9a88393ef10 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitor.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitor.java @@ -29,6 +29,11 @@ public interface ProcessMonitor { */ InputStream getInputStream(); + /** + * @see Process#getErrorStream() + */ + InputStream getErrorStream(); + /** * Closes the streams {@link Process#getInputStream()}, {@link Process#getOutputStream()} * and {@link Process#getErrorStream()}. diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/SQProcess.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/SQProcess.java index 26f8d91713f..6aa7a29bac1 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/SQProcess.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/SQProcess.java @@ -43,7 +43,8 @@ public class SQProcess { private final long watcherDelayMs; private ProcessMonitor process; - private StreamGobbler gobbler; + private StreamGobbler stdOutGobbler; + private StreamGobbler stdErrGobbler; private final StopWatcher stopWatcher; private final EventWatcher eventWatcher; // keep flag so that the operational event is sent only once @@ -71,8 +72,10 @@ public class SQProcess { lifecycle.tryToMoveTo(Lifecycle.State.STOPPED); throw e; } - this.gobbler = new StreamGobbler(process.getInputStream(), processId.getKey()); - this.gobbler.start(); + this.stdOutGobbler = new StreamGobbler(process.getInputStream(), processId.getKey()); + this.stdOutGobbler.start(); + this.stdErrGobbler = new StreamGobbler(process.getErrorStream(), processId.getKey()); + this.stdErrGobbler.start(); this.stopWatcher.start(); this.eventWatcher.start(); // Could be improved by checking the status "up" in shared memory. @@ -143,9 +146,13 @@ public class SQProcess { waitForDown(); process.closeStreams(); } - if (gobbler != null) { - StreamGobbler.waitUntilFinish(gobbler); - gobbler.interrupt(); + if (stdOutGobbler != null) { + StreamGobbler.waitUntilFinish(stdOutGobbler); + stdOutGobbler.interrupt(); + } + if (stdErrGobbler != null) { + StreamGobbler.waitUntilFinish(stdErrGobbler); + stdErrGobbler.interrupt(); } lifecycle.tryToMoveTo(Lifecycle.State.STOPPED); } diff --git a/server/sonar-process-monitor/src/test/java/org/sonar/application/SchedulerImplTest.java b/server/sonar-process-monitor/src/test/java/org/sonar/application/SchedulerImplTest.java index d8335fcdf93..c2a94d039f7 100644 --- a/server/sonar-process-monitor/src/test/java/org/sonar/application/SchedulerImplTest.java +++ b/server/sonar-process-monitor/src/test/java/org/sonar/application/SchedulerImplTest.java @@ -403,6 +403,11 @@ public class SchedulerImplTest { return mock(InputStream.class, Mockito.RETURNS_MOCKS); } + @Override + public InputStream getErrorStream() { + return mock(InputStream.class, Mockito.RETURNS_MOCKS); + } + @Override public void closeStreams() { } diff --git a/server/sonar-process-monitor/src/test/java/org/sonar/application/process/SQProcessTest.java b/server/sonar-process-monitor/src/test/java/org/sonar/application/process/SQProcessTest.java index c7eb9e26608..004ef445d38 100644 --- a/server/sonar-process-monitor/src/test/java/org/sonar/application/process/SQProcessTest.java +++ b/server/sonar-process-monitor/src/test/java/org/sonar/application/process/SQProcessTest.java @@ -261,6 +261,7 @@ public class SQProcessTest { private final CountDownLatch alive = new CountDownLatch(1); private final InputStream inputStream = mock(InputStream.class, Mockito.RETURNS_MOCKS); + private final InputStream errorStream = mock(InputStream.class, Mockito.RETURNS_MOCKS); private boolean streamsClosed = false; private boolean operational = false; private boolean askedForRestart = false; @@ -272,6 +273,11 @@ public class SQProcessTest { return inputStream; } + @Override + public InputStream getErrorStream() { + return errorStream; + } + @Override public void closeStreams() { streamsClosed = true;