diff options
author | Alan Conway <aconway@apache.org> | 2009-06-30 20:51:38 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2009-06-30 20:51:38 +0000 |
commit | 6b9decf55d9aa235bfbcca645501165d08b61749 (patch) | |
tree | c0e12ed9c282485db1cf630b17588627c15c2913 /qpid/cpp/src/tests/cluster_test.cpp | |
parent | 12bbd1457fac91a32fb5ab8146309a53e5f0ef79 (diff) | |
download | qpid-python-6b9decf55d9aa235bfbcca645501165d08b61749.tar.gz |
Fix cluster race condition with connections closed by broker while in use.
If a client is using a connection that is closed at the broker end
because of an error, there is a race condition that allows the
connection to be incorrectly re-created on replica brokers which can
cause those brokers to exit with an error that does not occur on the
directly connected broker.
The fix: explicitly announce new connections, shadow connections are no
longer implicitly created on first use. Make error-check a cluster
control so it can be handled independently of the lifecycle of the
connection where an error initially occured.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@789947 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/tests/cluster_test.cpp')
-rw-r--r-- | qpid/cpp/src/tests/cluster_test.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/qpid/cpp/src/tests/cluster_test.cpp b/qpid/cpp/src/tests/cluster_test.cpp index dd4b34a2db..8fba108717 100644 --- a/qpid/cpp/src/tests/cluster_test.cpp +++ b/qpid/cpp/src/tests/cluster_test.cpp @@ -206,11 +206,11 @@ QPID_AUTO_TEST_CASE(testBadClientData) { ci->handle(poison); { ScopedSuppressLogging sl; - BOOST_CHECK_THROW(c0.session.queueQuery("q"), TransportFailure); + BOOST_CHECK_THROW(c0.session.queueQuery("q0"), TransportFailure); } Client c00(cluster[0]); - BOOST_CHECK_EQUAL(c00.session.queueQuery("q").getQueue(), ""); - BOOST_CHECK_EQUAL(c1.session.queueQuery("q").getQueue(), ""); + BOOST_CHECK_EQUAL(c00.session.queueQuery("q00").getQueue(), ""); + BOOST_CHECK_EQUAL(c1.session.queueQuery("q1").getQueue(), ""); } #if 0 @@ -784,9 +784,9 @@ QPID_AUTO_TEST_CASE(testHeartbeatCancelledOnFailover) std::string expectedContent; qpid::client::Subscription subscription; qpid::sys::Monitor lock; - bool ready; + bool ready, failed; - Receiver(FailoverManager& m, const std::string& q, const std::string& c) : mgr(m), queue(q), expectedContent(c), ready(false) {} + Receiver(FailoverManager& m, const std::string& q, const std::string& c) : mgr(m), queue(q), expectedContent(c), ready(false), failed(false) {} void received(Message& message) { @@ -808,8 +808,14 @@ QPID_AUTO_TEST_CASE(testHeartbeatCancelledOnFailover) void run() { + try { mgr.execute(*this); } + catch (const std::exception& e) { + BOOST_MESSAGE("Exception in mgr.execute: " << e.what()); + failed = true; + } + } void waitForReady() { @@ -843,6 +849,7 @@ QPID_AUTO_TEST_CASE(testHeartbeatCancelledOnFailover) ::usleep(2*1000*1000); fmgr.execute(sender); runner.join(); + BOOST_CHECK(!receiver.failed); fmgr.close(); } |