Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
Description
In CallableQueueService:
queue = new PollablePriorityDelayQueue<CallableWrapper>(3, 1000 * 30, TimeUnit.MILLISECONDS, queueSize) { @Override protected boolean eligibleToPoll(QueueElement<?> element) { if (element != null) { CallableWrapper wrapper = (CallableWrapper) element; if (element.getElement() != null) { return callableReachMaxConcurrency(wrapper.getElement()); } } return false; } };
elegibleToPoll() doesn't check if delay is -ve and in PollablePriorityQueue.poll() iterates over all elements and return any element whose concurrency is not maxed. The element returned can be an element with +ve delay which implies the element is still not up for execution(delay is not elapsed yet), but is picked up for execution
Iterator<QueueElement<E>> iter = queues[i - 1].iterator(); while(e == null && iter.hasNext()) { e = iter.next(); if (eligibleToPoll(e)) { queues[i - 1].remove(e); } else { debug("poll(): the iterator element [{0}], from P[{1}] is not eligible to poll", e.getElement().toString(), i); e = null; } }