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


Reply via email to