Author: jonesde
Date: Sat Sep  8 03:32:18 2007
New Revision: 573813

URL: http://svn.apache.org/viewvc?rev=573813&view=rev
Log:
These failure cases are now running properly, though for the first lock wait 
timeout I still don't like the error results because it is hard to identify for 
retry purposes; whatever the case, here they are; NOTE these WILL all fail 
right now and that is expected, these are in anticipation of new Service Engine 
features to automatically recover from these errors

Added:
    
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryCantRecoverAssertData.xml
   (with props)
Modified:
    ofbiz/trunk/framework/service/servicedef/services_test_se.xml
    
ofbiz/trunk/framework/service/src/org/ofbiz/service/test/ServiceEngineTestServices.java
    
ofbiz/trunk/framework/service/testdef/data/ServiceDeadLockRetryAssertData.xml
    
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryAssertData.xml
    ofbiz/trunk/framework/service/testdef/data/ServiceTestData.xml
    ofbiz/trunk/framework/service/testdef/servicetests.xml

Modified: ofbiz/trunk/framework/service/servicedef/services_test_se.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/servicedef/services_test_se.xml?rev=573813&r1=573812&r2=573813&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/servicedef/services_test_se.xml (original)
+++ ofbiz/trunk/framework/service/servicedef/services_test_se.xml Sat Sep  8 
03:32:18 2007
@@ -29,10 +29,10 @@
         location="org.ofbiz.service.test.ServiceEngineTestServices" 
invoke="testServiceDeadLockRetry">
         <implements service="testServiceInterface"/>
     </service>
-    <service name="testServiceDeadLockRetryThreadA" engine="java" auth="false"
+    <service name="testServiceDeadLockRetryThreadA" engine="java" auth="false" 
transaction-timeout="10"
         location="org.ofbiz.service.test.ServiceEngineTestServices" 
invoke="testServiceDeadLockRetryThreadA">
     </service>
-    <service name="testServiceDeadLockRetryThreadB" engine="java" auth="false"
+    <service name="testServiceDeadLockRetryThreadB" engine="java" auth="false" 
transaction-timeout="4"
         location="org.ofbiz.service.test.ServiceEngineTestServices" 
invoke="testServiceDeadLockRetryThreadB">
     </service>
     
@@ -41,10 +41,19 @@
         location="org.ofbiz.service.test.ServiceEngineTestServices" 
invoke="testServiceLockWaitTimeoutRetry">
         <implements service="testServiceInterface"/>
     </service>
-    <service name="testServiceLockWaitTimeoutRetryGrabber" engine="java" 
auth="false"
+    <service name="testServiceLockWaitTimeoutRetryGrabber" engine="java" 
auth="false" transaction-timeout="6"
         location="org.ofbiz.service.test.ServiceEngineTestServices" 
invoke="testServiceLockWaitTimeoutRetryGrabber">
     </service>
-    <service name="testServiceLockWaitTimeoutRetryWaiter" engine="java" 
auth="false"
+    <service name="testServiceLockWaitTimeoutRetryWaiter" engine="java" 
auth="false" transaction-timeout="2"
         location="org.ofbiz.service.test.ServiceEngineTestServices" 
invoke="testServiceLockWaitTimeoutRetryWaiter">
+    </service>
+    
+    <!-- lock wait timeout retry testing services - a scenario that I can't 
figure out yet how to recover automatically -->
+    <service name="testServiceLockWaitTimeoutRetryCantRecover" engine="java" 
auth="false" transaction-timeout="2"
+        location="org.ofbiz.service.test.ServiceEngineTestServices" 
invoke="testServiceLockWaitTimeoutRetryCantRecover">
+        <implements service="testServiceInterface"/>
+    </service>
+    <service name="testServiceLockWaitTimeoutRetryCantRecoverWaiter" 
engine="java" auth="false" transaction-timeout="4"
+        location="org.ofbiz.service.test.ServiceEngineTestServices" 
invoke="testServiceLockWaitTimeoutRetryCantRecoverWaiter">
     </service>
 </services>

Modified: 
ofbiz/trunk/framework/service/src/org/ofbiz/service/test/ServiceEngineTestServices.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/test/ServiceEngineTestServices.java?rev=573813&r1=573812&r2=573813&view=diff
==============================================================================
--- 
ofbiz/trunk/framework/service/src/org/ofbiz/service/test/ServiceEngineTestServices.java
 (original)
+++ 
ofbiz/trunk/framework/service/src/org/ofbiz/service/test/ServiceEngineTestServices.java
 Sat Sep  8 03:32:18 2007
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*
  * 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
@@ -15,7 +15,7 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- 
*******************************************************************************/
+ */
 package org.ofbiz.service.test;
 
 import java.util.Map;
@@ -26,6 +26,7 @@
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericValue;
 import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.GenericResultWaiter;
 import org.ofbiz.service.GenericServiceException;
 import org.ofbiz.service.LocalDispatcher;
 import org.ofbiz.service.ServiceUtil;
@@ -37,11 +38,16 @@
     public static Map testServiceDeadLockRetry(DispatchContext dctx, Map 
context) {
         LocalDispatcher dispatcher = dctx.getDispatcher();
         try {
-            dispatcher.runAsync("testServiceDeadLockRetryThreadA", null, 
false);
-            dispatcher.runAsync("testServiceDeadLockRetryThreadB", null, 
false);
-        } catch (GenericServiceException e) {
+            // NOTE using persist=false so that the lock retry will have to 
fix the problem instead of the job poller picking it up again
+            GenericResultWaiter threadAWaiter = 
dispatcher.runAsyncWait("testServiceDeadLockRetryThreadA", null, false);
+            GenericResultWaiter threadBWaiter = 
dispatcher.runAsyncWait("testServiceDeadLockRetryThreadB", null, false);
+            // make sure to wait for these to both finish to make sure results 
aren't checked until they are done
+            threadAWaiter.waitForResult();
+            threadBWaiter.waitForResult();
+        } catch (Exception e) {
             String errMsg = "Error running deadlock test services: " + 
e.toString();
             Debug.logError(e, errMsg, module);
+            return ServiceUtil.returnError(errMsg);
         }
         
         return ServiceUtil.returnSuccess();
@@ -53,14 +59,16 @@
         try {
             // grab entity SVCLRT_A by changing, then wait, then find and 
change SVCLRT_B
             GenericValue testingTypeA = 
delegator.findByPrimaryKey("TestingType", UtilMisc.toMap("testingTypeId", 
"SVCLRT_A"));
-            testingTypeA.set("description", "New description for SVCLRT_A");
+            testingTypeA.set("description", "New description for SVCLRT_A from 
Thread A");
             testingTypeA.store();
             
             // wait at least long enough for the other method to have locked 
resource B
-            ServiceEngineTestServices.class.wait(100);
+            Debug.logInfo("In testServiceDeadLockRetryThreadA just updated 
SVCLRT_A, beginning wait", module);
+            UtilMisc.staticWait(100);
 
+            Debug.logInfo("In testServiceDeadLockRetryThreadA done with wait, 
updating SVCLRT_B", module);
             GenericValue testingTypeB = 
delegator.findByPrimaryKey("TestingType", UtilMisc.toMap("testingTypeId", 
"SVCLRT_B"));
-            testingTypeB.set("description", "New description for SVCLRT_B");
+            testingTypeB.set("description", "New description for SVCLRT_B from 
Thread A");
             testingTypeB.store();
         } catch (GenericEntityException e) {
             String errMsg = "Entity Engine Exception running dead lock test 
thread A: " + e.toString();
@@ -80,14 +88,16 @@
         try {
             // grab entity SVCLRT_B by changing, then wait, then change 
SVCLRT_A
             GenericValue testingTypeB = 
delegator.findByPrimaryKey("TestingType", UtilMisc.toMap("testingTypeId", 
"SVCLRT_B"));
-            testingTypeB.set("description", "New description for SVCLRT_B");
+            testingTypeB.set("description", "New description for SVCLRT_B from 
Thread B");
             testingTypeB.store();
             
             // wait at least long enough for the other method to have locked 
resource B
-            ServiceEngineTestServices.class.wait(100);
+            Debug.logInfo("In testServiceDeadLockRetryThreadB just updated 
SVCLRT_B, beginning wait", module);
+            UtilMisc.staticWait(100);
 
+            Debug.logInfo("In testServiceDeadLockRetryThreadB done with wait, 
updating SVCLRT_A", module);
             GenericValue testingTypeA = 
delegator.findByPrimaryKey("TestingType", UtilMisc.toMap("testingTypeId", 
"SVCLRT_A"));
-            testingTypeA.set("description", "New description for SVCLRT_A");
+            testingTypeA.set("description", "New description for SVCLRT_A from 
Thread B");
             testingTypeA.store();
         } catch (GenericEntityException e) {
             String errMsg = "Entity Engine Exception running dead lock test 
thread B: " + e.toString();
@@ -105,11 +115,16 @@
     public static Map testServiceLockWaitTimeoutRetry(DispatchContext dctx, 
Map context) {
         LocalDispatcher dispatcher = dctx.getDispatcher();
         try {
-            dispatcher.runAsync("testServiceDeadLockRetryThreadA", null, 
false);
-            dispatcher.runAsync("testServiceDeadLockRetryThreadB", null, 
false);
-        } catch (GenericServiceException e) {
+            // NOTE using persist=false so that the lock retry will have to 
fix the problem instead of the job poller picking it up again
+            GenericResultWaiter grabberWaiter = 
dispatcher.runAsyncWait("testServiceLockWaitTimeoutRetryGrabber", null, false);
+            GenericResultWaiter waiterWaiter = 
dispatcher.runAsyncWait("testServiceLockWaitTimeoutRetryWaiter", null, false);
+            // make sure to wait for these to both finish to make sure results 
aren't checked until they are done
+            grabberWaiter.waitForResult();
+            waiterWaiter.waitForResult();
+        } catch (Exception e) {
             String errMsg = "Error running deadlock test services: " + 
e.toString();
             Debug.logError(e, errMsg, module);
+            return ServiceUtil.returnError(errMsg);
         }
         
         return ServiceUtil.returnSuccess();
@@ -120,12 +135,14 @@
         try {
             // grab entity SVCLWTRT by changing, then wait a LONG time, ie 
more than the wait timeout
             GenericValue testingType = 
delegator.findByPrimaryKey("TestingType", UtilMisc.toMap("testingTypeId", 
"SVCLWTRT"));
-            testingType.set("description", "New description for SVCLWTRT");
+            testingType.set("description", "New description for SVCLWTRT from 
the GRABBER service, this should be replaced by Waiter service in the service 
engine auto-retry");
             testingType.store();
+
+            Debug.logInfo("In testServiceLockWaitTimeoutRetryGrabber just 
updated SVCLWTRT, beginning wait", module);
             
-            // wait at least long enough for the other method to have locked 
resource wiat time out
-            // wait 100 seconds
-            ServiceEngineTestServices.class.wait(100 * 1000);
+            // wait at least long enough for the other method to have locked 
resource wait time out
+            // (tx timeout 6s on this the Grabber and 2s on the Waiter): wait 
4 seconds because timeout on this
+            UtilMisc.staticWait(4 * 1000);
         } catch (GenericEntityException e) {
             String errMsg = "Entity Engine Exception running lock wait timeout 
test Grabber thread: " + e.toString();
             Debug.logError(e, errMsg, module);
@@ -142,11 +159,79 @@
         GenericDelegator delegator = dctx.getDelegator();
 
         try {
+            // wait for a small amount of time to make sure the grabber does 
it's thing first
+            UtilMisc.staticWait(100);
+            
+            Debug.logInfo("In testServiceLockWaitTimeoutRetryWaiter about to 
update SVCLWTRT, wait starts here", module);
+            
             // TRY grab entity SVCLWTRT by looking up and changing, should get 
a lock wait timeout exception because of the Grabber thread
             GenericValue testingType = 
delegator.findByPrimaryKey("TestingType", UtilMisc.toMap("testingTypeId", 
"SVCLWTRT"));
-            testingType.set("description", "New description for SVCLWTRT");
+            testingType.set("description", "New description for SVCLWTRT from 
Waiter service, this is the value that should be there.");
+            testingType.store();
+            
+            Debug.logInfo("In testServiceLockWaitTimeoutRetryWaiter 
successfully updated SVCLWTRT", module);
+        } catch (GenericEntityException e) {
+            String errMsg = "Entity Engine Exception running lock wait timeout 
test Waiter thread: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            return ServiceUtil.returnError(errMsg);
+        } catch (InterruptedException e) {
+            String errMsg = "Wait Interrupted Exception running lock wait 
timeout test Waiter thread: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            return ServiceUtil.returnError(errMsg);
+        }
+
+        return ServiceUtil.returnSuccess();
+    }
+
+    /**
+     * NOTE that this is a funny case where the auto-retry in the service 
engine for the call to
+     * testServiceLockWaitTimeoutRetryCantRecoverWaiter would NOT be able to 
recover because it would try again
+     * given the new transaction and all, but the lock for the waiting thread 
would still be there... so it will fail 
+     * repeatedly.
+     * 
+     * TODO: there's got to be some way to do this, but how?!? :(
+     * 
+     * @param dctx
+     * @param context
+     * @return
+     */
+    public static Map 
testServiceLockWaitTimeoutRetryCantRecover(DispatchContext dctx, Map context) {
+        GenericDelegator delegator = dctx.getDelegator();
+        LocalDispatcher dispatcher = dctx.getDispatcher();
+        try {
+            // grab entity SVCLWTRTCR by changing, then wait a LONG time, ie 
more than the wait timeout
+            GenericValue testingType = 
delegator.findByPrimaryKey("TestingType", UtilMisc.toMap("testingTypeId", 
"SVCLWTRTCR"));
+            testingType.set("description", "New description for SVCLWTRTCR 
from Lock Wait Timeout Lock GRABBER, this should be replaced by the one in the 
Waiter service.");
+            testingType.store();
+
+            Debug.logInfo("In testServiceLockWaitTimeoutRetryCantRecover 
(grabber) just updated SVCLWTRTCR, running sub-service in own transaction", 
module);
+            // timeout is 5 seconds so it is longer than the tx timeout for 
this service, so will fail quickly; with this transaction keeping a lock on the 
record and that one trying to get it, bam we cause the error
+            
dispatcher.runSync("testServiceLockWaitTimeoutRetryCantRecoverWaiter", null, 5, 
true);
+            
+            Debug.logInfo("In testServiceLockWaitTimeoutRetryCantRecover 
(grabber) successfully finished running sub-service in own transaction", 
module);
+        } catch (GenericServiceException e) {
+            String errMsg = "Error running deadlock test services: " + 
e.toString();
+            Debug.logError(e, errMsg, module);
+        } catch (GenericEntityException e) {
+            String errMsg = "Entity Engine Exception running lock wait timeout 
test main/Grabber thread: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            return ServiceUtil.returnError(errMsg);
+        }
+        
+        return ServiceUtil.returnSuccess();
+    }
+    public static Map 
testServiceLockWaitTimeoutRetryCantRecoverWaiter(DispatchContext dctx, Map 
context) {
+        GenericDelegator delegator = dctx.getDelegator();
+
+        try {
+            Debug.logInfo("In testServiceLockWaitTimeoutRetryCantRecoverWaiter 
updating SVCLWTRTCR", module);
+
+            // TRY grab entity SVCLWTRTCR by looking up and changing, should 
get a lock wait timeout exception because of the Grabber thread
+            GenericValue testingType = 
delegator.findByPrimaryKey("TestingType", UtilMisc.toMap("testingTypeId", 
"SVCLWTRTCR"));
+            testingType.set("description", "New description for SVCLWTRTCR 
from Lock Wait Timeout Lock Waiter, this is the value that should be there.");
             testingType.store();
             
+            Debug.logInfo("In testServiceLockWaitTimeoutRetryCantRecoverWaiter 
successfully updated SVCLWTRTCR", module);
         } catch (GenericEntityException e) {
             String errMsg = "Entity Engine Exception running lock wait timeout 
test Waiter thread: " + e.toString();
             Debug.logError(e, errMsg, module);

Modified: 
ofbiz/trunk/framework/service/testdef/data/ServiceDeadLockRetryAssertData.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/testdef/data/ServiceDeadLockRetryAssertData.xml?rev=573813&r1=573812&r2=573813&view=diff
==============================================================================
--- 
ofbiz/trunk/framework/service/testdef/data/ServiceDeadLockRetryAssertData.xml 
(original)
+++ 
ofbiz/trunk/framework/service/testdef/data/ServiceDeadLockRetryAssertData.xml 
Sat Sep  8 03:32:18 2007
@@ -19,6 +19,6 @@
 -->
 <entity-engine-xml>
     <!-- assert data for service dead lock recovery test -->
-    <TestingType testingTypeId="SVCLRT_A" description="New description for 
SVCLRT_A"/>
-    <TestingType testingTypeId="SVCLRT_B" description="New description for 
SVCLRT_B"/>
+    <TestingType testingTypeId="SVCLRT_A" description="New description for 
SVCLRT_A from Thread B"/>
+    <TestingType testingTypeId="SVCLRT_B" description="New description for 
SVCLRT_B from Thread A"/>
 </entity-engine-xml>

Modified: 
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryAssertData.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryAssertData.xml?rev=573813&r1=573812&r2=573813&view=diff
==============================================================================
--- 
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryAssertData.xml
 (original)
+++ 
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryAssertData.xml
 Sat Sep  8 03:32:18 2007
@@ -19,5 +19,5 @@
 -->
 <entity-engine-xml>
     <!-- assert data for service lock wait timeout recovery test -->
-    <TestingType testingTypeId="SVCLWTRT" description="New description for 
SVCLWTRT"/>
+    <TestingType testingTypeId="SVCLWTRT" description="New description for 
SVCLWTRT from Waiter service, this is the value that should be there."/>
 </entity-engine-xml>

Added: 
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryCantRecoverAssertData.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryCantRecoverAssertData.xml?rev=573813&view=auto
==============================================================================
--- 
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryCantRecoverAssertData.xml
 (added)
+++ 
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryCantRecoverAssertData.xml
 Sat Sep  8 03:32:18 2007
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<entity-engine-xml>
+    <!-- assert data for service lock wait timeout recovery test -->
+    <TestingType testingTypeId="SVCLWTRT" description="New description for 
SVCLWTRTCR from Lock Wait Timeout Lock Waiter, this is the value that should be 
there."/>
+</entity-engine-xml>

Propchange: 
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryCantRecoverAssertData.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryCantRecoverAssertData.xml
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Author URL Id"

Propchange: 
ofbiz/trunk/framework/service/testdef/data/ServiceLockTimeoutRetryCantRecoverAssertData.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: ofbiz/trunk/framework/service/testdef/data/ServiceTestData.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/testdef/data/ServiceTestData.xml?rev=573813&r1=573812&r2=573813&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/testdef/data/ServiceTestData.xml (original)
+++ ofbiz/trunk/framework/service/testdef/data/ServiceTestData.xml Sat Sep  8 
03:32:18 2007
@@ -24,4 +24,7 @@
     
     <!-- load data for service lock wait timeout recovery test -->
     <TestingType testingTypeId="SVCLWTRT" description="Original description 
for SVCLWTRT"/>
+    
+    <!-- load data for service lock wait timeout recovery test - case that 
can't find a way to auto-fix -->
+    <TestingType testingTypeId="SVCLWTRTCR" description="Original description 
for SVCLWTRTCR"/>
 </entity-engine-xml>

Modified: ofbiz/trunk/framework/service/testdef/servicetests.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/testdef/servicetests.xml?rev=573813&r1=573812&r2=573813&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/testdef/servicetests.xml (original)
+++ ofbiz/trunk/framework/service/testdef/servicetests.xml Sat Sep  8 03:32:18 
2007
@@ -33,9 +33,16 @@
         <entity-xml action="assert" 
entity-xml-url="component://service/testdef/data/ServiceDeadLockRetryAssertData.xml"/>
     </test-case>
     <test-case case-name="service-lock-wait-timeout-retry-test">
-        <service-test service-name="testServiceDeadLockRetry"/>
+        <service-test service-name="testServiceLockWaitTimeoutRetry"/>
     </test-case>
     <test-case case-name="service-lock-wait-timeout-retry-assert-data">
         <entity-xml action="assert" 
entity-xml-url="component://service/testdef/data/ServiceLockTimeoutRetryAssertData.xml"/>
+    </test-case>
+    
+    <test-case case-name="service-lock-wait-timeout-retry-test">
+        <service-test 
service-name="testServiceLockWaitTimeoutRetryCantRecover"/>
+    </test-case>
+    <test-case case-name="service-lock-wait-timeout-retry-assert-data">
+        <entity-xml action="assert" 
entity-xml-url="component://service/testdef/data/ServiceLockTimeoutRetryCantRecoverAssertData.xml"/>
     </test-case>
 </test-suite>


Reply via email to