You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2011/02/16 12:14:54 UTC
svn commit: r1071207 -
/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java
Author: cziegeler
Date: Wed Feb 16 11:14:54 2011
New Revision: 1071207
URL: http://svn.apache.org/viewvc?rev=1071207&view=rev
Log:
SLING-1982 : Potential deadlock if job manager is restarted
Modified:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java
Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java?rev=1071207&r1=1071206&r2=1071207&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java Wed Feb 16 11:14:54 2011
@@ -213,20 +213,23 @@ public class DefaultJobManager
* @see java.lang.Runnable#run()
*/
private void cleanup() {
- this.schedulerRuns++;
+ // check for unprocessed jobs first
+ for(final AbstractJobQueue jbq : this.queues.values() ) {
+ jbq.checkForUnprocessedJobs();
+ }
+
// we only do a full clean up on every fifth run
+ this.schedulerRuns++;
final boolean doFullCleanUp = (schedulerRuns % 5 == 0);
- // check for idle queue
- // we synchronize to avoid creating a queue which is about to be removed during cleanup
- synchronized ( queuesLock ) {
- final Iterator<Map.Entry<String, AbstractJobQueue>> i = this.queues.entrySet().iterator();
- while ( i.hasNext() ) {
- final Map.Entry<String, AbstractJobQueue> current = i.next();
- // clean up
- final AbstractJobQueue jbq = current.getValue();
- jbq.checkForUnprocessedJobs();
- if ( doFullCleanUp ) {
+ if ( doFullCleanUp ) {
+ // check for idle queue
+ // we synchronize to avoid creating a queue which is about to be removed during cleanup
+ synchronized ( queuesLock ) {
+ final Iterator<Map.Entry<String, AbstractJobQueue>> i = this.queues.entrySet().iterator();
+ while ( i.hasNext() ) {
+ final Map.Entry<String, AbstractJobQueue> current = i.next();
+ final AbstractJobQueue jbq = current.getValue();
if ( jbq.isMarkedForRemoval() ) {
// close
jbq.close();