Alex Rudyy created QPID-6510:
--------------------------------
Summary: [0.8/0.9.x/0.10 JMS Client] An instance initializer in
org.apache.qpid.filter.PropertyExpression may cause an indefinite loop in
HashMap.put() when instances of PropertyExpression are created from different
threads at the same time
Key: QPID-6510
URL: https://issues.apache.org/jira/browse/QPID-6510
Project: Qpid
Issue Type: Bug
Components: Java Client
Affects Versions: 0.32, 0.30, 0.28, 0.26, 0.24, 0.22, 0.20, 0.18, 0.16,
0.14, 0.12, 0.10, 0.8
Reporter: Alex Rudyy
Fix For: 6.0 [Java]
Static field org.apache.qpid.filter.PropertyExpression.JMS_PROPERTY_EXPRESSIONS
is modified in instance initialization block of PropertyExpression. Instance
initializer is called on each instance creation causing unnecessary
modification of JMS_PROPERTY_EXPRESSIONS and in some causes it might result in
indefinite loops in HashMap.put as HashMap is not thread safe.
Replacing instance initializer with static initializer should solve the problem.
Here is a sample stack traces demonstrating the issue
{noformat}
"cancelConsumer-1" prio=6 tid=0x00000000114ea000 nid=0x2b10 runnable
[0x00000000135ee000]
java.lang.Thread.State: RUNNABLE
at java.util.HashMap.put(HashMap.java:494)
at
org.apache.qpid.filter.PropertyExpression.<init>(PropertyExpression.java:67)
at
org.apache.qpid.filter.selector.SelectorParser.variable(SelectorParser.java:537)
at
org.apache.qpid.filter.selector.SelectorParser.primaryExpr(SelectorParser.java:451)
at
org.apache.qpid.filter.selector.SelectorParser.unaryExpr(SelectorParser.java:425)
at
org.apache.qpid.filter.selector.SelectorParser.multExpr(SelectorParser.java:359)
at
org.apache.qpid.filter.selector.SelectorParser.addExpression(SelectorParser.java:328)
at
org.apache.qpid.filter.selector.SelectorParser.comparisonExpression(SelectorParser.java:180)
at
org.apache.qpid.filter.selector.SelectorParser.equalityExpression(SelectorParser.java:125)
at
org.apache.qpid.filter.selector.SelectorParser.andExpression(SelectorParser.java:104)
at
org.apache.qpid.filter.selector.SelectorParser.orExpression(SelectorParser.java:83)
at
org.apache.qpid.filter.selector.SelectorParser.JmsSelector(SelectorParser.java:75)
at
org.apache.qpid.filter.selector.SelectorParser.parse(SelectorParser.java:53)
at
org.apache.qpid.client.filter.JMSSelectorFilter.<init>(JMSSelectorFilter.java:56)
at
org.apache.qpid.client.BasicMessageConsumer.<init>(BasicMessageConsumer.java:166)
at
org.apache.qpid.client.BasicMessageConsumer_0_8.<init>(BasicMessageConsumer_0_8.java:57)
at
org.apache.qpid.client.AMQSession_0_8.createMessageConsumer(AMQSession_0_8.java:471)
at
org.apache.qpid.client.AMQSession_0_8.createMessageConsumer(AMQSession_0_8.java:57)
at org.apache.qpid.client.AMQSession$4.execute(AMQSession.java:2009)
at org.apache.qpid.client.AMQSession$4.execute(AMQSession.java:1999)
at
org.apache.qpid.client.AMQConnectionDelegate_8_0.executeRetrySupport(AMQConnectionDelegate_8_0.java:331)
- locked <0x00000007c3ebd1d0> (a java.lang.Object)
at
org.apache.qpid.client.AMQConnection.executeRetrySupport(AMQConnection.java:608)
at
org.apache.qpid.client.failover.FailoverRetrySupport.execute(FailoverRetrySupport.java:102)
at
org.apache.qpid.client.AMQSession.createConsumerImpl(AMQSession.java:1997)
at org.apache.qpid.client.AMQSession.createConsumer(AMQSession.java:980)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.createConsumer(AbstractMessageListenerContainer.java:820)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.createListenerConsumer(AbstractPollingMessageListenerContainer.java:206)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary(DefaultMessageListenerContainer.java:1165)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1141)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031)
at java.lang.Thread.run(Thread.java:745)
"requestConsumer-1" prio=6 tid=0x0000000011279000 nid=0x2498 runnable
[0x000000001304d000]
java.lang.Thread.State: RUNNABLE
at java.util.HashMap.put(HashMap.java:494)
at
org.apache.qpid.filter.PropertyExpression.<init>(PropertyExpression.java:67)
at
org.apache.qpid.filter.selector.SelectorParser.variable(SelectorParser.java:537)
at
org.apache.qpid.filter.selector.SelectorParser.primaryExpr(SelectorParser.java:451)
at
org.apache.qpid.filter.selector.SelectorParser.unaryExpr(SelectorParser.java:425)
at
org.apache.qpid.filter.selector.SelectorParser.multExpr(SelectorParser.java:359)
at
org.apache.qpid.filter.selector.SelectorParser.addExpression(SelectorParser.java:328)
at
org.apache.qpid.filter.selector.SelectorParser.comparisonExpression(SelectorParser.java:180)
at
org.apache.qpid.filter.selector.SelectorParser.equalityExpression(SelectorParser.java:125)
at
org.apache.qpid.filter.selector.SelectorParser.andExpression(SelectorParser.java:104)
at
org.apache.qpid.filter.selector.SelectorParser.orExpression(SelectorParser.java:83)
at
org.apache.qpid.filter.selector.SelectorParser.JmsSelector(SelectorParser.java:75)
at
org.apache.qpid.filter.selector.SelectorParser.parse(SelectorParser.java:53)
at
org.apache.qpid.client.filter.JMSSelectorFilter.<init>(JMSSelectorFilter.java:56)
at
org.apache.qpid.client.BasicMessageConsumer.<init>(BasicMessageConsumer.java:166)
at
org.apache.qpid.client.BasicMessageConsumer_0_8.<init>(BasicMessageConsumer_0_8.java:57)
at
org.apache.qpid.client.AMQSession_0_8.createMessageConsumer(AMQSession_0_8.java:471)
at
org.apache.qpid.client.AMQSession_0_8.createMessageConsumer(AMQSession_0_8.java:57)
at org.apache.qpid.client.AMQSession$4.execute(AMQSession.java:2009)
at org.apache.qpid.client.AMQSession$4.execute(AMQSession.java:1999)
at
org.apache.qpid.client.AMQConnectionDelegate_8_0.executeRetrySupport(AMQConnectionDelegate_8_0.java:331)
- locked <0x00000007c2821ff0> (a java.lang.Object)
at
org.apache.qpid.client.AMQConnection.executeRetrySupport(AMQConnection.java:608)
at
org.apache.qpid.client.failover.FailoverRetrySupport.execute(FailoverRetrySupport.java:102)
at
org.apache.qpid.client.AMQSession.createConsumerImpl(AMQSession.java:1997)
at org.apache.qpid.client.AMQSession.createConsumer(AMQSession.java:980)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.createConsumer(AbstractMessageListenerContainer.java:820)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.createListenerConsumer(AbstractPollingMessageListenerContainer.java:206)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary(DefaultMessageListenerContainer.java:1165)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1141)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031)
at java.lang.Thread.run(Thread.java:745)
{noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]