You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2015/01/27 15:02:50 UTC

svn commit: r1655046 - in /ofbiz/trunk/framework/service/src/org/ofbiz/service/job: JobManager.java JobPoller.java

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"