Author: jacopoc
Date: Tue Jan 27 14:02:50 2015 New Revision: 1655046 URL: http://svn.apache.org/r1655046 Log: Moved out from JobManager.getInstance the call to reloadCrashedJobs because it was causing a deadlock issue at bootstrap when an eca rule of type "validate" is defined on the JobSandbox entity. At bootstrap an eca definition like the following: <eca entity="JobSandbox" operation="store" event="validate"> <action service="ping" mode="sync"/> </eca> is causing a deadlock because it is triggered at startup when the reloadCrashedJobs method is executed; reloadCrashedJobs is executed holding a lock on the JobManager object; within this method a "find" operation is performed that (because of the "validate" event) triggers the action; but for this a getDispatchContext is executed and this blocks until the task (executed by a thread Executor) that reads and setups the eca rules is complete; but this task requires a lock on the same JobManager object and thus we get the deadlock Thanks to Arun Patidar and Deepak Dixit for analyzing the issue with me. Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobPoller.java Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java?rev=1655046&r1=1655045&r2=1655046&view=diff ============================================================================== --- ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java (original) +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java Tue Jan 27 14:02:50 2015 @@ -94,7 +94,6 @@ public final class JobManager { registeredManagers.putIfAbsent(delegator.getDelegatorName(), jm); jm = registeredManagers.get(delegator.getDelegatorName()); if (enablePoller) { - jm.reloadCrashedJobs(); JobPoller.registerJobManager(jm); } } @@ -280,7 +279,7 @@ public final class JobManager { return poll; } - private synchronized void reloadCrashedJobs() { + public synchronized void reloadCrashedJobs() { assertIsRunning(); if (crashedJobsReloaded) { return; Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobPoller.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobPoller.java?rev=1655046&r1=1655045&r2=1655046&view=diff ============================================================================== --- ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobPoller.java (original) +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobPoller.java Tue Jan 27 14:02:50 2015 @@ -220,6 +220,7 @@ public final class JobPoller implements Collection<JobManager> jmCollection = jobManagers.values(); List<Iterator<Job>> pollResults = new ArrayList<Iterator<Job>>(); for (JobManager jm : jmCollection) { + jm.reloadCrashedJobs(); pollResults.add(jm.poll(remainingCapacity).iterator()); } // Create queue candidate list from "list of lists" |
Free forum by Nabble | Edit this page |