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

Francois Godin updated AMQCPP-617:
----------------------------------
    Affects Version/s: 3.9.2
                       3.9.4

> Segfault when using a QueueBrowser.
> -----------------------------------
>
>                 Key: AMQCPP-617
>                 URL: https://issues.apache.org/jira/browse/AMQCPP-617
>             Project: ActiveMQ C++ Client
>          Issue Type: Bug
>    Affects Versions: 3.9.2, 3.9.4
>            Reporter: Francois Godin
>            Assignee: Timothy Bish
>            Priority: Critical
>
> I encountered a rare (but that still happened a couple of time) crash due to 
> the ActiveMQ C++ library.
> h2. Information
> I've done some digging and the crash happen when the function 
> activemq::core::Browser::dispatch call 
> activemq::core::ActiveMQQueueBrowser::notifyMessageAvailable. The segfault 
> happen at the first member access in ActiveMQQueueBrowser.
> h3. Core dump
> #0  0x00007f38f7736758 in decaf::util::concurrent::Lock::lock() ()
>    from 
> /home/Fasttracctest/daemon/FastTraccTestDaemon/lib/libactivemq-cpp.so.19
> #1  0x00007f38f7736875 in 
> decaf::util::concurrent::Lock::Lock(decaf::util::concurrent::Synchronizable*, 
> bool) ()
>    from 
> /home/Fasttracctest/daemon/FastTraccTestDaemon/lib/libactivemq-cpp.so.19
> #2  0x00007f38f73f0f5d in 
> activemq::core::ActiveMQQueueBrowser::notifyMessageAvailable() ()
>    from 
> /home/Fasttracctest/daemon/FastTraccTestDaemon/lib/libactivemq-cpp.so.19
> #3  0x00007f38f73f4cd1 in 
> activemq::core::Browser::dispatch(decaf::lang::Pointer<activemq::commands::MessageDispatch,
>  decaf::util::concurrent::atomic::AtomicRefCounter> const&) ()
>    from 
> /home/Fasttracctest/daemon/FastTraccTestDaemon/lib/libactivemq-cpp.so.19
> #4  0x00007f38f7406c24 in 
> activemq::core::ActiveMQSessionExecutor::dispatch(decaf::lang::Pointer<activemq::commands::MessageDispatch,
>  decaf::util::concurrent::atomic::AtomicRefCounter> const&) ()
>    from 
> /home/Fasttracctest/daemon/FastTraccTestDaemon/lib/libactivemq-cpp.so.19
> #5  0x00007f38f7407ce5 in activemq::core::ActiveMQSessionExecutor::iterate() 
> ()
>    from 
> /home/Fasttracctest/daemon/FastTraccTestDaemon/lib/libactivemq-cpp.so.19
> #6  0x00007f38f7543565 in activemq::threads::DedicatedTaskRunner::run() ()
>    from 
> /home/Fasttracctest/daemon/FastTraccTestDaemon/lib/libactivemq-cpp.so.19
> #7  0x00007f38f76acbef in ?? ()
>    from 
> /home/Fasttracctest/daemon/FastTraccTestDaemon/lib/libactivemq-cpp.so.19
> #8  0x00007f38f76ac964 in ?? ()
>    from 
> /home/Fasttracctest/daemon/FastTraccTestDaemon/lib/libactivemq-cpp.so.19
> #9  0x00007f38f9120aa1 in start_thread () from /lib64/libpthread.so.0
> #10 0x00007f38f941eaad in ioperm () from /lib64/libc.so.6
> #11 0x0000000000000000 in ?? ()
> h3. Usage of the library
> int getMessageCountInQueue(cms::Session* session, cms::Queue* queue) {
>       std::unique_ptr<cms::QueueBrowser> 
> browser(session->createBrowser(queue));
>       cms::MessageEnumeration* enumeration = browser->getEnumeration();
>       int count = 0;
>       while(enumeration->hasMoreMessages()) {
>               count++;
>               cms::Message* msg = enumeration->nextMessage();
>               delete msg;
>       }
>       return count;
> }
> h2. After some analysis, I have the following hypothesis:
> It seems that when I destroy the ActiveMQQueueBrowser (and thus call 
> destroyConsumer), the Browser instance that refer to it may be kept alive by 
> activemq::core::ActiveMQSessionExecutor::dispatch (as it is stored in a 
> shared_ptr). 
> Often it is no problem as Browser::dispatch is not called but I guess it may 
> happen rarely and cause the segfault.
> h2. Proposed solution
> The basic ActiveMQConsumerKernel::dispatch should be protected against that 
> problem because it lock and check if the consumer is closed (which it is). It 
> just happen that the Browser::dispatch did not have those check and thus will 
> always execute the code.
> As such, I propose splitting ActiveMQConsumerKernel::dispatch into two:
> # The cleanup, locking and check into the new ActiveMQConsumerKernel::dispatch
> # The operation itself into ActiveMQConsummerKernel::dispatchImpl.
> Then, Browser only need to override dispatchImpl and will have the same 
> protection that ActiveMQConsumerKernel had.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to