From d39a165c9c8d1fa2fd728a2237117efa71848874 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Thu, 16 Oct 2008 17:07:26 +0000 Subject: Fix race in cluster causing incorrect known-broker lists to be sent to clients. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@705287 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/tests/cluster_test.cpp | 63 +++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 28 deletions(-) (limited to 'cpp/src/tests') diff --git a/cpp/src/tests/cluster_test.cpp b/cpp/src/tests/cluster_test.cpp index 5b9657c2c7..c8f5fb9083 100644 --- a/cpp/src/tests/cluster_test.cpp +++ b/cpp/src/tests/cluster_test.cpp @@ -177,46 +177,52 @@ template set makeSet(const C& c) { return s; } -template std::set knownBrokerPorts(T& source, size_t n) { +template std::set knownBrokerPorts(T& source, int n=-1) { vector urls = source.getKnownBrokers(); - for (size_t retry=1000; urls.size() != n && retry != 0; --retry) { - ::usleep(1000); - urls = source.getKnownBrokers(); + BOOST_MESSAGE("knownBrokerPorts " << n << ": " << urls); + if (n >= 0) { + for (size_t retry=10; urls.size() != unsigned(n) && retry != 0; --retry) { + ::usleep(100000); + urls = source.getKnownBrokers(); + BOOST_MESSAGE("knownBrokerPorts retry: " << urls); + } } set s; - for (vector::const_iterator i = urls.begin(); i != urls.end(); ++i) { - BOOST_MESSAGE("Failover URL: " << *i); - BOOST_CHECK(i->size() >= 1); - BOOST_CHECK((*i)[0].get()); + for (vector::const_iterator i = urls.begin(); i != urls.end(); ++i) s.insert((*i)[0].get()->port); - } return s; } -QPID_AUTO_TEST_CASE(testFailoverListener) { - ClusterFixture cluster(2); +QPID_AUTO_TEST_CASE(testConnectionKnownHosts) { + ClusterFixture cluster(1); Client c0(cluster[0], "c0"); - FailoverListener fl; - fl.start(ConnectionAccess::getImpl(c0.connection)); - set set0=makeSet(cluster); + set kb0 = knownBrokerPorts(c0.connection); + BOOST_CHECK_EQUAL(kb0.size(), 1); + BOOST_CHECK_EQUAL(kb0, makeSet(cluster)); - BOOST_CHECK_EQUAL(set0, knownBrokerPorts(fl, 2)); cluster.add(); - BOOST_CHECK_EQUAL(makeSet(cluster), knownBrokerPorts(fl, 3)); - cluster.kill(2); - BOOST_CHECK_EQUAL(set0, knownBrokerPorts(fl, 2)); -} - -QPID_AUTO_TEST_CASE(testConnectionKnownHosts) { - ClusterFixture cluster(2); - Client c0(cluster[0], "c0"); - set set0=makeSet(cluster); + Client c1(cluster[1], "c1"); + set kb1 = knownBrokerPorts(c1.connection); + kb0 = knownBrokerPorts(c0.connection, 2); + BOOST_CHECK_EQUAL(kb1.size(), 2); + BOOST_CHECK_EQUAL(kb1, makeSet(cluster)); + BOOST_CHECK_EQUAL(kb1,kb0); - BOOST_CHECK_EQUAL(set0, knownBrokerPorts(c0.connection, 2)); cluster.add(); - BOOST_CHECK_EQUAL(makeSet(cluster), knownBrokerPorts(c0.connection, 3)); - cluster.kill(2); - BOOST_CHECK_EQUAL(set0, knownBrokerPorts(c0.connection, 2)); + Client c2(cluster[2], "c2"); + set kb2 = knownBrokerPorts(c2.connection); + kb1 = knownBrokerPorts(c1.connection, 3); + kb0 = knownBrokerPorts(c0.connection, 3); + BOOST_CHECK_EQUAL(kb2.size(), 3); + BOOST_CHECK_EQUAL(kb2, makeSet(cluster)); + BOOST_CHECK_EQUAL(kb2,kb0); + BOOST_CHECK_EQUAL(kb2,kb1); + + cluster.kill(1); + kb0 = knownBrokerPorts(c0.connection, 2); + kb2 = knownBrokerPorts(c2.connection, 2); + BOOST_CHECK_EQUAL(kb0.size(), 2); + BOOST_CHECK_EQUAL(kb0, kb2); } QPID_AUTO_TEST_CASE(DumpConsumers) { @@ -238,6 +244,7 @@ QPID_AUTO_TEST_CASE(DumpConsumers) { BOOST_CHECK_EQUAL(c1.session.queueQuery("q").getMessageCount(), 1u); BOOST_CHECK_EQUAL(c2.session.queueQuery("q").getMessageCount(), 1u); + // Activate the subscription, ensure message removed on all queues. c0.subs.setFlowControl("q", FlowControl::messageCredit(1)); Message m; -- cgit v1.2.1