You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by de...@apache.org on 2016/09/15 19:19:55 UTC

svn commit: r1760970 - in /uima/uima-ducc/trunk: uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/ uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/ uima-ducc-tra...

Author: degenaro
Date: Thu Sep 15 19:19:55 2016
New Revision: 1760970

URL: http://svn.apache.org/viewvc?rev=1760970&view=rev
Log: (empty)

Modified:
    uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java
    uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/ProcessAccounting.java
    uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/StateManager.java
    uima/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java
    uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/DuccTransportConfiguration.java
    uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkMap.java
    uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IDuccWorkMap.java
    uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IResourceState.java
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccDataHelper.java
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/IServicesRegistry.java
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServiceInterpreter.java
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesHelper.java
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesRegistry.java
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java

Modified: uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java Thu Sep 15 19:19:55 2016
@@ -994,7 +994,7 @@ implements Orchestrator {
 					if(reqRole.equals(SpecificationProperties.key_role_administrator)) {
 						jobCompletionType = JobCompletionType.CanceledByAdministrator;
 					}
-					stateManager.jobTerminate(duccWorkJob, jobCompletionType, rationale, ProcessDeallocationType.JobCanceled);
+					stateManager.jobTerminate(duccWorkJob, jobCompletionType, rationale, ProcessDeallocationType.ServiceStopped);
 					OrchestratorCheckpoint.getInstance().saveState();
 					// prepare for reply to canceler
 					properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_canceled);

Modified: uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/ProcessAccounting.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/ProcessAccounting.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/ProcessAccounting.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/ProcessAccounting.java Thu Sep 15 19:19:55 2016
@@ -272,8 +272,8 @@ public class ProcessAccounting {
 		logger.trace(methodName, null, messages.fetch("enter"));
 		process.setCpuTime(inventoryProcess.getCpuTime());
 		process.setCurrentCPU(inventoryProcess.getCurrentCPU());
-		logger.trace(methodName, dw.getDuccId(), process.getDuccId(), "Cpu Time (overall):"+process.getCpuTime());
-		logger.trace(methodName, dw.getDuccId(), process.getDuccId(), "Cpu Time (current):"+process.getCurrentCPU());
+		logger.info(methodName, dw.getDuccId(), process.getDuccId(), "Cpu Time (overall):"+process.getCpuTime());
+		logger.info(methodName, dw.getDuccId(), process.getDuccId(), "Cpu Time (current):"+process.getCurrentCPU());
 		logger.trace(methodName, null, messages.fetch("exit"));
 		return;
 	}
@@ -328,6 +328,10 @@ public class ProcessAccounting {
 					logger.trace(methodName, jobId, processId, messages.fetchLabel("run end")+ts);
 				}
 			}
+			ITimeWindow tw = process.getTimeWindowRun();
+			if(tw != null) {
+				logger.info(methodName, jobId, processId, "start:"+tw.getStart()+" "+"end:"+tw.getEnd());
+			}
 		}
 		logger.trace(methodName, null, messages.fetch("exit"));
 		return;
@@ -550,20 +554,24 @@ public class ProcessAccounting {
 			}
 		}
 		adjustWindows(job, process);
-		adjustRunTime(process);
+		adjustRunTime(job, process);
 	}
 	
 	// <uima-3351>
-	private void adjustRunTime(IDuccProcess process) {
-		if(!process.isAssignedWork()) {
-			ITimeWindow twr = process.getTimeWindowRun();
-			if(twr == null) {
-				twr = new TimeWindow();
-				process.setTimeWindowRun(twr);
-			}
-			long time = 0;
-			twr.setStartLong(time);
-			twr.setEndLong(time);
+	private void adjustRunTime(IDuccWorkJob job, IDuccProcess process) {
+		switch(job.getDuccType()) {
+		case Job:
+			if(!process.isAssignedWork()) {
+				ITimeWindow twr = process.getTimeWindowRun();
+				if(twr == null) {
+					twr = new TimeWindow();
+					process.setTimeWindowRun(twr);
+				}
+				long time = 0;
+				twr.setStartLong(time);
+				twr.setEndLong(time);
+			}
+			break;
 		}
 	}
 	// </uima-3351>

Modified: uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/StateManager.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/StateManager.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/StateManager.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/StateManager.java Thu Sep 15 19:19:55 2016
@@ -1461,6 +1461,130 @@ public class StateManager {
 		logger.trace(methodName, null, messages.fetch("exit"));
 	}
 
+	private void inventoryJob(IDuccWork duccWork, IDuccProcess inventoryProcess) {
+		String methodName = "inventoryJob";
+		DuccWorkJob job = (DuccWorkJob) duccWork;
+		DuccId jobId = job.getDuccId();
+		DuccId processId = inventoryProcess.getDuccId();
+		ProcessType processType = inventoryProcess.getProcessType();
+		switch(processType) {
+		case Pop:
+			OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
+			switch(inventoryProcess.getProcessState()) {
+			case LaunchFailed:
+			case Failed:
+				if(inventoryProcess.getDuccId().getFriendly() == 0) {
+					jobTerminate(job, JobCompletionType.DriverProcessFailed, new Rationale(inventoryProcess.getReasonForStoppingProcess()), inventoryProcess.getProcessDeallocationType());
+				}
+				else {
+					jobTerminate(job, JobCompletionType.ProcessFailure, new Rationale(inventoryProcess.getReasonForStoppingProcess()), inventoryProcess.getProcessDeallocationType());
+				}
+				break;
+			default:
+				if(inventoryProcess.isComplete()) {
+					OrchestratorCommonArea.getInstance().getProcessAccounting().deallocate(job,ProcessDeallocationType.Stopped);
+					IRationale rationale = new Rationale("state manager reported as normal completion");
+					int errors = job.getSchedulingInfo().getIntWorkItemsError();
+					int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
+					if(errors > 0) {
+						setCompletionIfNotAlreadySet(job, JobCompletionType.Error, new Rationale("state manager detected error work items="+errors));
+					}
+					else if(done == 0) {
+						setCompletionIfNotAlreadySet(job, JobCompletionType.EndOfJob, new Rationale("state manager detected no work items processed"));
+					}
+					// <UIMA-3337>
+					else {
+						setCompletionIfNotAlreadySet(job, JobCompletionType.EndOfJob, rationale);
+					}
+					// </UIMA-3337>
+					completeJob(job, rationale);
+				}
+				break;
+			}
+			break;
+		case Service:
+			logger.warn(methodName, jobId, processId, "unexpected process type: "+processType);
+			break;
+		case Job_Uima_AS_Process:
+			OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
+			try {
+				if(!job.isInitialized()) {
+					IDuccProcessMap map = job.getProcessMap();
+					for(Entry<DuccId, IDuccProcess> entry : map.entrySet()) {
+						IDuccProcess process = entry.getValue();
+						StringBuffer sb = new StringBuffer();
+						sb.append("pid:"+process.getPID()+" ");
+						sb.append("state:"+process.getProcessState()+" ");
+						sb.append("reason:"+process.getReasonForStoppingProcess()+" ");
+						logger.trace(methodName, job.getDuccId(), sb.toString());
+					}
+					long initFailureCount = job.getProcessInitFailureCount();
+					long startup_initialization_error_limit = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_jd_startup_initialization_error_limit, 1);
+					if(initFailureCount >= startup_initialization_error_limit) {
+						String reason = "process inititialization failure count["+initFailureCount+"] meets startup initialization error limit["+startup_initialization_error_limit+"]";
+						logger.warn(methodName, job.getDuccId(), reason);
+						JobCompletionType jobCompletionType = JobCompletionType.CanceledBySystem;
+						Rationale rationale = new Rationale(reason);
+						ProcessDeallocationType processDeallocationType = ProcessDeallocationType.JobCanceled;
+						stateManager.jobTerminate(job, jobCompletionType, rationale, processDeallocationType);
+					}
+					else {
+						String reason = "process failure count["+initFailureCount+"] does not exceed startup initialization error limit["+startup_initialization_error_limit+"]";
+						logger.debug(methodName, job.getDuccId(), reason);
+					}
+				}
+				else {
+					logger.trace(methodName, job.getDuccId(), "job is initialized");
+				}
+			}
+			catch(Exception e) {
+				logger.error(methodName, jobId, e);
+			}
+			break;
+		}
+		// <UIMA-3923>
+		advanceToCompleted(job);
+		// </UIMA-3923>
+	}
+	
+	private void inventoryService(IDuccWork duccWork, IDuccProcess inventoryProcess) {
+		//String methodName = "inventoryService";
+		DuccWorkJob service = (DuccWorkJob) duccWork;
+		ProcessType processType = inventoryProcess.getProcessType();
+		switch(processType) {
+		case Pop:
+			OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
+			if(inventoryProcess.isComplete()) {
+				OrchestratorCommonArea.getInstance().getProcessAccounting().deallocate(service,ProcessDeallocationType.Stopped);
+			}
+			if(!service.hasAliveProcess()) {
+				completeManagedReservation(service, new Rationale("state manager reported no viable service process exists, type="+processType));
+			}
+			break;
+		case Service:
+			OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
+			if(inventoryProcess.isComplete()) {
+				OrchestratorCommonArea.getInstance().getProcessAccounting().deallocate(service,ProcessDeallocationType.Stopped);
+			}
+			if(!service.hasAliveProcess()) {
+				completeService(service, new Rationale("state manager reported no viable service process exists, type="+processType));
+			}
+			break;
+		case Job_Uima_AS_Process:
+			OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
+			if(inventoryProcess.isComplete()) {
+				OrchestratorCommonArea.getInstance().getProcessAccounting().deallocate(service,ProcessDeallocationType.Stopped);
+			}
+			if(!service.hasAliveProcess()) {
+				completeService(service, new Rationale("state manager reported no viable service process exists, type="+processType));
+			}
+			break;
+		}
+		// <UIMA-3923>
+		advanceToCompleted(service);
+		// </UIMA-3923>
+	}
+	
 	/**
 	 * Node Inventory reconciliation
 	 */
@@ -1491,120 +1615,10 @@ public class StateManager {
 							DuccType jobType = duccWork.getDuccType();
 							switch(jobType) {
 							case Job:
-								DuccWorkJob job = (DuccWorkJob) duccWork;
-								switch(processType) {
-								case Pop:
-									OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
-									switch(inventoryProcess.getProcessState()) {
-									case LaunchFailed:
-									case Failed:
-										if(inventoryProcess.getDuccId().getFriendly() == 0) {
-											jobTerminate(job, JobCompletionType.DriverProcessFailed, new Rationale(inventoryProcess.getReasonForStoppingProcess()), inventoryProcess.getProcessDeallocationType());
-										}
-										else {
-											jobTerminate(job, JobCompletionType.ProcessFailure, new Rationale(inventoryProcess.getReasonForStoppingProcess()), inventoryProcess.getProcessDeallocationType());
-										}
-										break;
-									default:
-										if(inventoryProcess.isComplete()) {
-											OrchestratorCommonArea.getInstance().getProcessAccounting().deallocate(job,ProcessDeallocationType.Stopped);
-											IRationale rationale = new Rationale("state manager reported as normal completion");
-											int errors = job.getSchedulingInfo().getIntWorkItemsError();
-											int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
-											if(errors > 0) {
-												setCompletionIfNotAlreadySet(job, JobCompletionType.Error, new Rationale("state manager detected error work items="+errors));
-											}
-											else if(done == 0) {
-												setCompletionIfNotAlreadySet(job, JobCompletionType.EndOfJob, new Rationale("state manager detected no work items processed"));
-											}
-											// <UIMA-3337>
-											else {
-												setCompletionIfNotAlreadySet(job, JobCompletionType.EndOfJob, rationale);
-											}
-											// </UIMA-3337>
-											completeJob(job, rationale);
-										}
-										break;
-									}
-									break;
-								case Service:
-									logger.warn(methodName, jobId, processId, "unexpected process type: "+processType);
-									break;
-								case Job_Uima_AS_Process:
-									OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
-									try {
-										if(!job.isInitialized()) {
-											IDuccProcessMap map = job.getProcessMap();
-											for(Entry<DuccId, IDuccProcess> entry : map.entrySet()) {
-												IDuccProcess process = entry.getValue();
-												StringBuffer sb = new StringBuffer();
-												sb.append("pid:"+process.getPID()+" ");
-												sb.append("state:"+process.getProcessState()+" ");
-												sb.append("reason:"+process.getReasonForStoppingProcess()+" ");
-												logger.trace(methodName, job.getDuccId(), sb.toString());
-											}
-											long initFailureCount = job.getProcessInitFailureCount();
-											long startup_initialization_error_limit = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_jd_startup_initialization_error_limit, 1);
-											if(initFailureCount >= startup_initialization_error_limit) {
-												String reason = "process inititialization failure count["+initFailureCount+"] meets startup initialization error limit["+startup_initialization_error_limit+"]";
-												logger.warn(methodName, job.getDuccId(), reason);
-												JobCompletionType jobCompletionType = JobCompletionType.CanceledBySystem;
-												Rationale rationale = new Rationale(reason);
-												ProcessDeallocationType processDeallocationType = ProcessDeallocationType.JobCanceled;
-												stateManager.jobTerminate(job, jobCompletionType, rationale, processDeallocationType);
-											}
-											else {
-												String reason = "process failure count["+initFailureCount+"] does not exceed startup initialization error limit["+startup_initialization_error_limit+"]";
-												logger.debug(methodName, job.getDuccId(), reason);
-											}
-										}
-										else {
-											logger.trace(methodName, job.getDuccId(), "job is initialized");
-										}
-									}
-									catch(Exception e) {
-										logger.error(methodName, jobId, e);
-									}
-									break;
-								}
-								// <UIMA-3923>
-								advanceToCompleted(job);
-								// </UIMA-3923>
+								inventoryJob(duccWork, inventoryProcess);
 								break;
 							case Service:
-								DuccWorkJob service = (DuccWorkJob) duccWork;
-								switch(processType) {
-								case Pop:
-									OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
-									if(inventoryProcess.isComplete()) {
-										OrchestratorCommonArea.getInstance().getProcessAccounting().deallocate(service,ProcessDeallocationType.Stopped);
-									}
-									if(!service.hasAliveProcess()) {
-										completeManagedReservation(service, new Rationale("state manager reported no viable service process exists, type="+processType));
-									}
-									break;
-								case Service:
-									OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
-									if(inventoryProcess.isComplete()) {
-										OrchestratorCommonArea.getInstance().getProcessAccounting().deallocate(service,ProcessDeallocationType.Stopped);
-									}
-									if(!service.hasAliveProcess()) {
-										completeService(service, new Rationale("state manager reported no viable service process exists, type="+processType));
-									}
-									break;
-								case Job_Uima_AS_Process:
-									OrchestratorCommonArea.getInstance().getProcessAccounting().setStatus(inventoryProcess);
-									if(inventoryProcess.isComplete()) {
-										OrchestratorCommonArea.getInstance().getProcessAccounting().deallocate(service,ProcessDeallocationType.Stopped);
-									}
-									if(!service.hasAliveProcess()) {
-										completeService(service, new Rationale("state manager reported no viable service process exists, type="+processType));
-									}
-									break;
-								}
-								// <UIMA-3923>
-								advanceToCompleted(service);
-								// </UIMA-3923>
+								inventoryService(duccWork, inventoryProcess);
 								break;
 							default:
 								break;

Modified: uima/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java Thu Sep 15 19:19:55 2016
@@ -72,7 +72,7 @@ public class ServiceSet
     private ServiceHandler handler;
     private IStateServices stateHandler;
 
-    // key is unique id of descriptor.  The descriptor inherites key from a Job's DuccId, or from
+    // key is unique id of descriptor.  The descriptor inherits key from a Job's DuccId, or from
     // a unique-to SM key for implicit references.
 
     Map<Long, ServiceInstance> implementors = new HashMap<Long, ServiceInstance>();
@@ -126,7 +126,7 @@ public class ServiceSet
     // Date of last known use of the service.  0 means "I don't know"
     long last_use = 0;
 
-    // Date of last known succesful ping of the service.  0 means never.  UIMA-4309
+    // Date of last known successful ping of the service.  0 means never.  UIMA-4309
     long last_ping = 0;
 
     boolean notPinging = false;
@@ -165,7 +165,7 @@ public class ServiceSet
                                              // need to govern it
 
     int run_failures = 0;
-    boolean excessiveRunFailures = false;       // signalled by monitor / pinger if we have too many
+    boolean excessiveRunFailures = false;       // signaled by monitor / pinger if we have too many
 
     boolean inShutdown = false;
 
@@ -830,7 +830,7 @@ public class ServiceSet
         if ( isDeregistered() ) return;
 
         //Long strid = id.getFriendly();
-        prepareMetaProperties();     // these always need houssecleaning before storing or syncing
+        prepareMetaProperties();     // these always need house cleaning before storing or syncing
 
         if ( ! isRecovered ) {       // if not recovery, no need to mess with the record
             stateHandler.storeProperties(id, job_props, meta_props);
@@ -1263,7 +1263,7 @@ public class ServiceSet
      * @param deletions            These are the specific instances to stop.
      * @param ndeleteions          This is the number of instances to stop.  This may well be smaller than
      *                             the size of the 'deletions' array because PingDriver caps deletions to
-     *                             prevent over-agressive or buggy monitors from killing a service.
+     *                             prevent over-aggressive or buggy monitors from killing a service.
      * @param isExcessiveFailuress This is set to 'true' if the ping/monitor decides there have been
      *                             too many instance failures and SM should stop trying to restart them.
      */
@@ -1530,7 +1530,7 @@ public class ServiceSet
         }
                 
         // If there is a pinger, and it isn't pinging, we must not advance beyond the pinger's state.
-        // If there is no pinger, we may never advance beyong Waiting
+        // If there is no pinger, we may never advance beyond Waiting
         if ( serviceMeta == null ) {
             response = (response.ordinality() < ServiceState.Waiting.ordinality()) ? response : ServiceState.Waiting;
         } else if ( serviceMeta != null ) {

Modified: uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/DuccTransportConfiguration.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/DuccTransportConfiguration.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/DuccTransportConfiguration.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/DuccTransportConfiguration.java Thu Sep 15 19:19:55 2016
@@ -53,7 +53,8 @@ public class DuccTransportConfiguration
 			}
 
 			brokerUrl = brokerUrl.substring(0, pos);
-			String connectURL = "failover:(" + brokerUrl + ")" + decoration;
+			String backupURLs = ",tcp://bluej324:61617";
+			String connectURL = "failover:(" + brokerUrl + backupURLs + ")" + decoration;
 			duccAMQComponent.setBrokerURL(connectURL);
 			logger.info("configureJMSTransport", null, "Broker URL: "+connectURL);
 	      

Modified: uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkMap.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkMap.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkMap.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/DuccWorkMap.java Thu Sep 15 19:19:55 2016
@@ -24,6 +24,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -119,7 +120,7 @@ public class DuccWorkMap implements IDuc
 		return retVal;
 	}
 	
-	public List<DuccWorkJob> getServices(List<String> implementors) {
+	public List<DuccWorkJob> getServicesList(List<String> implementors) {
 		ArrayList<DuccWorkJob> servicesList = new ArrayList<DuccWorkJob>();
 		if(implementors != null) {
 			if(getServiceKeySet().size()> 0) {
@@ -138,6 +139,27 @@ public class DuccWorkMap implements IDuc
 		return servicesList;
 	}
 	
+	
+	public Map<Long,DuccWorkJob> getServicesMap(List<String> implementors) {
+		TreeMap<Long,DuccWorkJob> servicesMap = new TreeMap<Long,DuccWorkJob>();
+		if(implementors != null) {
+			if(getServiceKeySet().size()> 0) {
+				Iterator<DuccId> iterator = null;
+				iterator = getServiceKeySet().iterator();
+				while(iterator.hasNext()) {
+					DuccId serviceId = iterator.next();
+					Long lid = serviceId.getFriendly();
+					String fid = ""+lid;
+					if(implementors.contains(fid)) {
+						DuccWorkJob service = (DuccWorkJob) findDuccWork(serviceId);
+						servicesMap.put(lid,service);
+					}
+				}
+			}
+		}
+		return servicesMap;
+	}
+	
 	public Set<DuccId> getManagedReservationKeySet() {
 		Set<DuccId> retVal = new HashSet<DuccId>();
 		Iterator<DuccId> iterator = keySet().iterator();

Modified: uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IDuccWorkMap.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IDuccWorkMap.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IDuccWorkMap.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IDuccWorkMap.java Thu Sep 15 19:19:55 2016
@@ -44,7 +44,8 @@ public interface IDuccWorkMap extends Se
 	public IDuccWork findDuccWork(String duccId);
 	public IDuccWork findDuccWork(DuccType duccType, String id);
 	
-	public List<DuccWorkJob> getServices(List<String> implementors);
+	public List<DuccWorkJob> getServicesList(List<String> implementors);
+	public Map<Long,DuccWorkJob> getServicesMap(List<String> implementors);
 	
 	public boolean isJobDriverNodeAssigned();
 	public Map<DuccId,IDuccWork> getMap();

Modified: uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IResourceState.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IResourceState.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IResourceState.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/common/IResourceState.java Thu Sep 15 19:19:55 2016
@@ -36,6 +36,7 @@ public interface IResourceState extends
 		JobCanceled,			// Job canceled by user (cancel command)
 		JobFailure,				// Job canceled by JD
 		JobCompleted,			// Process active prior to DUCC restart
+		ServiceStopped,			// Service stopped by user (stop command)
 		Exception,				// Process killed by JD exception handler
 		Timeout,				// Process killed by JD timeout handler
 		AutonomousStop,			// Process unexpectedly vanished (not terminated by Agent)

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccDataHelper.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccDataHelper.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccDataHelper.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/DuccDataHelper.java Thu Sep 15 19:19:55 2016
@@ -19,7 +19,9 @@
 package org.apache.uima.ducc.ws;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Properties;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentSkipListMap;
@@ -65,15 +67,26 @@ public class DuccDataHelper {
 		return map;
 	}
 
-    // UIMA-4258 Common code to parse meta.implementors	
-    public static String[] parseServiceIds(Properties meta)
+    public static String[] parseWorkInstances(Properties meta)
     {
-        String implementors = meta.getProperty(IServicesRegistry.implementors);
+        String stringArray = meta.getProperty(IServicesRegistry.work_instances);
+        return parseStringArray(stringArray);
+    }
+
+    public static String[] parseImplementors(Properties meta)
+    {
+        String stringArray = meta.getProperty(IServicesRegistry.implementors);
+        return parseStringArray(stringArray);
+    }
+	
+    public static String[] parseStringArray(String stringArray)
+    {
+        
         String[] ret = new String[0];
-        if(implementors != null) {
-        	implementors = implementors.trim();
-        	if(implementors.length() > 0) {
-        		String[] tempArray = implementors.trim().split("\\s+");
+        if(stringArray != null) {
+        	stringArray = stringArray.trim();
+        	if(stringArray.length() > 0) {
+        		String[] tempArray = stringArray.trim().split("\\s+");
                 ret = new String[tempArray.length];
                 int i = 0;
                 for (String s : tempArray) {
@@ -91,10 +104,9 @@ public class DuccDataHelper {
         return ret;
     }
 
-    // UIMA-4258 return implementors in arraylist instead of strion[]
-    public static ArrayList<String> parseServiceIdsAsList(Properties meta)
+    public static ArrayList<String> parseImplementorsAsList(Properties meta)
     {
-        String[] impls = parseServiceIds(meta);
+        String[] impls = parseImplementors(meta);
 
         ArrayList<String> ret = new ArrayList<String>();
         for ( String s : impls ) {
@@ -103,7 +115,17 @@ public class DuccDataHelper {
         return ret;
     }
 
-	
+    public static ArrayList<String> parseWorkInstancesAsList(Properties meta)
+    {
+        String[] impls = parseWorkInstances(meta);
+
+        ArrayList<String> ret = new ArrayList<String>();
+        for ( String s : impls ) {
+            ret.add(s);
+        }
+        return ret;
+    }
+    
 	public TreeMap<String,ArrayList<DuccId>> getServiceToReservationsUsageMap() {
 		TreeMap<String,ArrayList<DuccId>> map = new TreeMap<String,ArrayList<DuccId>>();
 		DuccData duccData = DuccData.getInstance();

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/IServicesRegistry.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/IServicesRegistry.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/IServicesRegistry.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/IServicesRegistry.java Thu Sep 15 19:19:55 2016
@@ -46,6 +46,7 @@ public class IServicesRegistry {
 	public static final String service_type = IStateServices.SvcMetaProps.service_type.pname();
 	public static final String submit_error = IStateServices.SvcMetaProps.submit_error.pname();
 	public static final String user = IStateServices.SvcMetaProps.user.pname();
+	public static final String work_instances = IStateServices.SvcMetaProps.work_instances.pname();
 	
 	public static final String service_type_CUSTOM = IStateServices.CUSTOM;
 	

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServiceInterpreter.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServiceInterpreter.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServiceInterpreter.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServiceInterpreter.java Thu Sep 15 19:19:55 2016
@@ -293,7 +293,7 @@ public class ServiceInterpreter {
 		ArrayList<String> retVal = new ArrayList<String>();
 		try {
             // UIMA-4258, use common implementors parser
-            String[] implementors = DuccDataHelper.parseServiceIds(meta);
+            String[] implementors = DuccDataHelper.parseImplementors(meta);
 			for(String implementor : implementors) {
 				retVal.add(implementor);
 			}

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesHelper.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesHelper.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesHelper.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesHelper.java Thu Sep 15 19:19:55 2016
@@ -61,7 +61,7 @@ public class ServicesHelper {
 		if(propertiesMeta != null) {
 			if(propertiesMeta.containsKey(IServicesRegistry.implementors)) {
                 // UIMA-4258, use common implementors parser
-                String[] implementors = DuccDataHelper.parseServiceIds(propertiesMeta);
+                String[] implementors = DuccDataHelper.parseImplementors(propertiesMeta);
 				for(String implementor : implementors) {
 					retVal.add(implementor);
 				}
@@ -78,7 +78,7 @@ public class ServicesHelper {
 		List<DuccWorkJob> retVal = new ArrayList<DuccWorkJob>();
 		List<String> implementors = getImplementors(servicesRegistry, propertiesMeta);
 		IDuccWorkMap duccWorkMap = DuccData.getInstance().get();
-		retVal = duccWorkMap.getServices(implementors);
+		retVal = duccWorkMap.getServicesList(implementors);
 		return retVal;
 	}
 	

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesRegistry.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesRegistry.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesRegistry.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/ServicesRegistry.java Thu Sep 15 19:19:55 2016
@@ -204,7 +204,7 @@ public class ServicesRegistry {
 				Properties meta = payload.meta;
 				if(meta != null) {
                     // UIMA-4258, use common implementors parser
-                    String[] list = DuccDataHelper.parseServiceIds(meta);
+                    String[] list = DuccDataHelper.parseImplementors(meta);
 
 					for( String member : list ) {
 						if(member.equals(id+"")) {
@@ -270,6 +270,37 @@ public class ServicesRegistry {
 							for(String dependency : dependencies) {
 								String value = dependency.trim();
 								if(value.length() > 0) {
+									ServiceName serviceName = new ServiceName(dependency);
+									retVal.add(serviceName.toString());
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		catch(Exception e) {
+			e.printStackTrace();
+		}
+		return retVal;
+	}
+	
+	public ArrayList<String> getServiceInstancesHistory(String name) {
+		String location = "getServiceInstancesHistory";
+		ArrayList<String> retVal = new ArrayList<String>();
+		try {
+			if(name != null) {
+				ServicesRegistryMapPayload payload = findService(name);
+				if(payload != null) {
+					Properties properties = payload.svc;
+					if(properties != null) {
+						String work_instances = properties.getProperty(IServicesRegistry.work_instances);
+						logger.debug(location, jobid, "name: "+name+" "+"work_instances: "+work_instances);
+						if(work_instances != null) {
+							String[] dependencies = work_instances.split(" ");
+							for(String dependency : dependencies) {
+								String value = dependency.trim();
+								if(value.length() > 0) {
 									ServiceName serviceName = new ServiceName(dependency);
 									retVal.add(serviceName.toString());
 								}

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/registry/sort/ServicesHelper.java Thu Sep 15 19:19:55 2016
@@ -86,7 +86,7 @@ public class ServicesHelper {
 		List<DuccWorkJob> retVal = new ArrayList<DuccWorkJob>();
 		List<String> implementors = serviceAdapter.getImplementors();
 		IDuccWorkMap duccWorkMap = DuccData.getInstance().get();
-		retVal = duccWorkMap.getServices(implementors);
+		retVal = duccWorkMap.getServicesList(implementors);
 		return retVal;
 	}
 	

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java Thu Sep 15 19:19:55 2016
@@ -604,7 +604,7 @@ public abstract class DuccAbstractHandle
 		if(propertiesMeta != null) {
 			if(propertiesMeta.containsKey(IServicesRegistry.implementors)) {
                 // UIMA-4258, use common implementors parser
-                String[] implementors = DuccDataHelper.parseServiceIds(propertiesMeta);
+                String[] implementors = DuccDataHelper.parseImplementors(propertiesMeta);
 				deployments = ""+implementors.length;
 			}
 		}

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java?rev=1760970&r1=1760969&r2=1760970&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java Thu Sep 15 19:19:55 2016
@@ -2267,7 +2267,7 @@ public class DuccHandler extends DuccAbs
 			properties = payload.meta;
 
             // UIMA-4258, use common implementors parser
-			ArrayList<String> implementors = DuccDataHelper.parseServiceIdsAsList(properties);
+			ArrayList<String> implementors = DuccDataHelper.parseImplementorsAsList(properties);
 			
 			DuccWorkJob service = null;
 			IDuccWorkMap duccWorkMap = DuccData.getInstance().get();
@@ -2668,32 +2668,50 @@ public class DuccHandler extends DuccAbs
 			properties = payload.meta;
 			
             // UIMA-4258, use common implementors parser
-			ArrayList<String> implementors = DuccDataHelper.parseServiceIdsAsList(properties);	
+			List<String> implementors_current = DuccDataHelper.parseImplementorsAsList(properties);	
+			List<String> implementors_defunct = DuccDataHelper.parseWorkInstancesAsList(properties);
 			
 			IDuccWorkMap duccWorkMap = DuccData.getInstance().get();
-			List<DuccWorkJob> servicesList = duccWorkMap.getServices(implementors);
-			int counter = 0;
-			AllocationType type = AllocationType.SPU;
-			String service_type = properties.getProperty(IServicesRegistry.service_type);
-			if(service_type != null) {
-				if(service_type.equalsIgnoreCase(IServicesRegistry.service_type_CUSTOM)) {
-					type = AllocationType.SPC;
+			for(int i=0; i<2; i++) {
+				Map<Long,DuccWorkJob> servicesMap = null;
+				switch(i) {
+				case 0:
+					servicesMap = duccWorkMap.getServicesMap(implementors_current);
+					break;
+				case 1:
+					servicesMap = duccWorkMap.getServicesMap(implementors_defunct);
+					break;
 				}
-			}
-			EffectiveUser eu = EffectiveUser.create(request);
-			for(DuccWorkJob service : servicesList) {
-				String directory = service.getLogDirectory()+File.separator+service.getId();
-				Map<String, FileInfo> fileInfoMap = getFileInfoMap(eu, directory);
-				IDuccProcessMap map = service.getProcessMap();
-				if(map.isEmpty()) {
-					buildServiceProcessListEntry(eu, sb, service, null, DetailsType.Service, type, ++counter, fileInfoMap);
-				}
-				else {
-					for(DuccId key : map.keySet()) {
-						IDuccProcess process = map.get(key);
-						buildServiceProcessListEntry(eu, sb, service, process, DetailsType.Service, type, ++counter, fileInfoMap);
+				
+				Map<Long, DuccWorkJob> inverseServicesMap = new TreeMap<Long,DuccWorkJob>();
+				for(Entry<Long, DuccWorkJob> entry : servicesMap.entrySet()) {
+					inverseServicesMap.put(0-entry.getKey(), entry.getValue());
+				}
+				
+				int counter = 0;
+				AllocationType type = AllocationType.SPU;
+				String service_type = properties.getProperty(IServicesRegistry.service_type);
+				if(service_type != null) {
+					if(service_type.equalsIgnoreCase(IServicesRegistry.service_type_CUSTOM)) {
+						type = AllocationType.SPC;
 					}
 				}
+				EffectiveUser eu = EffectiveUser.create(request);
+				for(Entry<Long, DuccWorkJob> entry : inverseServicesMap.entrySet()) {
+					DuccWorkJob service = entry.getValue();
+					String directory = service.getLogDirectory()+File.separator+service.getId();
+					Map<String, FileInfo> fileInfoMap = getFileInfoMap(eu, directory);
+					IDuccProcessMap map = service.getProcessMap();
+					if(map.isEmpty()) {
+						buildServiceProcessListEntry(eu, sb, service, null, DetailsType.Service, type, ++counter, fileInfoMap);
+					}
+					else {
+						for(DuccId key : map.keySet()) {
+							IDuccProcess process = map.get(key);
+							buildServiceProcessListEntry(eu, sb, service, process, DetailsType.Service, type, ++counter, fileInfoMap);
+						}
+					}
+				}	
 			}
 		}
 		catch(Throwable t) {