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]

Reply via email to