[
https://issues.apache.org/jira/browse/QPID-6994?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Alex Rudyy updated QPID-6994:
-----------------------------
Description:
With current implementation of AMQPConnection close we invoke
VirtualHost#deregisterConnection first before we invoke
AbstractAMQPConnection#performDeleteTasks. As result, Connection configured
object associated with VirtualHost is unregistered before connection deletion
task is executed. If VH is closing at the same time when connection is closed,
it might happen that after call VirtualHost#deregisterConnection the VH can
close immediately and the following call to
AbstractAMQPConnection#performDeleteTasks would fail because queue deletion
task cannon be performed on already closed virtual host.
The exception like the one below is reported in this case:
{noformat}
2016-01-10 21:45:08,765 ERROR [VirtualHostNode-test-Config]
o.a.q.s.c.u.TaskExecutorImpl Task executor VirtualHostNode-test-Config is not
in ACTIVE state, unable to execute : Task['set desired state' on
'Binding{bindingKey=testTopic, exchange=TopicExchange[amq.topic],
queue=tmp_127_0_0_1_51683_1, id= 0c34946e-5e28-4d8c-a84e-50fb77deee03 }' with
arguments 'DELETED']
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl.checkState(TaskExecutorImpl.java:225)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl.submitWrappedTask(TaskExecutorImpl.java:147)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl.submit(TaskExecutorImpl.java:142)
at
org.apache.qpid.server.model.AbstractConfiguredObject.doOnConfigThread(AbstractConfiguredObject.java:512)
at
org.apache.qpid.server.model.AbstractConfiguredObject.setDesiredState(AbstractConfiguredObject.java:1385)
at
org.apache.qpid.server.model.AbstractConfiguredObject.deleteAsync(AbstractConfiguredObject.java:2001)
at
org.apache.qpid.server.queue.AbstractQueue.deleteAndReturnCountAsync(AbstractQueue.java:1932)
at
org.apache.qpid.server.queue.AbstractQueue.doDelete(AbstractQueue.java:3078)
at sun.reflect.GeneratedMethodAccessor238.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at
org.apache.qpid.server.model.AbstractConfiguredObject.attainState(AbstractConfiguredObject.java:1239)
at
org.apache.qpid.server.model.AbstractConfiguredObject.access$1900(AbstractConfiguredObject.java:78)
at
org.apache.qpid.server.model.AbstractConfiguredObject$15.execute(AbstractConfiguredObject.java:1427)
at
org.apache.qpid.server.model.AbstractConfiguredObject$15.execute(AbstractConfiguredObject.java:1386)
at
org.apache.qpid.server.model.AbstractConfiguredObject$2.execute(AbstractConfiguredObject.java:520)
at
org.apache.qpid.server.model.AbstractConfiguredObject$2.execute(AbstractConfiguredObject.java:513)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl$TaskLoggingWrapper.execute(TaskExecutorImpl.java:270)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl$CallableWrapper$1.run(TaskExecutorImpl.java:342)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:356)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl$CallableWrapper.call(TaskExecutorImpl.java:335)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
{noformat}
was:
With current implementation of AMQPConnection_0_8 we invoke
VirtualHost#deregisterConnection first before we invoke
AbstractAMQPConnection#performDeleteTasks. As result, Connection configured
object associated with VirtualHost is unregistered before connection deletion
task is executed. If VH is closing at the same time when connection is closed,
it might happen that after call VirtualHost#deregisterConnection the VH closes
immediately and the following call to AbstractAMQPConnection#performDeleteTasks
fails because queue deletion task cannon be performed on already closed virtual
host.
The exception like the one below is reported in this case:
{noformat}
2016-01-10 21:45:08,765 ERROR [VirtualHostNode-test-Config]
o.a.q.s.c.u.TaskExecutorImpl Task executor VirtualHostNode-test-Config is not
in ACTIVE state, unable to execute : Task['set desired state' on
'Binding{bindingKey=testTopic, exchange=TopicExchange[amq.topic],
queue=tmp_127_0_0_1_51683_1, id= 0c34946e-5e28-4d8c-a84e-50fb77deee03 }' with
arguments 'DELETED']
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl.checkState(TaskExecutorImpl.java:225)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl.submitWrappedTask(TaskExecutorImpl.java:147)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl.submit(TaskExecutorImpl.java:142)
at
org.apache.qpid.server.model.AbstractConfiguredObject.doOnConfigThread(AbstractConfiguredObject.java:512)
at
org.apache.qpid.server.model.AbstractConfiguredObject.setDesiredState(AbstractConfiguredObject.java:1385)
at
org.apache.qpid.server.model.AbstractConfiguredObject.deleteAsync(AbstractConfiguredObject.java:2001)
at
org.apache.qpid.server.queue.AbstractQueue.deleteAndReturnCountAsync(AbstractQueue.java:1932)
at
org.apache.qpid.server.queue.AbstractQueue.doDelete(AbstractQueue.java:3078)
at sun.reflect.GeneratedMethodAccessor238.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at
org.apache.qpid.server.model.AbstractConfiguredObject.attainState(AbstractConfiguredObject.java:1239)
at
org.apache.qpid.server.model.AbstractConfiguredObject.access$1900(AbstractConfiguredObject.java:78)
at
org.apache.qpid.server.model.AbstractConfiguredObject$15.execute(AbstractConfiguredObject.java:1427)
at
org.apache.qpid.server.model.AbstractConfiguredObject$15.execute(AbstractConfiguredObject.java:1386)
at
org.apache.qpid.server.model.AbstractConfiguredObject$2.execute(AbstractConfiguredObject.java:520)
at
org.apache.qpid.server.model.AbstractConfiguredObject$2.execute(AbstractConfiguredObject.java:513)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl$TaskLoggingWrapper.execute(TaskExecutorImpl.java:270)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl$CallableWrapper$1.run(TaskExecutorImpl.java:342)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:356)
at
org.apache.qpid.server.configuration.updater.TaskExecutorImpl$CallableWrapper.call(TaskExecutorImpl.java:335)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
{noformat}
> [Java Broker] AMQP connection close might fail to delete temporary queue
> after close of VirtualHost
> ---------------------------------------------------------------------------------------------------
>
> Key: QPID-6994
> URL: https://issues.apache.org/jira/browse/QPID-6994
> Project: Qpid
> Issue Type: Bug
> Components: Java Broker
> Affects Versions: qpid-java-6.0, qpid-java-6.1
> Reporter: Alex Rudyy
>
> With current implementation of AMQPConnection close we invoke
> VirtualHost#deregisterConnection first before we invoke
> AbstractAMQPConnection#performDeleteTasks. As result, Connection configured
> object associated with VirtualHost is unregistered before connection deletion
> task is executed. If VH is closing at the same time when connection is
> closed, it might happen that after call VirtualHost#deregisterConnection the
> VH can close immediately and the following call to
> AbstractAMQPConnection#performDeleteTasks would fail because queue deletion
> task cannon be performed on already closed virtual host.
> The exception like the one below is reported in this case:
> {noformat}
> 2016-01-10 21:45:08,765 ERROR [VirtualHostNode-test-Config]
> o.a.q.s.c.u.TaskExecutorImpl Task executor VirtualHostNode-test-Config is not
> in ACTIVE state, unable to execute : Task['set desired state' on
> 'Binding{bindingKey=testTopic, exchange=TopicExchange[amq.topic],
> queue=tmp_127_0_0_1_51683_1, id= 0c34946e-5e28-4d8c-a84e-50fb77deee03 }' with
> arguments 'DELETED']
> at
> org.apache.qpid.server.configuration.updater.TaskExecutorImpl.checkState(TaskExecutorImpl.java:225)
> at
> org.apache.qpid.server.configuration.updater.TaskExecutorImpl.submitWrappedTask(TaskExecutorImpl.java:147)
> at
> org.apache.qpid.server.configuration.updater.TaskExecutorImpl.submit(TaskExecutorImpl.java:142)
> at
> org.apache.qpid.server.model.AbstractConfiguredObject.doOnConfigThread(AbstractConfiguredObject.java:512)
> at
> org.apache.qpid.server.model.AbstractConfiguredObject.setDesiredState(AbstractConfiguredObject.java:1385)
> at
> org.apache.qpid.server.model.AbstractConfiguredObject.deleteAsync(AbstractConfiguredObject.java:2001)
> at
> org.apache.qpid.server.queue.AbstractQueue.deleteAndReturnCountAsync(AbstractQueue.java:1932)
> at
> org.apache.qpid.server.queue.AbstractQueue.doDelete(AbstractQueue.java:3078)
> at sun.reflect.GeneratedMethodAccessor238.invoke(Unknown Source)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:606)
> at
> org.apache.qpid.server.model.AbstractConfiguredObject.attainState(AbstractConfiguredObject.java:1239)
> at
> org.apache.qpid.server.model.AbstractConfiguredObject.access$1900(AbstractConfiguredObject.java:78)
> at
> org.apache.qpid.server.model.AbstractConfiguredObject$15.execute(AbstractConfiguredObject.java:1427)
> at
> org.apache.qpid.server.model.AbstractConfiguredObject$15.execute(AbstractConfiguredObject.java:1386)
> at
> org.apache.qpid.server.model.AbstractConfiguredObject$2.execute(AbstractConfiguredObject.java:520)
> at
> org.apache.qpid.server.model.AbstractConfiguredObject$2.execute(AbstractConfiguredObject.java:513)
> at
> org.apache.qpid.server.configuration.updater.TaskExecutorImpl$TaskLoggingWrapper.execute(TaskExecutorImpl.java:270)
> at
> org.apache.qpid.server.configuration.updater.TaskExecutorImpl$CallableWrapper$1.run(TaskExecutorImpl.java:342)
> at java.security.AccessController.doPrivileged(Native Method)
> at javax.security.auth.Subject.doAs(Subject.java:356)
> at
> org.apache.qpid.server.configuration.updater.TaskExecutorImpl$CallableWrapper.call(TaskExecutorImpl.java:335)
> at java.util.concurrent.FutureTask.run(FutureTask.java:262)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> 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]