summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/cluster/ClusterMap.cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2008-09-16 00:22:00 +0000
committerAlan Conway <aconway@apache.org>2008-09-16 00:22:00 +0000
commit4325bf519604230227647c229931049fc2d89ab9 (patch)
tree6793eeef895c93caf7ce88e9a99747b13db334e9 /cpp/src/qpid/cluster/ClusterMap.cpp
parenteb41bbd1ff549a62b69d4ede4e2323e1427f5ece (diff)
downloadqpid-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.cpp138
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;
}