diff options
author | Alan Conway <aconway@apache.org> | 2009-11-17 18:09:21 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2009-11-17 18:09:21 +0000 |
commit | 8b58b19ec3989b676cd5a1584089040caee14289 (patch) | |
tree | e0ca831f7fac0b26a4dcfa679b574e9a5dfafe06 /cpp/src/qpid/cluster/InitialStatusMap.cpp | |
parent | ef7728a725272b88c3cd2f81f81ee60ed00cde90 (diff) | |
download | qpid-python-8b58b19ec3989b676cd5a1584089040caee14289.tar.gz |
Integrated InitialStatusMap into cluster code.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@881423 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/cluster/InitialStatusMap.cpp')
-rw-r--r-- | cpp/src/qpid/cluster/InitialStatusMap.cpp | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/cpp/src/qpid/cluster/InitialStatusMap.cpp b/cpp/src/qpid/cluster/InitialStatusMap.cpp index 8c55a66ed7..6d27b3ae72 100644 --- a/cpp/src/qpid/cluster/InitialStatusMap.cpp +++ b/cpp/src/qpid/cluster/InitialStatusMap.cpp @@ -29,13 +29,12 @@ namespace qpid { namespace cluster { InitialStatusMap::InitialStatusMap(const MemberId& self_) - : self(self_), complete(), updateNeeded(), resendNeeded() -{ - map[self] = optional<Status>(); -} + : self(self_), completed(), resendNeeded() +{} void InitialStatusMap::configChange(const MemberSet& members) { resendNeeded = false; + bool wasComplete = isComplete(); if (firstConfig.empty()) firstConfig = members; MemberSet::const_iterator i = members.begin(); Map::iterator j = map.begin(); @@ -66,10 +65,13 @@ void InitialStatusMap::configChange(const MemberSet& members) { for (Map::iterator i = map.begin(); i != map.end(); ++i) i->second = optional<Status>(); } + completed = isComplete() && !wasComplete; // Set completed on the transition. } void InitialStatusMap::received(const MemberId& m, const Status& s){ + bool wasComplete = isComplete(); map[m] = s; + completed = isComplete() && !wasComplete; // Set completed on the transition. } bool InitialStatusMap::notInitialized(const Map::value_type& v) { @@ -81,7 +83,11 @@ bool InitialStatusMap::isActive(const Map::value_type& v) { } bool InitialStatusMap::isComplete() { - return find_if(map.begin(), map.end(), ¬Initialized) == map.end(); + return !map.empty() && find_if(map.begin(), map.end(), ¬Initialized) == map.end(); +} + +bool InitialStatusMap::transitionToComplete() { + return completed; } bool InitialStatusMap::isResendNeeded() { @@ -107,4 +113,26 @@ MemberSet InitialStatusMap::getElders() { return elders; } +// Get cluster ID from an active member or the youngest newcomer. +framing::Uuid InitialStatusMap::getClusterId() { + assert(isComplete()); + assert(!map.empty()); + Map::iterator i = find_if(map.begin(), map.end(), &isActive); + if (i != map.end()) + return i->second->getClusterId(); // An active member + else + return map.begin()->second->getClusterId(); +} + +std::map<MemberId, Url> InitialStatusMap::getMemberUrls() { + assert(isComplete()); + assert(!isUpdateNeeded()); + std::map<MemberId, Url> urlMap; + for (Map::iterator i = map.begin(); i != map.end(); ++i) { + assert(i->second); + urlMap.insert(std::make_pair(i->first, i->second->getUrl())); + } + return urlMap; +} + }} // namespace qpid::cluster |