summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorKeith Wall <kwall@apache.org>2012-05-09 16:56:56 +0000
committerKeith Wall <kwall@apache.org>2012-05-09 16:56:56 +0000
commit83ff3bbe6cfd98a58647f460f6ee5823a3de119f (patch)
tree382d099bf974f134f5dcf7afe7b6d31e82fbb587 /java
parent1a1f33cd91517f6f0be0a9fe644522d281ad757c (diff)
downloadqpid-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.java17
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);
}