From d777c198bdafbfee6484344f309d0f1faf9dccd2 Mon Sep 17 00:00:00 2001 From: Noah Levitt Date: Thu, 24 Apr 2014 17:23:01 -0700 Subject: [PATCH] HER-2065 - in activateInactiveQueue() close synchronized block earlier, and move updateHighestWaiting() up to keep it inside the block; now the call to deactivateQueue() is not in the synchronized block, so the deadlock should be avoided (fix suggested by kenji) --- .../crawler/frontier/WorkQueueFrontier.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/engine/src/main/java/org/archive/crawler/frontier/WorkQueueFrontier.java b/engine/src/main/java/org/archive/crawler/frontier/WorkQueueFrontier.java index 881e87c6..955d3fce 100644 --- a/engine/src/main/java/org/archive/crawler/frontier/WorkQueueFrontier.java +++ b/engine/src/main/java/org/archive/crawler/frontier/WorkQueueFrontier.java @@ -764,32 +764,33 @@ implements Closeable, Queue queueOfWorkQueueKeys = entry.getValue(); while (true) { + String workQueueKey; synchronized (getInactiveQueuesByPrecedence()) { - String workQueueKey = queueOfWorkQueueKeys.poll(); + workQueueKey = queueOfWorkQueueKeys.poll(); if (workQueueKey == null) { break; } - - WorkQueue candidateQ = (WorkQueue) this.allQueues.get(workQueueKey); - if (candidateQ.getPrecedence() > expectedPrecedence) { - // queue demoted since placed; re-deactivate - deactivateQueue(candidateQ); - candidateQ.makeDirty(); - continue; - } - updateHighestWaiting(expectedPrecedence); - try { - readyClassQueues.put(workQueueKey); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - - return true; } + + WorkQueue candidateQ = (WorkQueue) this.allQueues.get(workQueueKey); + if (candidateQ.getPrecedence() > expectedPrecedence) { + // queue demoted since placed; re-deactivate + deactivateQueue(candidateQ); + candidateQ.makeDirty(); + continue; + } + + try { + readyClassQueues.put(workQueueKey); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + return true; } } - + return false; }