You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Alex Rudyy (JIRA)" <ji...@apache.org> on 2015/04/24 16:31:39 UTC

[jira] [Created] (QPID-6510) [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

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: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org