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,


Reply via email to