diff --git a/commons/src/main/java/org/archive/queue/StoredQueue.java b/commons/src/main/java/org/archive/queue/StoredQueue.java index 69c137f5..5a160ddc 100644 --- a/commons/src/main/java/org/archive/queue/StoredQueue.java +++ b/commons/src/main/java/org/archive/queue/StoredQueue.java @@ -42,7 +42,8 @@ import com.sleepycat.je.DatabaseException; * * @param */ -public class StoredQueue extends AbstractQueue implements Serializable { +public class StoredQueue extends AbstractQueue +implements Serializable { private static final long serialVersionUID = 3L; private static final Logger logger = Logger.getLogger(StoredQueue.class.getName()); @@ -51,7 +52,8 @@ public class StoredQueue extends AbstractQueue imple transient Database queueDb; // Database AtomicLong tailIndex; // next spot for insert AtomicLong headIndex; // next spot for read - + transient E peekItem = null; + /** * Create a StoredQueue backed by the given Database. * @@ -112,10 +114,14 @@ public class StoredQueue extends AbstractQueue imple @SuppressWarnings("unchecked") public E peek() { synchronized (headIndex) { + if(peekItem != null) { + return peekItem; + } E head = null; while(head == null && headIndex.get() < tailIndex.get()) { head = (E) queueMap.get(headIndex.get()); if(head != null) { + peekItem = head; return head; } // ERROR; should never be null with headIndex < tailIndex @@ -133,7 +139,9 @@ public class StoredQueue extends AbstractQueue imple synchronized (headIndex) { E head = peek(); if(head!=null) { - return (E) queueMap.remove(headIndex.getAndIncrement()); + queueMap.remove(headIndex.getAndIncrement()); + peekItem = null; + return head; } else { return null; } diff --git a/commons/src/main/java/org/archive/queue/StoredQueueTest.java b/commons/src/main/java/org/archive/queue/StoredQueueTest.java index ea2537e3..b5c9a1d5 100644 --- a/commons/src/main/java/org/archive/queue/StoredQueueTest.java +++ b/commons/src/main/java/org/archive/queue/StoredQueueTest.java @@ -130,6 +130,13 @@ public class StoredQueueTest extends TmpDirTestCase { // do nothing } } + + public void testIdentity() { + fill(queue,10); + String peek1 = queue.peek(); + String peek2 = queue.peek(); + assertTrue("peeks of same item note identical object",peek1==peek2); + } public void xestTimingsAgainstLinkedBlockingQueue() { tryTimings(50000);