Details
-
Bug
-
Status: Resolved
-
Minor
-
Resolution: Fixed
-
3.6.0
-
None
-
Solaris 10 with gcc 3.4.6
-
Patch Available
-
Regression
Description
From one thread, an exception comes and FailoverTransport::handleTransportFailure () is called:
activemq::transport::failover::CloseTransportsTask::add(const Pointer<Transport> transport)
activemq::transport::failover::FailoverTransport::handleTransportFailure(const decaf::lang::Exception & error=
activemq::transport::failover::FailoverTransportListener::onException(const decaf::lang::Exception & ex={...}
)
activemq::transport::TransportFilter::onException(const decaf::lang::Exception & ex=
activemq::wireformat::openwire::OpenWireFormatNegotiator::onException(const decaf::lang::Exception & ex={...}
)
activemq::transport::TransportFilter::onException(const decaf::lang::Exception & ex=
activemq::transport::inactivity::InactivityMonitor::onException(const decaf::lang::Exception & ex={...}
)
activemq::transport::TransportFilter::onException(const decaf::lang::Exception & ex=
activemq::transport::IOTransport::fire(decaf::lang::Exception & ex={...}
)
activemq::transport::IOTransport::run()
decaf::lang::Thread::run()
From another thread, the amq connection is being closed. It destructs the FailoverTransport without waiting that the first thread finishes to call handleTransportFailure():
activemq::transport::failover::FailoverTransport::~FailoverTransport()
activemq::transport::failover::FailoverTransport::`vector deleting destructor'(unsigned int)
decaf::lang::Pointer<activemq::transport::Transport,decaf::util::concurrent::atomic::AtomicRefCounter>::onDeleteFunc(activemq::transport::Transport * value=0x02f307b0)
decaf::lang::Pointer<activemq::transport::Transport,decaf::util::concurrent::atomic::AtomicRefCounter>::~Pointer<activemq::transport::Transport,decaf::util::concurrent::atomic::AtomicRefCounter>()
decaf::lang::Pointer<activemq::transport::Transport,decaf::util::concurrent::atomic::AtomicRefCounter>::reset(activemq::transport::Transport * value=0x00000000)
activemq::transport::TransportFilter::~TransportFilter()
activemq::transport::correlator::ResponseCorrelator::~ResponseCorrelator()
activemq::transport::correlator::ResponseCorrelator::`vector deleting destructor'(unsigned int)
decaf::lang::Pointer<activemq::transport::Transport,decaf::util::concurrent::atomic::AtomicRefCounter>::onDeleteFunc(activemq::transport::Transport * value=0x03ba6058)
decaf::lang::Pointer<activemq::transport::Transport,decaf::util::concurrent::atomic::AtomicRefCounter>::~Pointer<activemq::transport::Transport,decaf::util::concurrent::atomic::AtomicRefCounter>()
decaf::lang::Pointer<activemq::transport::Transport,decaf::util::concurrent::atomic::AtomicRefCounter>::reset(activemq::transport::Transport * value=0x00000000)
activemq::core::ActiveMQConnection::disconnect(__int64 lastDeliveredSequenceId=0)
activemq::core::ActiveMQConnection::close()
I don't have any simple test case as it is a race condition.
I've attached a proposal patch.