From 8b58b19ec3989b676cd5a1584089040caee14289 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Tue, 17 Nov 2009 18:09:21 +0000 Subject: Integrated InitialStatusMap into cluster code. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@881423 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/cluster/InitialStatusMap.cpp | 38 +++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'cpp/src/qpid/cluster/InitialStatusMap.cpp') 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(); -} + : 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(); } + 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 InitialStatusMap::getMemberUrls() { + assert(isComplete()); + assert(!isUpdateNeeded()); + std::map 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 -- cgit v1.2.1