summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2010-07-01 19:19:48 +0000
committerAlan Conway <aconway@apache.org>2010-07-01 19:19:48 +0000
commit5f36276fe8a665c587dcc1f2d49f0adfb47984e7 (patch)
tree49b1de86eb37b356f8ef212e450d3ee3dc6d2486 /cpp
parent48f7ecda226f9cfdb53ffb20695403046401f06a (diff)
downloadqpid-python-5f36276fe8a665c587dcc1f2d49f0adfb47984e7.tar.gz
Fix spordic failure in cluster_test testConnectionKnownHosts.
Very occasional failure of the form: cluster_test.cpp(547): error in "testConnectionKnownHosts": check kb0 == kb2 failed [42179 57640 != 44199 57640 ] ]) Fix is to avoid using possibly out-of-date initial-brokers data from the connection. Only rely on updates received from the amq.failover exchange. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@959751 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/qpid/client/FailoverListener.h9
-rw-r--r--cpp/src/qpid/client/FailoverListener.cpp12
-rw-r--r--cpp/src/tests/ClusterFixture.cpp2
3 files changed, 19 insertions, 4 deletions
diff --git a/cpp/include/qpid/client/FailoverListener.h b/cpp/include/qpid/client/FailoverListener.h
index 8414b80f2b..59108eb7cb 100644
--- a/cpp/include/qpid/client/FailoverListener.h
+++ b/cpp/include/qpid/client/FailoverListener.h
@@ -60,6 +60,12 @@ class FailoverListener : private MessageListener, private qpid::sys::Runnable
/** Subscribe to amq.failover exchange. */
QPID_CLIENT_EXTERN FailoverListener(Connection);
+ /** Subscribe to amq.failover exchange.
+ *@param useInitial If true use the connection's initial brokers as
+ * the initial value of getKnownBrokers
+ */
+ QPID_CLIENT_EXTERN FailoverListener(Connection, bool useInitial);
+
QPID_CLIENT_EXTERN ~FailoverListener();
/** Returns the latest list of known broker URLs. */
@@ -68,7 +74,8 @@ class FailoverListener : private MessageListener, private qpid::sys::Runnable
private:
void received(Message& msg);
void run();
-
+ void init(bool);
+
mutable sys::Mutex lock;
Connection connection;
Session session;
diff --git a/cpp/src/qpid/client/FailoverListener.cpp b/cpp/src/qpid/client/FailoverListener.cpp
index 3396f5598c..bf4fa91d49 100644
--- a/cpp/src/qpid/client/FailoverListener.cpp
+++ b/cpp/src/qpid/client/FailoverListener.cpp
@@ -33,8 +33,16 @@ FailoverListener::FailoverListener(Connection c) :
connection(c),
session(c.newSession(AMQ_FAILOVER+"."+framing::Uuid(true).str())),
subscriptions(session)
-{
- knownBrokers = c.getInitialBrokers();
+{ init(true); }
+
+FailoverListener::FailoverListener(Connection c, bool useInitial) :
+ connection(c),
+ session(c.newSession(AMQ_FAILOVER+"."+framing::Uuid(true).str())),
+ subscriptions(session)
+{ init(useInitial); }
+
+void FailoverListener::init(bool useInitial) {
+ if (useInitial) knownBrokers = connection.getInitialBrokers();
if (session.exchangeQuery(arg::name=AMQ_FAILOVER).getNotFound()) {
session.close();
return;
diff --git a/cpp/src/tests/ClusterFixture.cpp b/cpp/src/tests/ClusterFixture.cpp
index 04a5d35b06..6b62cb6fc7 100644
--- a/cpp/src/tests/ClusterFixture.cpp
+++ b/cpp/src/tests/ClusterFixture.cpp
@@ -142,7 +142,7 @@ void ClusterFixture::killWithSilencer(size_t n, client::Connection& c, int sig)
*@param n if specified wait for the cluster size to be n, up to a timeout.
*/
std::set<int> knownBrokerPorts(qpid::client::Connection& c, int n) {
- FailoverListener fl(c);
+ FailoverListener fl(c, false);
std::vector<qpid::Url> urls = fl.getKnownBrokers();
if (n >= 0 && unsigned(n) != urls.size()) {
// Retry up to 10 secs in .1 second intervals.