diff options
author | Keith Wall <kwall@apache.org> | 2012-05-09 16:56:56 +0000 |
---|---|---|
committer | Keith Wall <kwall@apache.org> | 2012-05-09 16:56:56 +0000 |
commit | 2097a70e0e26af15de393a1129fd3ebeccd7b96b (patch) | |
tree | 55d3e720468669d496d46f45a6aa1ed3a1b6a917 | |
parent | b72b71c60b33c5496b2fdc9df32185e535dde147 (diff) | |
download | qpid-python-2097a70e0e26af15de393a1129fd3ebeccd7b96b.tar.gz |
QPID-3979: [Java Broker] Conflation queues: guard NPE identified by review feedback.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1336295 13f79535-47bb-0310-9956-ffa450edef68
-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); } |