diff options
| author | Alan Conway <aconway@apache.org> | 2008-09-16 00:22:00 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2008-09-16 00:22:00 +0000 |
| commit | 4325bf519604230227647c229931049fc2d89ab9 (patch) | |
| tree | 6793eeef895c93caf7ce88e9a99747b13db334e9 /cpp/src/qpid/cluster/ClusterMap.cpp | |
| parent | eb41bbd1ff549a62b69d4ede4e2323e1427f5ece (diff) | |
| download | qpid-python-4325bf519604230227647c229931049fc2d89ab9.tar.gz | |
Simplified cluster updates.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@695696 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/cluster/ClusterMap.cpp')
| -rw-r--r-- | cpp/src/qpid/cluster/ClusterMap.cpp | 138 |
1 files changed, 25 insertions, 113 deletions
diff --git a/cpp/src/qpid/cluster/ClusterMap.cpp b/cpp/src/qpid/cluster/ClusterMap.cpp index 24c3ed5552..63d0c786d2 100644 --- a/cpp/src/qpid/cluster/ClusterMap.cpp +++ b/cpp/src/qpid/cluster/ClusterMap.cpp @@ -32,143 +32,55 @@ using namespace framing; namespace cluster { -ClusterMap::ClusterMap() : stalled(false) {} +ClusterMap::ClusterMap() : dumping(false) {} -MemberId ClusterMap::dumpRequest(const MemberId& id, const Url& url) { - if (stalled) { - stallq.push_back(boost::bind(&ClusterMap::dumpRequest, this, id, url)); - return MemberId(); - } - MemberId dumper = nextDumper(); - Dumpee& d = dumpees[id]; - d.url = url; - d.dumper = dumper; - return dumper; -} - -void ClusterMap::ready(const MemberId& id, const Url& url) { - if (stalled) { - stallq.push_back(boost::bind(&ClusterMap::ready, this, id, url)); - return; - } - dumpees.erase(id); - members[id] = url; -} - - -MemberId ClusterMap::nextDumper() const { - // Choose the first member in member-id order of the group that - // has the least number of dumps-in-progress. - assert(!members.empty()); - MemberId dumper = members.begin()->first; - int minDumps = dumps(dumper); - MemberMap::const_iterator i = ++members.begin(); - while (i != members.end()) { - int d = dumps(i->first); - if (d < minDumps) { - minDumps = d; - dumper = i->first; - } - ++i; - } - return dumper; -} - -void ClusterMap::leave(const MemberId& id) { - if (stalled) { - stallq.push_back(boost::bind(&ClusterMap::leave, this, id)); - return; - } - - if (isDumpee(id)) - dumpees.erase(id); - if (isMember(id)) { - members.erase(id); - DumpeeMap::iterator i = dumpees.begin(); - while (i != dumpees.end()) { - if (i->second.dumper == id) dumpees.erase(i++); - else ++i; - } - } -} - -struct ClusterMap::MatchDumper { - MemberId d; - MatchDumper(const MemberId& i) : d(i) {} - bool operator()(const DumpeeMap::value_type& v) const { return v.second.dumper == d; } -}; - -int ClusterMap::dumps(const MemberId& id) const { - return std::count_if(dumpees.begin(), dumpees.end(), MatchDumper(id)); +MemberId ClusterMap::first() { + return (empty()) ? MemberId() : begin()->first; } -void ClusterMap::dumpError(const MemberId& dumpee) { - if (stalled) { - stallq.push_back(boost::bind(&ClusterMap::dumpError, this, dumpee)); - return; +void ClusterMap::configChange(const cpg_address* addrs, size_t size) { + iterator i = begin(); + while (i != end()) { // Remove members that are no longer in addrs. + if (std::find(addrs, addrs+size, i->first) == addrs+size) + erase(i++); + else + ++i; } - dumpees.erase(dumpee); } -framing::ClusterMapBody ClusterMap::toControl() const { - framing::ClusterMapBody b; - for (MemberMap::const_iterator i = members.begin(); i != members.end(); ++i) +framing::ClusterUpdateBody ClusterMap::toControl() const { + framing::ClusterUpdateBody b; + for (const_iterator i = begin(); i != end(); ++i) b.getMembers().setString(i->first.str(), i->second.str()); - for (DumpeeMap::const_iterator i = dumpees.begin(); i != dumpees.end(); ++i) { - b.getDumpees().setString(i->first.str(), i->second.url.str()); - b.getDumps().setString(i->first.str(), i->second.dumper.str()); - } + b.setDumping(dumping); return b; } -void ClusterMap::init(const FieldTable& ftMembers,const FieldTable& ftDumpees, const FieldTable& ftDumps) { - *this = ClusterMap(); // Reset any current contents. +void ClusterMap::update(const FieldTable& ftMembers, bool dump) { + dumping = dump; FieldTable::ValueMap::const_iterator i; for (i = ftMembers.begin(); i != ftMembers.end(); ++i) - members[i->first] = Url(i->second->get<std::string>()); - for (i = ftDumpees.begin(); i != ftDumpees.end(); ++i) - dumpees[i->first].url = Url(i->second->get<std::string>()); - for (i = ftDumps.begin(); i != ftDumps.end(); ++i) - dumpees[i->first].dumper = MemberId(i->second->get<std::string>()); + (*this)[i->first] = Url(i->second->get<std::string>()); } -void ClusterMap::fromControl(const framing::ClusterMapBody& b) { - init(b.getMembers(), b.getDumpees(), b.getDumps()); +void ClusterMap::fromControl(const framing::ClusterUpdateBody& b) { + update(b.getMembers(), b.getDumping()); } std::vector<Url> ClusterMap::memberUrls() const { - std::vector<Url> result(members.size()); - std::transform(members.begin(), members.end(), result.begin(), - boost::bind(&MemberMap::value_type::second, _1)); + std::vector<Url> result(size()); + std::transform(begin(), end(), result.begin(), + boost::bind(&value_type::second, _1)); return result; } -void ClusterMap::stall() { stalled = true; } - -namespace { -template <class F> void call(const F& f) { f(); } -} - -void ClusterMap::unstall() { - stalled = false; - std::for_each(stallq.begin(), stallq.end(), - boost::bind(&boost::function<void()>::operator(), _1)); - stallq.clear(); -} - -std::ostream& operator<<(std::ostream& o, const ClusterMap::MemberMap::value_type& mv) { +std::ostream& operator<<(std::ostream& o, const ClusterMap::value_type& mv) { return o << mv.first << "=" << mv.second; } -std::ostream& operator<<(std::ostream& o, const ClusterMap::DumpeeMap::value_type& dv) { - return o << "dump: " << dv.second.dumper << " to " << dv.first << "=" << dv.second.url; -} - std::ostream& operator<<(std::ostream& o, const ClusterMap& m) { - std::ostream_iterator<ClusterMap::MemberMap::value_type> im(o, "\n "); - std::ostream_iterator<ClusterMap::DumpeeMap::value_type> id(o, "\n "); - std::copy(m.members.begin(), m.members.end(), im); - std::copy(m.dumpees.begin(), m.dumpees.end(), id); + std::ostream_iterator<ClusterMap::value_type> im(o, "\n "); + std::copy(m.begin(), m.end(), im); return o; } |
