diff options
-rw-r--r-- | qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueueList.java | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueueList.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueueList.java index d8467d2d8e..0b95b9cc47 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueueList.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueueList.java @@ -72,22 +72,29 @@ public class ConflationQueueList extends SimpleQueueEntryList do { latestValueReference = getOrPutIfAbsent(keyValue, referenceToEntry); - oldEntry = latestValueReference.get(); + oldEntry = latestValueReference == null ? null : latestValueReference.get(); } - while(oldEntry.compareTo(entry) < 0 + while(oldEntry != null + && oldEntry.compareTo(entry) < 0 && oldEntry != getHead() && !latestValueReference.compareAndSet(oldEntry, entry)); - if(oldEntry.compareTo(entry) < 0) + if (oldEntry == null) { - // We replaced some other entry to become the newest value - discardEntry(oldEntry); + // Unlikely: A newer entry came along and was consumed (and entry removed from map) + // during our processing of getOrPutIfAbsent(). In this case we know our entry has been superseded. + discardEntry(entry); } else if (oldEntry.compareTo(entry) > 0) { // A newer entry came along discardEntry(entry); } + else if (oldEntry.compareTo(entry) < 0) + { + // We replaced some other entry to become the newest value + discardEntry(oldEntry); + } entry.setLatestValueReference(latestValueReference); } |