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 2014/11/10 19:45:51 UTC

svn commit: r1637957 - in /uima/sandbox/uima-ducc/trunk/uima-ducc-container/src: main/java/org/apache/uima/ducc/container/common/ main/java/org/apache/uima/ducc/container/jd/ main/java/org/apache/uima/ducc/container/jd/cas/ main/java/org/apache/uima/du...

Author: degenaro
Date: Mon Nov 10 18:45:51 2014
New Revision: 1637957

URL: http://svn.apache.org/r1637957
Log:
UIMA-4069 Redesign of JD toward the main goal of classpath separation for container (system) code.

Job Driver employment of user specified error handler JP returns user exception in MetaCas.  Carry out Work Item retry if error handler's directive so indicates. 

Added:
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/user/jd/test/helper/TestJdContainerErrorHandlerRandomRetry.java   (with props)
Modified:
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/common/Standardize.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/JobDriver.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/cas/CasManagerStats.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/fsm/wi/ActionEnd.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/Dispatcher.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/iface/IOperatingInfo.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/impl/OperatingInfo.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/ATest.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/TestDispatcher.java

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/common/Standardize.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/common/Standardize.java?rev=1637957&r1=1637956&r2=1637957&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/common/Standardize.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/common/Standardize.java Mon Nov 10 18:45:51 2014
@@ -24,6 +24,8 @@ public class Standardize {
 		crFetches,
 		crTotal,
 		preemptions,
+		endSuccess,
+		endFailure,
 		finishedMillisMax,
 		finishedMillisMin,
 		finishedMillisAvg,

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/JobDriver.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/JobDriver.java?rev=1637957&r1=1637956&r2=1637957&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/JobDriver.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/JobDriver.java Mon Nov 10 18:45:51 2014
@@ -24,6 +24,7 @@ import org.apache.uima.ducc.container.co
 import org.apache.uima.ducc.container.common.IContainerLogger;
 import org.apache.uima.ducc.container.common.IEntityId;
 import org.apache.uima.ducc.container.jd.cas.CasManager;
+import org.apache.uima.ducc.container.jd.classload.ProxyJobDriverErrorHandler;
 import org.apache.uima.ducc.container.jd.config.IJobDriverConfig;
 import org.apache.uima.ducc.container.jd.mh.iface.remote.IRemoteWorkerIdentity;
 import org.apache.uima.ducc.container.jd.wi.IWorkItem;
@@ -46,8 +47,8 @@ public class JobDriver {
 	
 	private ConcurrentHashMap<IRemoteWorkerIdentity, IWorkItem> map = null;
 	private IWorkItemStatistics wis = null;
-	
 	private CasManager cm = null;
+	private ProxyJobDriverErrorHandler pjdeh = null;
 	
 	public void initialize(IJobDriverConfig jdCfg) {
 		String location = "initialize";
@@ -55,6 +56,7 @@ public class JobDriver {
 			map = new ConcurrentHashMap<IRemoteWorkerIdentity, IWorkItem>();
 			wis = new WorkItemStatistics();
 			cm = new CasManager(jdCfg.getUserClasspath(), jdCfg.getCrXml(), jdCfg.getCrCfg());
+			pjdeh = new ProxyJobDriverErrorHandler(jdCfg.getUserClasspath(), jdCfg.getErrorHandlerClassName(), jdCfg.getErrorHandlerConfigurationParameters());
 		}
 		catch(Exception e) {
 			logger.error(location, IEntityId.null_id, e);
@@ -73,4 +75,8 @@ public class JobDriver {
 		return cm;
 	}
 	
+	public ProxyJobDriverErrorHandler getProxyJobDriverErrorHandler() {
+		return pjdeh;
+	}
+	
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/cas/CasManagerStats.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/cas/CasManagerStats.java?rev=1637957&r1=1637956&r2=1637957&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/cas/CasManagerStats.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/cas/CasManagerStats.java Mon Nov 10 18:45:51 2014
@@ -31,6 +31,10 @@ public class CasManagerStats {
 	private AtomicInteger retryQueuePuts = new AtomicInteger(0);
 	private AtomicInteger retryQueueGets = new AtomicInteger(0);
 	
+	private AtomicInteger endSuccess = new AtomicInteger(0);
+	private AtomicInteger endFailure = new AtomicInteger(0);
+	private AtomicInteger endRetry = new AtomicInteger(0);
+	
 	private ConcurrentHashMap<String,AtomicInteger> retryReasonsMap = new ConcurrentHashMap<String,AtomicInteger>();
 	
 	public void setCrTotal(int value) {
@@ -87,4 +91,28 @@ public class CasManagerStats {
 		}
 		return retVal;
 	}
+	
+	public void incEndSuccess() {
+		endSuccess.incrementAndGet();
+	}
+	
+	public int getEndSuccess() {
+		return endSuccess.get();
+	}
+	
+	public void incEndFailure() {
+		endFailure.incrementAndGet();
+	}
+	
+	public int getEndFailure() {
+		return endFailure.get();
+	}
+	
+	public void incEndRetry() {
+		endRetry.incrementAndGet();
+	}
+	
+	public int getEndRetry() {
+		return endRetry.get();
+	}
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/fsm/wi/ActionEnd.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/fsm/wi/ActionEnd.java?rev=1637957&r1=1637956&r2=1637957&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/fsm/wi/ActionEnd.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/fsm/wi/ActionEnd.java Mon Nov 10 18:45:51 2014
@@ -25,6 +25,10 @@ import org.apache.uima.ducc.container.co
 import org.apache.uima.ducc.container.common.Standardize;
 import org.apache.uima.ducc.container.common.fsm.iface.IAction;
 import org.apache.uima.ducc.container.jd.JobDriver;
+import org.apache.uima.ducc.container.jd.cas.CasManager;
+import org.apache.uima.ducc.container.jd.cas.CasManagerStats.RetryReason;
+import org.apache.uima.ducc.container.jd.classload.ProxyJobDriverDirective;
+import org.apache.uima.ducc.container.jd.classload.ProxyJobDriverErrorHandler;
 import org.apache.uima.ducc.container.jd.mh.RemoteWorkerIdentity;
 import org.apache.uima.ducc.container.jd.mh.iface.remote.IRemoteWorkerIdentity;
 import org.apache.uima.ducc.container.jd.wi.IWorkItem;
@@ -40,7 +44,40 @@ public class ActionEnd implements IActio
 	public String getName() {
 		return ActionEnd.class.getName();
 	}
-
+	
+	private void retry(CasManager cm, IWorkItem wi, IMetaCasTransaction trans, IMetaCas metaCas, IRemoteWorkerIdentity rwi) {
+		String location = "retry";
+		cm.putMetaCas(metaCas, RetryReason.UserErrorRetry);
+		cm.getCasManagerStats().incEndRetry();
+		MessageBuffer mb = new MessageBuffer();
+		mb.append(Standardize.Label.transNo.get()+trans.getTransactionId().toString());
+		mb.append(Standardize.Label.seqNo.get()+metaCas.getSystemKey());
+		mb.append(Standardize.Label.remote.get()+rwi.toString());
+		logger.info(location, IEntityId.null_id, mb.toString());
+	}
+	
+	private void failure(CasManager cm, IWorkItem wi, IMetaCasTransaction trans, IMetaCas metaCas, IRemoteWorkerIdentity rwi) {
+		String location = "failure";
+		cm.getCasManagerStats().incEndFailure();
+		MessageBuffer mb = new MessageBuffer();
+		mb.append(Standardize.Label.transNo.get()+trans.getTransactionId().toString());
+		mb.append(Standardize.Label.seqNo.get()+metaCas.getSystemKey());
+		mb.append(Standardize.Label.remote.get()+rwi.toString());
+		logger.info(location, IEntityId.null_id, mb.toString());
+	}
+	
+	private void success(CasManager cm, IWorkItem wi, IMetaCasTransaction trans, IMetaCas metaCas, IRemoteWorkerIdentity rwi) {
+		String location = "success";
+		cm.getCasManagerStats().incEndSuccess();
+		wi.setTodEnd();
+		updateStatistics(wi);
+		MessageBuffer mb = new MessageBuffer();
+		mb.append(Standardize.Label.transNo.get()+trans.getTransactionId().toString());
+		mb.append(Standardize.Label.seqNo.get()+metaCas.getSystemKey());
+		mb.append(Standardize.Label.remote.get()+rwi.toString());
+		logger.info(location, IEntityId.null_id, mb.toString());
+	}
+	
 	@Override
 	public void engage(Object objectData) {
 		String location = "engage";
@@ -51,15 +88,30 @@ public class ActionEnd implements IActio
 			IMetaCasTransaction trans = actionData.getMetaCasTransaction();
 			IRemoteWorkerIdentity rwi = new RemoteWorkerIdentity(trans);
 			IMetaCas metaCas = wi.getMetaCas();
+			JobDriver jd = JobDriver.getInstance();
+			CasManager cm = jd.getCasManager();
 			//
 			if(metaCas != null) {
-				wi.setTodEnd();
-				updateStatistics(wi);
-				MessageBuffer mb = new MessageBuffer();
-				mb.append(Standardize.Label.transNo.get()+trans.getTransactionId().toString());
-				mb.append(Standardize.Label.seqNo.get()+metaCas.getSystemKey());
-				mb.append(Standardize.Label.remote.get()+rwi.toString());
-				logger.info(location, IEntityId.null_id, mb.toString());
+				Object exception = metaCas.getUserSpaceException();
+				if(exception != null) {
+					Object cas = metaCas.getUserSpaceCas();
+					ProxyJobDriverErrorHandler pjdeh = jd.getProxyJobDriverErrorHandler();
+					ProxyJobDriverDirective pjdd = pjdeh.handle(cas, exception);
+					if(pjdd != null) {
+						if(pjdd.isKillWorkItem()) {
+							failure(cm, wi, trans, metaCas, rwi);
+						}
+						else {
+							retry(cm, wi, trans, metaCas, rwi);
+						}
+					}
+					else {
+						failure(cm, wi, trans, metaCas, rwi);
+					}
+				}
+				else {
+					success(cm, wi, trans, metaCas, rwi);
+				}
 				wi.resetTods();
 			}
 			else {MessageBuffer mb = new MessageBuffer();
@@ -76,5 +128,4 @@ public class ActionEnd implements IActio
 		IWorkItemStatistics wis = JobDriver.getInstance().getWorkItemStatistics();
 		wis.ended(wi);
 	}
-
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/Dispatcher.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/Dispatcher.java?rev=1637957&r1=1637956&r2=1637957&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/Dispatcher.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/Dispatcher.java Mon Nov 10 18:45:51 2014
@@ -59,13 +59,16 @@ public class Dispatcher {
 		IOperatingInfo retVal = null;
 		try {
 			IOperatingInfo oi = new OperatingInfo();
-			JobDriver jdc = JobDriver.getInstance();
-			CasManager cm = jdc.getCasManager();
+			JobDriver jd = JobDriver.getInstance();
+			CasManager cm = jd.getCasManager();
 			CasManagerStats cms = cm.getCasManagerStats();
-			IWorkItemStatistics wis = jdc.getWorkItemStatistics();
+			IWorkItemStatistics wis = jd.getWorkItemStatistics();
 			IRunningWorkItemStatistics rwis = RunningWorkItemStatistics.getCurrent();
 			oi.setWorkItemCrTotal(cms.getCrTotal());
 			oi.setWorkItemCrFetches(cms.getCrGets());
+			oi.setWorkItemEndSuccesses(cms.getEndSuccess());
+			oi.setWorkItemEndFailures(cms.getEndFailure());
+			oi.setWorkItemEndRetrys(cms.getEndRetry());
 			oi.setWorkItemPreemptions(cms.getNumberOfPreemptions());
 			oi.setWorkItemFinishedMillisMin(wis.getMillisMin());
 			oi.setWorkItemFinishedMillisMax(wis.getMillisMax());
@@ -76,6 +79,8 @@ public class Dispatcher {
 			MessageBuffer mb = new MessageBuffer();
 			mb.append(Standardize.Label.crTotal.get()+oi.getWorkItemCrTotal());
 			mb.append(Standardize.Label.crFetches.get()+oi.getWorkItemCrFetches());
+			mb.append(Standardize.Label.endSuccess.get()+oi.getWorkItemEndSuccesses());
+			mb.append(Standardize.Label.endFailure.get()+oi.getWorkItemEndFailures());
 			mb.append(Standardize.Label.preemptions.get()+oi.getWorkItemPreemptions());
 			mb.append(Standardize.Label.finishedMillisMin.get()+oi.getWorkItemFinishedMillisMin());
 			mb.append(Standardize.Label.finishedMillisMax.get()+oi.getWorkItemFinishedMillisMax());

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/iface/IOperatingInfo.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/iface/IOperatingInfo.java?rev=1637957&r1=1637956&r2=1637957&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/iface/IOperatingInfo.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/iface/IOperatingInfo.java Mon Nov 10 18:45:51 2014
@@ -40,6 +40,9 @@ public interface IOperatingInfo {
 	public void setWorkItemEndFailures(int value);
 	public int getWorkItemEndFailures();
 	
+	public void setWorkItemEndRetrys(int value);
+	public int getWorkItemEndRetrys();
+	
 	public void setWorkItemPreemptions(int value);
 	public int getWorkItemPreemptions();
 	

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/impl/OperatingInfo.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/impl/OperatingInfo.java?rev=1637957&r1=1637956&r2=1637957&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/impl/OperatingInfo.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/main/java/org/apache/uima/ducc/container/jd/mh/impl/OperatingInfo.java Mon Nov 10 18:45:51 2014
@@ -28,6 +28,7 @@ public class OperatingInfo implements IO
 	private int jpAcks = 0;
 	private int jpEndSuccesses = 0;
 	private int jpEndFailures = 0;
+	private int jpEndRetrys = 0;
 	private int jpPreemptions = 0;
 	private int jpUserProcessingTimeouts = 0;
 	private int jpUserProcessingErrorRetries = 0;
@@ -107,6 +108,16 @@ public class OperatingInfo implements IO
 	}
 
 	@Override
+	public void setWorkItemEndRetrys(int value) {
+		jpEndRetrys = value;
+	}
+
+	@Override
+	public int getWorkItemEndRetrys() {
+		return jpEndRetrys;
+	}
+
+	@Override
 	public void setWorkItemPreemptions(int value) {
 		jpPreemptions = value;
 	}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/ATest.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/ATest.java?rev=1637957&r1=1637956&r2=1637957&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/ATest.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/ATest.java Mon Nov 10 18:45:51 2014
@@ -27,9 +27,9 @@ import org.junit.BeforeClass;
 public abstract class ATest {
 	
 	private boolean disabled = false;
-	private boolean verbose = false;
+	private boolean verbose = true;
 	private boolean warned = false;
-	private boolean debug = false;
+	private boolean debug = true;
 	
 	public boolean isDisabled(String name ) {
 		if(disabled) {

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/TestDispatcher.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/TestDispatcher.java?rev=1637957&r1=1637956&r2=1637957&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/TestDispatcher.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/container/jd/test/TestDispatcher.java Mon Nov 10 18:45:51 2014
@@ -225,9 +225,9 @@ public class TestDispatcher extends ATes
 			IMetaCas metaCas = transGet(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
 			assertTrue(metaCas != null);
 			while(metaCas != null) {
-				randomPreempt(dispatcher,ti);
+				randomPreemptTest03(dispatcher,ti);
 				transAck(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
-				randomPreempt(dispatcher,ti);
+				randomPreemptTest03(dispatcher,ti);
 				try {
 					Thread.sleep(20);
 				}
@@ -235,7 +235,7 @@ public class TestDispatcher extends ATes
 				}
 				dispatcher.handleGetOperatingInfo();
 				transEnd(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
-				randomPreempt(dispatcher,ti);
+				randomPreemptTest03(dispatcher,ti);
 				casNo--;
 				metaCasPrevious = metaCas;
 				assertTrue(metaCasPrevious != null);
@@ -266,18 +266,178 @@ public class TestDispatcher extends ATes
 		}
 	}
 	
-	private long seedTest03 = 1;
+	private long seedTest03 = 3;
 	private Random randomTest03 = new Random(seedTest03);
 	private long pctTest03 = 15;
 	
-	private long expectedPremptionsTest03 = 52;
+	private long expectedPremptionsTest03 = 32;
 	
-	private void randomPreempt(Dispatcher dispatcher, ThreadInfo ti) {
+	private void randomPreemptTest03(Dispatcher dispatcher, ThreadInfo ti) {
 		int n = randomTest03.nextInt(100);
 		if(n < pctTest03) {
 			IProcessInfo processInfo = new ProcessInfo(ti.getNode(),ti.getPid());
 			dispatcher.handlePreemptProcess(processInfo);
 		}
-		
+	}
+	
+	// multiple node:pid:tid with errors
+	
+	@Test
+	public void test_04() {
+		if(isDisabled(this.getClass().getName())) {
+			return;
+		}
+		try {
+			URL urlXml = this.getClass().getResource("/CR100.xml");
+			File file = new File(urlXml.getFile());
+			String crXml = file.getAbsolutePath();
+			String crCfg = null;
+			IJobDriverConfig jdCfg = new JobDriverConfig();
+			jdCfg.setUserClasspath(Utilities.userCP);
+			jdCfg.setCrXml(crXml);
+			jdCfg.setCrCfg(crCfg);
+			JobDriver.setInstance(jdCfg);
+			int size = JobDriver.getInstance().getMap().size();
+			debug("map size:"+size);
+			Dispatcher dispatcher = new Dispatcher();
+			ThreadInfoFactory tif = new ThreadInfoFactory(2,2,2);
+			ThreadInfo ti = tif.getRandom();
+			debug("random:"+ti.toKey());
+			int casNo = -1;
+			IMetaCas metaCasPrevious = null;
+			IMetaCas metaCas = transGet(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
+			assertTrue(metaCas != null);
+			int inject = 0;
+			while(metaCas != null) {
+				transAck(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
+				if(randomErrorTest04()) {
+					Exception exception = new RuntimeException("injected error test #04");
+					metaCas.setUserSpaceException(exception);
+					inject++;
+				}
+				transEnd(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
+				casNo--;
+				metaCasPrevious = metaCas;
+				assertTrue(metaCasPrevious != null);
+				ti = tif.getRandom();
+				debug("random:"+ti.toKey());
+				metaCas = transGet(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
+			}
+			assertTrue(metaCasPrevious.getSystemKey().equals("100"));
+			asExpected("CASes processed count == 100");
+			IOperatingInfo oi = dispatcher.handleGetOperatingInfo();
+			assertTrue(oi.getWorkItemCrFetches() == 100);
+			asExpected("CASes fetched count == 100");
+			long endSuccess = oi.getWorkItemEndSuccesses();
+			long endFailure = oi.getWorkItemEndFailures();
+			debug("injected errors: "+inject);
+			debug("end success: "+endSuccess);
+			debug("end failure: "+endFailure);
+			assertTrue(endFailure == expectedErrorsTest04);
+			asExpected("CASes error count == "+expectedErrorsTest04);
+			assertTrue(endSuccess+endFailure == 100);
+			asExpected("CASes failure+success count == 100");
+		}
+		catch(Exception e) {
+			e.printStackTrace();
+			fail("Exception");
+		}
+	}
+	
+	private long seedTest04 = 4;
+	private Random randomTest04 = new Random(seedTest04);
+	private long pctTest04 = 15;
+	
+	private long expectedErrorsTest04 = 17;
+	
+	private boolean randomErrorTest04() {
+		boolean retVal = false;
+		int n = randomTest04.nextInt(100);
+		if(n < pctTest04) {
+			retVal = true;
+		}
+		return retVal;
+	}
+	
+	
+	// multiple node:pid:tid with errors & retrys
+	
+	@Test
+	public void test_05() {
+		if(isDisabled(this.getClass().getName())) {
+			return;
+		}
+		try {
+			URL urlXml = this.getClass().getResource("/CR100.xml");
+			File file = new File(urlXml.getFile());
+			String crXml = file.getAbsolutePath();
+			String crCfg = null;
+			IJobDriverConfig jdCfg = new JobDriverConfig();
+			jdCfg.setUserClasspath(Utilities.userCP);
+			jdCfg.setCrXml(crXml);
+			jdCfg.setCrCfg(crCfg);
+			String eh = "org.apache.uima.ducc.user.jd.test.helper.TestJdContainerErrorHandlerRandomRetry";
+			jdCfg.setErrorHandlerClassName(eh);
+			JobDriver.setInstance(jdCfg);
+			int size = JobDriver.getInstance().getMap().size();
+			debug("map size:"+size);
+			Dispatcher dispatcher = new Dispatcher();
+			ThreadInfoFactory tif = new ThreadInfoFactory(2,2,2);
+			ThreadInfo ti = tif.getRandom();
+			debug("random:"+ti.toKey());
+			int casNo = -1;
+			IMetaCas metaCasPrevious = null;
+			IMetaCas metaCas = transGet(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
+			assertTrue(metaCas != null);
+			int inject = 0;
+			while(metaCas != null) {
+				transAck(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
+				if(randomErrorTest05()) {
+					Exception exception = new RuntimeException("injected error test #05");
+					metaCas.setUserSpaceException(exception);
+					inject++;
+				}
+				transEnd(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
+				casNo--;
+				metaCasPrevious = metaCas;
+				assertTrue(metaCasPrevious != null);
+				ti = tif.getRandom();
+				debug("random:"+ti.toKey());
+				metaCas = transGet(dispatcher,ti.getNode(),ti.getPid(),ti.getTid(),casNo);
+			}
+			assertTrue(metaCasPrevious.getSystemKey().equals("100"));
+			asExpected("CASes processed count == 100");
+			IOperatingInfo oi = dispatcher.handleGetOperatingInfo();
+			assertTrue(oi.getWorkItemCrFetches() == 100);
+			asExpected("CASes fetched count == 100");
+			long endSuccess = oi.getWorkItemEndSuccesses();
+			long endFailure = oi.getWorkItemEndFailures();
+			long endRetry = oi.getWorkItemEndRetrys();
+			debug("injected errors: "+inject);
+			debug("end success: "+endSuccess);
+			debug("end failure: "+endFailure);
+			debug("end retry: "+endRetry);
+			assertTrue(endSuccess+endFailure == 100);
+			asExpected("CASes failure+success count == 100");
+			assertTrue(endRetry > 0);
+			asExpected("CASes retry count == "+endRetry);
+		}
+		catch(Exception e) {
+			e.printStackTrace();
+			fail("Exception");
+		}
+	}
+	
+	private long seedTest05 = 5;
+	private Random randomTest05 = new Random(seedTest05);
+	private long pctTest05 = 15;
+	
+	private boolean randomErrorTest05() {
+		boolean retVal = false;
+		int n = randomTest05.nextInt(100);
+		if(n < pctTest05) {
+			retVal = true;
+		}
+		return retVal;
 	}
 }

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/user/jd/test/helper/TestJdContainerErrorHandlerRandomRetry.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/user/jd/test/helper/TestJdContainerErrorHandlerRandomRetry.java?rev=1637957&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/user/jd/test/helper/TestJdContainerErrorHandlerRandomRetry.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/user/jd/test/helper/TestJdContainerErrorHandlerRandomRetry.java Mon Nov 10 18:45:51 2014
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+*/
+package org.apache.uima.ducc.user.jd.test.helper;
+
+import java.util.Random;
+
+import org.apache.uima.ducc.user.jd.iface.IJdUserDirective;
+import org.apache.uima.ducc.user.jd.iface.JdUserDirective;
+import org.apache.uima.ducc.user.jd.iface.JdUserErrorHandler;
+
+public class TestJdContainerErrorHandlerRandomRetry extends JdUserErrorHandler {
+
+	private Random random = new Random();
+	
+	@Override
+	public IJdUserDirective handle(String serializedCAS, Exception e) {
+		JdUserDirective jdUserDirective = new JdUserDirective();
+		jdUserDirective.setKillJob();
+		jdUserDirective.setKillProcess();
+		jdUserDirective.resetKillWorkItem();
+		if(random.nextBoolean()) {
+			jdUserDirective.setKillWorkItem();
+		}
+		return jdUserDirective;
+	}
+
+}

Propchange: uima/sandbox/uima-ducc/trunk/uima-ducc-container/src/test/java/org/apache/uima/ducc/user/jd/test/helper/TestJdContainerErrorHandlerRandomRetry.java
------------------------------------------------------------------------------
    svn:eol-style = native