[HER-1850] IllegalStateException from WorkQueueFrontier.wakeQueues in BlockIterator

* WorkQueueFrontier.java
    double in-memory snoozedClassQueues size
    protect all adds/removes to snoozedOverflow in synchronized blocks
This commit is contained in:
gojomo
2010-12-09 22:28:20 +00:00
parent c1b8138d4d
commit ea49e55c89
@@ -201,7 +201,7 @@ implements Closeable,
transient protected DelayQueue<DelayedWorkQueue> snoozedClassQueues;
protected StoredSortedMap<Long,DelayedWorkQueue> snoozedOverflow;
protected AtomicInteger snoozedOverflowCount = new AtomicInteger(0);
protected static int MAX_SNOOZED_IN_MEMORY = 5000;
protected static int MAX_SNOOZED_IN_MEMORY = 10000;
/** URIs scheduled to be re-enqueued at future date */
protected StoredSortedMap<Long, CrawlURI> futureUris;
@@ -844,6 +844,7 @@ implements Closeable,
queue.setWakeTime(0);
reenqueueQueue(queue);
iterOverflow.remove();
snoozedOverflowCount.decrementAndGet();
}
}
@@ -858,15 +859,19 @@ implements Closeable,
reenqueueQueue(queue);
}
// also consider overflow (usually empty)
Iterator<DelayedWorkQueue> iter =
snoozedOverflow.headMap(System.currentTimeMillis()).values().iterator();
while(iter.hasNext()) {
DelayedWorkQueue dq = iter.next();
iter.remove();
snoozedOverflowCount.decrementAndGet();
WorkQueue queue = dq.getWorkQueue(this);
queue.setWakeTime(0);
reenqueueQueue(queue);
if(!snoozedOverflow.isEmpty()) {
synchronized(snoozedOverflow) {
Iterator<DelayedWorkQueue> iter =
snoozedOverflow.headMap(System.currentTimeMillis()).values().iterator();
while(iter.hasNext()) {
DelayedWorkQueue dq = iter.next();
iter.remove();
snoozedOverflowCount.decrementAndGet();
WorkQueue queue = dq.getWorkQueue(this);
queue.setWakeTime(0);
reenqueueQueue(queue);
}
}
}
}
@@ -1012,8 +1017,10 @@ implements Closeable,
if(snoozedClassQueues.size()<MAX_SNOOZED_IN_MEMORY) {
snoozedClassQueues.add(dq);
} else {
snoozedOverflow.put(nextTime, dq);
snoozedOverflowCount.incrementAndGet();
synchronized(snoozedOverflow) {
snoozedOverflow.put(nextTime, dq);
snoozedOverflowCount.incrementAndGet();
}
}
}