You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by cw...@apache.org on 2017/01/13 18:38:52 UTC
svn commit: r1778653 -
/uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java
Author: cwiklik
Date: Fri Jan 13 18:38:52 2017
New Revision: 1778653
URL: http://svn.apache.org/viewvc?rev=1778653&view=rev
Log:
UIMA-5157 improved shutdown sequence when agent receives SIGTERM or stop request from admin channel
Modified:
uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java
Modified: uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java?rev=1778653&r1=1778652&r2=1778653&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-agent/src/main/java/org/apache/uima/ducc/agent/launcher/DuccCommandExecutor.java Fri Jan 13 18:38:52 2017
@@ -31,7 +31,9 @@ import java.util.concurrent.TimeoutExcep
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.uima.ducc.agent.NodeAgent;
+import org.apache.uima.ducc.agent.launcher.ManagedProcess.StopPriority;
import org.apache.uima.ducc.common.IDuccUser;
+import org.apache.uima.ducc.common.agent.metrics.swap.DuccProcessSwapSpaceUsage;
import org.apache.uima.ducc.common.container.FlagsHelper;
import org.apache.uima.ducc.common.utils.DuccLogger;
import org.apache.uima.ducc.common.utils.TimeStamp;
@@ -44,6 +46,7 @@ import org.apache.uima.ducc.transport.cm
import org.apache.uima.ducc.transport.event.common.IDuccProcess;
import org.apache.uima.ducc.transport.event.common.IDuccProcess.ReasonForStoppingProcess;
import org.apache.uima.ducc.transport.event.common.IDuccProcessType.ProcessType;
+import org.apache.uima.ducc.transport.event.common.IProcessState;
import org.apache.uima.ducc.transport.event.common.IProcessState.ProcessState;
import org.apache.uima.ducc.transport.event.common.ITimeWindow;
import org.apache.uima.ducc.transport.event.common.TimeWindow;
@@ -303,101 +306,119 @@ public class DuccCommandExecutor extends
}
}
+ private boolean processInRunningOrInitializingState() {
+ return ( ((ManagedProcess) managedProcess).getDuccProcess().getProcessState()
+ .equals(ProcessState.Running) ||
+ ((ManagedProcess) managedProcess).getDuccProcess().getProcessState()
+ .equals(ProcessState.Initializing)
+ );
+ }
private void stopProcess(ICommandLine cmdLine, String[] cmd)
throws Exception {
String methodName = "stopProcess";
+
+ if ( processInRunningOrInitializingState() ) {
+ Future<?> future = ((ManagedProcess) managedProcess).getFuture();
+ if (future == null) {
+ throw new Exception(
+ "Future Object not Found. Unable to Stop Process with PID:"
+ + ((ManagedProcess) managedProcess).getPid());
+ }
+ // for stop to work, PID must be provided
+ if (((ManagedProcess) managedProcess).getDuccProcess().getPID() == null
+ || ((ManagedProcess) managedProcess).getDuccProcess().getPID()
+ .trim().length() == 0) {
+ throw new Exception(
+ "Process Stop Command Failed. PID not provided.");
+ }
+ try {
+ // NEW Code
+ logger.info(methodName,
+ ((ManagedProcess) super.managedProcess).getDuccId(),
+ ">>>>>>>>>>>>>>> Stopping Process:"
+ + ((ManagedProcess) managedProcess).getPid());
+ ICommandLine cmdL;
+ if (Utils.isWindows()) {
+ cmdL = new NonJavaCommandLine("taskkill");
+ cmdL.addArgument("/PID");
+ } else {
+ cmdL = new NonJavaCommandLine("/bin/kill");
+ cmdL.addArgument("-15");
+ }
+ cmdL.addArgument(((ManagedProcess) managedProcess)
+ .getDuccProcess().getPID());
+
+ String[] sigTermCmdLine = getDeployableCommandLine(cmdL,
+ new HashMap<String, String>());
+ doExec(new ProcessBuilder(sigTermCmdLine), sigTermCmdLine,
+ true);
+ // if agent receives admin STOP request, all managed processes should
+ // be stopped without each waiting for 60 secs. The agent
+ // blasts SIGTERM in parallel to all running child processes
+ if (!StopPriority.DONT_WAIT.equals(((ManagedProcess) managedProcess).getStopPriority()) ) {
+ long maxTimeToWaitForProcessToStop = 60000; // default 1 minute
+ if (super.agent.configurationFactory.processStopTimeout != null) {
+ maxTimeToWaitForProcessToStop = Long
+ .valueOf(super.agent.configurationFactory.processStopTimeout);
+ }
+ try {
+ logger.info(methodName,
+ ((ManagedProcess) super.managedProcess)
+ .getDuccId(),
+ "------------ Agent Starting Killer Timer Task For Process with PID:"
+ + ((ManagedProcess) managedProcess)
+ .getDuccProcess().getPID()
+ + " Process State: "
+ + ((ManagedProcess) managedProcess)
+ .getDuccProcess()
+ .getProcessState());
+ future.get(maxTimeToWaitForProcessToStop,
+ TimeUnit.MILLISECONDS);
+
+ } catch(TimeoutException te) {
+ if ( !((ManagedProcess) managedProcess).
+ getDuccProcess().getProcessState().equals(ProcessState.Stopped) ) {
+ logger.info(
+ methodName,
+ ((ManagedProcess) super.managedProcess)
+ .getDuccId(),
+ "------------ Agent Timed-out Waiting for Process with PID:"
+ + ((ManagedProcess) managedProcess)
+ .getDuccProcess().getPID()
+ + " to Stop. Process State:"
+ + ((ManagedProcess) managedProcess)
+ .getDuccProcess()
+ .getProcessState()
+ + " .Process did not stop in allotted time of "
+ + maxTimeToWaitForProcessToStop
+ + " millis");
+ logger.info(methodName,
+ ((ManagedProcess) super.managedProcess)
+ .getDuccId(),
+ ">>>>>>>>>>>>>>> Killing Process:"
+ + ((ManagedProcess) managedProcess)
+ .getDuccProcess().getPID()
+ + " .Process State:"
+ + ((ManagedProcess) managedProcess)
+ .getDuccProcess()
+ .getProcessState());
+ doExec(new ProcessBuilder(cmd), cmd, true);
+
+ }
- Future<?> future = ((ManagedProcess) managedProcess).getFuture();
- if (future == null) {
- throw new Exception(
- "Future Object not Found. Unable to Stop Process with PID:"
- + ((ManagedProcess) managedProcess).getPid());
- }
- // for stop to work, PID must be provided
- if (((ManagedProcess) managedProcess).getDuccProcess().getPID() == null
- || ((ManagedProcess) managedProcess).getDuccProcess().getPID()
- .trim().length() == 0) {
- throw new Exception(
- "Process Stop Command Failed. PID not provided.");
- }
- long maxTimeToWaitForProcessToStop = 60000; // default 1 minute
- if (super.agent.configurationFactory.processStopTimeout != null) {
- maxTimeToWaitForProcessToStop = Long
- .valueOf(super.agent.configurationFactory.processStopTimeout);
- }
- try {
- // NEW Code
- logger.info(methodName,
- ((ManagedProcess) super.managedProcess).getDuccId(),
- ">>>>>>>>>>>>>>> Stopping Process:"
- + ((ManagedProcess) managedProcess).getPid());
- ICommandLine cmdL;
- if (Utils.isWindows()) {
- cmdL = new NonJavaCommandLine("taskkill");
- cmdL.addArgument("/PID");
- } else {
- cmdL = new NonJavaCommandLine("/bin/kill");
- cmdL.addArgument("-15");
- }
- cmdL.addArgument(((ManagedProcess) managedProcess)
- .getDuccProcess().getPID());
-
- String[] sigTermCmdLine = getDeployableCommandLine(cmdL,
- new HashMap<String, String>());
- doExec(new ProcessBuilder(sigTermCmdLine), sigTermCmdLine,
- true);
-
- try {
- logger.info(methodName,
- ((ManagedProcess) super.managedProcess)
- .getDuccId(),
- "------------ Agent Starting Killer Timer Task For Process with PID:"
- + ((ManagedProcess) managedProcess)
- .getDuccProcess().getPID()
- + " Process State: "
- + ((ManagedProcess) managedProcess)
- .getDuccProcess()
- .getProcessState());
- future.get(maxTimeToWaitForProcessToStop,
- TimeUnit.MILLISECONDS);
-
- } catch(TimeoutException te) {
-
- logger.info(
- methodName,
- ((ManagedProcess) super.managedProcess)
- .getDuccId(),
- "------------ Agent Timed-out Waiting for Process with PID:"
- + ((ManagedProcess) managedProcess)
- .getDuccProcess().getPID()
- + " to Stop. Process State:"
- + ((ManagedProcess) managedProcess)
- .getDuccProcess()
- .getProcessState()
- + " .Process did not stop in allotted time of "
- + maxTimeToWaitForProcessToStop
- + " millis");
- logger.info(methodName,
- ((ManagedProcess) super.managedProcess)
- .getDuccId(),
- ">>>>>>>>>>>>>>> Killing Process:"
- + ((ManagedProcess) managedProcess)
- .getDuccProcess().getPID()
- + " .Process State:"
- + ((ManagedProcess) managedProcess)
- .getDuccProcess()
- .getProcessState());
- doExec(new ProcessBuilder(cmd), cmd, true);
+ }
+
+ }
+ } catch (Exception e) { // InterruptedException, ExecutionException
+ logger.error(methodName,
+ ((ManagedProcess) super.managedProcess).getDuccId(), e,
+ new Object[] {});
}
- } catch (Exception e) { // InterruptedException, ExecutionException
- logger.error(methodName,
- ((ManagedProcess) super.managedProcess).getDuccId(), e,
- new Object[] {});
+
}
-
}
private void startProcess(ICommandLine cmdLine, String[] cmd,