[ 
https://issues.apache.org/jira/browse/AMQCPP-556?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Timothy Bish resolved AMQCPP-556.
---------------------------------
       Resolution: Fixed
    Fix Version/s: 3.9.0
                   3.8.4

patch tested and applied

> setMessageListener on active session may leads to deadlock
> ----------------------------------------------------------
>
>                 Key: AMQCPP-556
>                 URL: https://issues.apache.org/jira/browse/AMQCPP-556
>             Project: ActiveMQ C++ Client
>          Issue Type: Bug
>          Components: CMS Impl
>    Affects Versions: 3.8.3
>            Reporter: Jeremy Leung
>            Assignee: Timothy Bish
>             Fix For: 3.8.4, 3.9.0
>
>         Attachments: AMQCPP-556.patch
>
>
> When we create a new *MessageConsumer* with a *MessageListener* from a 
> session, the session will be stopped before the updates of the message 
> listener and restarted afterward if the session already started.
> However, if there have more than one consumers already started; calling 
> *ActiveMQSessionKernel::stop()* may goes into a deadlock if there have many 
> messages coming in.
> {panel:title=Stack Trace when the sample program run into deadlock}
> 26989:  ./SimpleAsyncConsumer
> -----------------  lwp# 1 / thread# 1  --------------------
> {color:red} fdb29379 lwp_park (0, 0, 0)
>  fdb23b6b cond_wait_queue (8078ef0, 808bc28, 0) + 5e
>  fdb2403f _cond_wait (8078ef0, 808bc28) + 64
>  fdb24081 cond_wait (8078ef0, 808bc28) + 21
>  fdb240ba pthread_cond_wait (8078ef0, 808bc28) + 1b
>  fe7217b6 void 
> decaf::internal::util::concurrent::PlatformThread::interruptibleWaitOnCondition(_pthread_cond*,_pthread_mutex*,decaf::internal::util::concurrent::CompletionCondition&)
>  (8078ef0, 808bc28, 8046e14) + 36
>  fe71f400 bool 
> decaf::internal::util::concurrent::Threading::join(decaf::internal::util::concurrent::ThreadHandle*,long
>  long,int) (808f8d0, 0, 0, 0, fe758acd) + 160
>  fe758aeb void decaf::lang::Thread::join() (808ea18) + 2b
>  fe56b727 void activemq::threads::DedicatedTaskRunner::shutdown() (808f788) + 
> f7
>  fe3f417a void activemq::core::ActiveMQSessionExecutor::stop() (808cb30) + 2da
>  fe48af48 void activemq::core::kernels::ActiveMQSessionKernel::stop() 
> (808c240) + 18
>  fe44362a void 
> activemq::core::kernels::ActiveMQConsumerKernel::setMessageListener(cms::MessageListener*)
>  (80917d8, 8047384) + f2
>  fe3aa8c3 void 
> activemq::core::ActiveMQConsumer::setMessageListener(cms::MessageListener*) 
> (808f4e8, 8047384) + 73{color}
>  08055170 void SimpleAsyncConsumer::runConsumer() (8047380) + 610
>  080530d3 main     (1, 80474b8, 80474c0) + 2a3
>  08052d5a _start   (1, 8047618, 0, 804762e, 804763a, 8047674) + 7a
> -----------------  lwp# 10 / thread# 10  --------------------
> {color:red} fdb29379 lwp_park (0, 0, 0)
>  fdb23b6b cond_wait_queue (808f188, 808bc48, 0) + 5e
>  fdb2403f _cond_wait (808f188, 808bc48) + 64
>  fdb24081 cond_wait (808f188, 808bc48) + 21
>  fdb240ba pthread_cond_wait (808f188, 808bc48) + 1b
>  fe721666 void 
> decaf::internal::util::concurrent::PlatformThread::waitOnCondition(_pthread_cond*,_pthread_mutex*)
>  (808f188, 808bc48) + 1e
>  fe71dab3 void 
> __unnamed_syh4PZ6vdUWCx::doMonitorEnter(decaf::internal::util::concurrent::MonitorHandle*,decaf::internal::util::concurrent::ThreadHandle*)
>  (806c740, 808f8d0) + 8f
>  fe71fd0b void 
> decaf::internal::util::concurrent::Threading::enterMonitor(decaf::internal::util::concurrent::MonitorHandle*)
>  (806c740) + 27
>  fe7aaa78 void decaf::util::concurrent::Mutex::lock() (808ec34) + 4c
>  fe7aa2d4 void decaf::util::concurrent::Lock::lock() (fd71fb84) + 2c
>  fe7aa023 decaf::util::concurrent::Lock::Lock #Nvariant 
> 1(decaf::util::concurrent::Synchronizable*,const bool) (fd71fb84, 808ec34, 1) 
> + 43
>  fe44b7a4 void 
> activemq::core::kernels::ActiveMQConsumerKernel::dispatch(const 
> decaf::lang::Pointer<activemq::commands::MessageDispatch,decaf::util::concurrent::atomic::AtomicRefCounter>&)
>  (808ebb8, fd71feb0) + 49c
>  fe3f4371 void activemq::core::ActiveMQSessionExecutor::dispatch(const 
> decaf::lang::Pointer<activemq::commands::MessageDispatch,decaf::util::concurrent::atomic::AtomicRefCounter>&)
>  (808cb30, fd71feb0) + 11d
>  fe3f45be bool activemq::core::ActiveMQSessionExecutor::iterate() (808cb30) + 
> a2
>  fe56b88a void activemq::threads::DedicatedTaskRunner::run() (808f788) + 
> 8e{color}
>  fe75889e void decaf::lang::Thread::run() (808ea18) + 1a
>  fe71cfbb void __unnamed_syh4PZ6vdUWCx::runCallback(void*) (808f8d0) + 2b
>  fe71cf52 void*__unnamed_syh4PZ6vdUWCx::threadEntryMethod(void*) (808f8d0) + 
> ee
>  fdb28ffb _thr_setup (fd814200) + 4e
>  fdb29300 _lwp_start (fd814200, 0, 0, fd71fff8, fdb29300, fd814200)
> -----------------  lwp# 11 / thread# 11  --------------------
> {color:red} fdb29379 lwp_park (0, 0, 0)
>  fdb23b6b cond_wait_queue (808f5d8, 808bbc8, 0) + 5e
>  fdb2403f _cond_wait (808f5d8, 808bbc8) + 64
>  fdb24081 cond_wait (808f5d8, 808bbc8) + 21
>  fdb240ba pthread_cond_wait (808f5d8, 808bbc8) + 1b
>  fe721666 void 
> decaf::internal::util::concurrent::PlatformThread::waitOnCondition(_pthread_cond*,_pthread_mutex*)
>  (808f5d8, 808bbc8) + 1e
>  fe71dab3 void 
> __unnamed_syh4PZ6vdUWCx::doMonitorEnter(decaf::internal::util::concurrent::MonitorHandle*,decaf::internal::util::concurrent::ThreadHandle*)
>  (806c7a0, 8093c18) + 8f
>  fe71fd0b void 
> decaf::internal::util::concurrent::Threading::enterMonitor(decaf::internal::util::concurrent::MonitorHandle*)
>  (806c7a0) + 27
>  fe7aaa78 void decaf::util::concurrent::Mutex::lock() (80798b0) + 4c
>  fe7aa2d4 void decaf::util::concurrent::Lock::lock() (fd73fda4) + 2c
>  fe7aa023 decaf::util::concurrent::Lock::Lock #Nvariant 
> 1(decaf::util::concurrent::Synchronizable*,const bool) (fd73fda4, 80798b0, 1) 
> + 43
>  fe434d3d 
> decaf::lang::Pointer<activemq::commands::MessageDispatch,decaf::util::concurrent::atomic::AtomicRefCounter>activemq::core::SimplePriorityMessageDispatchChannel::dequeueNoWait()
>  (fd73fdf0, 80798a8) + 31
>  fe44e1cb bool activemq::core::kernels::ActiveMQConsumerKernel::iterate() 
> (808ebb8) + bb
>  fe48de0e bool 
> activemq::core::kernels::ActiveMQSessionKernel::iterateConsumers() (808c240) 
> + 1b6
>  fe3f4545 bool activemq::core::ActiveMQSessionExecutor::iterate() (808cb30) + 
> 29
>  fe56b88a void activemq::threads::DedicatedTaskRunner::run() (8091160) + 
> 8e{color}
>  fe75889e void decaf::lang::Thread::run() (8092a88) + 1a
>  fe71cfbb void __unnamed_syh4PZ6vdUWCx::runCallback(void*) (8093c18) + 2b
>  fe71cf52 void*__unnamed_syh4PZ6vdUWCx::threadEntryMethod(void*) (8093c18) + 
> ee
>  fdb28ffb _thr_setup (fd813a00) + 4e
>  fdb29300 _lwp_start (fd813a00, 0, 0, fd73fff8, fdb29300, fd813a00)
> {panel}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to