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
commit390ada5ead3c8ef5db97440f310b5a20a92c3df6 (patch)
tree382d099bf974f134f5dcf7afe7b6d31e82fbb587 /java
parent459fec0413ca1d59e68d2151a6465480eef8160d (diff)
downloadqpid-python-390ada5ead3c8ef5db97440f310b5a20a92c3df6.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);
}