Transient Broker throws NullPointerException and locks up.
----------------------------------------------------------
Key: QPID-540
URL: https://issues.apache.org/jira/browse/QPID-540
Project: Qpid
Issue Type: Bug
Components: Java Broker
Affects Versions: M2
Reporter: Martin Ritchie
Assignee: Martin Ritchie
Fix For: M2
During the testing with the transient configuration the broker threw the
following.
2007-07-11 12:34:24,187 INFO [pool-1278-thread-1] handler.QueueBindHandler
(QueueBindHandler.java:115) - Bind
ing queue Queue(my_queue)@10656878 to exchange
org.apache.qpid.server.exchange.DestNameExchange[amq.direct] wi
th routing key my_queue
Exception in thread "pool-1-thread-13" java.lang.NullPointerException
at
org.apache.qpid.server.queue.WeakReferenceMessageHandle.populateFromMessageMetaData(WeakReferenceMe
ssageHandle.java:80)
at
org.apache.qpid.server.queue.WeakReferenceMessageHandle.loadMessageMetaData(WeakReferenceMessageHan
dle.java:74)
at
org.apache.qpid.server.queue.WeakReferenceMessageHandle.getContentHeaderBody(WeakReferenceMessageHa
ndle.java:64)
at
org.apache.qpid.server.queue.AMQMessage.getContentHeaderBody(AMQMessage.java:328)
at org.apache.qpid.server.queue.AMQMessage.getSize(AMQMessage.java:906)
at
org.apache.qpid.server.queue.ConcurrentSelectorDeliveryManager.getNextMessage(ConcurrentSelectorDel
iveryManager.java:461)
at
org.apache.qpid.server.queue.ConcurrentSelectorDeliveryManager.sendNextMessage(ConcurrentSelectorDe
liveryManager.java:551)
at
org.apache.qpid.server.queue.ConcurrentSelectorDeliveryManager.processQueue(ConcurrentSelectorDeliv
eryManager.java:684)
at
org.apache.qpid.server.queue.ConcurrentSelectorDeliveryManager.access$200(ConcurrentSelectorDeliver
yManager.java:50)
at
org.apache.qpid.server.queue.ConcurrentSelectorDeliveryManager$Runner.run(ConcurrentSelectorDeliver
yManager.java:856)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
This must be due to a message being dequeued but still existing on the queue.
The problem is down to the use of selectors.
If a message is consumed via a selector it is marked as taken and delivered to
the consumer. If the reference count hits zero which it will if the message was
only sent to the one queue. Then the message will be dequeued and any
WeakReference Handles deleted. All as expected. HOWEVER,
The message is still on the main queue. A warning message is logged saying "We
could cleanup the main queue _messages here." It should say SHOULD.
The message is referenced by the main queue and the next subscription (without
a filter) that attempts to read from the queue will walk the _message queue.
The getNextMessage() method will purge the messages that have expired or been
taken. Such as this taken message from the filetered consumer. Problem is, here
we attempt to reduce the _totalMessageSize which has already been done when the
message was delivered. Thus in attempting to retrieve the size of the message
we need to access the Headers that were on a WeakReferenceHandle and so are now
null causing the NPE.
The solution is to only attempt to reduce the _totalMessageSize when we are
purging a message due to a time out. As this is the only path through the
purgeMessage() method that state the message should be purge and the message
has not already been delivered to a consumer of the queue.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.