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> |
Free forum by Nabble | Edit this page |