summaryrefslogtreecommitdiff
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
commit2097a70e0e26af15de393a1129fd3ebeccd7b96b (patch)
tree55d3e720468669d496d46f45a6aa1ed3a1b6a917
parentb72b71c60b33c5496b2fdc9df32185e535dde147 (diff)
downloadqpid-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.java17
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);
}