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 | 83ff3bbe6cfd98a58647f460f6ee5823a3de119f (patch) | |
| tree | 382d099bf974f134f5dcf7afe7b6d31e82fbb587 /java | |
| parent | 1a1f33cd91517f6f0be0a9fe644522d281ad757c (diff) | |
| download | qpid-python-83ff3bbe6cfd98a58647f460f6ee5823a3de119f.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/qpid@1336295 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java')
| -rw-r--r-- | java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueueList.java | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueueList.java b/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueueList.java index d8467d2d8e..0b95b9cc47 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueueList.java +++ b/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); } |
