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,