diff options
| author | Alan Conway <aconway@apache.org> | 2012-06-22 19:28:42 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2012-06-22 19:28:42 +0000 |
| commit | aba9e1977bf31b82a9ae87ee7d84d7c0ccd50328 (patch) | |
| tree | 306f5fa72d657a5bd08fd4d432a56f36f5017cce /cpp/src/qpid/ha/HaBroker.cpp | |
| parent | 6dbd8a154b4c969ce76c7992b5e377d1604bc244 (diff) | |
| download | qpid-python-aba9e1977bf31b82a9ae87ee7d84d7c0ccd50328.tar.gz | |
NO-JIRA: Simplify locking and remove member-update callback in HA code.
Get rid of the separate Membership lock and put HaBroker in control of
membership changes. Removes a potential deadlock which could explain
some observed failures in long-running failover tests.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1353001 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/ha/HaBroker.cpp')
| -rw-r--r-- | cpp/src/qpid/ha/HaBroker.cpp | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/cpp/src/qpid/ha/HaBroker.cpp b/cpp/src/qpid/ha/HaBroker.cpp index 4752d51190..395a3ce6fa 100644 --- a/cpp/src/qpid/ha/HaBroker.cpp +++ b/cpp/src/qpid/ha/HaBroker.cpp @@ -66,7 +66,7 @@ HaBroker::HaBroker(broker::Broker& b, const Settings& s) brokerInfo(broker.getSystem()->getNodeName(), // TODO aconway 2012-05-24: other transports? broker.getPort(broker::Broker::TCP_TRANSPORT), systemId), - membership(systemId, boost::bind(&HaBroker::membershipUpdate, this, _1)), + membership(systemId), replicationTest(s.replicateDefault.get()) { // Set up the management object. @@ -271,17 +271,53 @@ void HaBroker::statusChanged(Mutex::ScopedLock& l) { setLinkProperties(l); } -void HaBroker::membershipUpdate(const Variant::List& brokers) { - // FIXME aconway 2012-06-12: nasty callback in callback, clean up. - BrokerInfo info; - if (getStatus() == CATCHUP && getMembership().get(systemId, info) && info.getStatus() == READY) - setStatus(READY); - - // No lock, only calls thread-safe objects. +void HaBroker::membershipUpdated(const Variant::List& brokers) { + // No lock, these are thread-safe. mgmtObject->set_members(brokers); broker.getManagementAgent()->raiseEvent(_qmf::EventMembersUpdate(brokers)); } +void HaBroker::setMembership(const Variant::List& brokers) { + Mutex::ScopedLock l(lock); + membership.assign(brokers); + BrokerInfo info; + // Check if my own status has been updated to READY + if (getStatus() == CATCHUP && + membership.get(systemId, info) && info.getStatus() == READY) + setStatus(READY, l); + membershipUpdated(brokers); +} + +void HaBroker::resetMembership(const BrokerInfo& b) { + Variant::List members; + { + Mutex::ScopedLock l(lock); + membership.reset(b); + members = membership.asList(); + } + membershipUpdated(members); +} + +void HaBroker::addBroker(const BrokerInfo& b) { + Variant::List members; + { + Mutex::ScopedLock l(lock); + membership.add(b); + members = membership.asList(); + } + membershipUpdated(members); +} + +void HaBroker::removeBroker(const Uuid& id) { + Variant::List members; + { + Mutex::ScopedLock l(lock); + membership.remove(id); + members = membership.asList(); + } + membershipUpdated(members); +} + void HaBroker::setLinkProperties(Mutex::ScopedLock&) { framing::FieldTable linkProperties = broker.getLinkClientProperties(); if (isBackup(status)) { |
