diff options
Diffstat (limited to 'cpp/src/qpid/cluster/ClusterMap.h')
-rw-r--r-- | cpp/src/qpid/cluster/ClusterMap.h | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/cpp/src/qpid/cluster/ClusterMap.h b/cpp/src/qpid/cluster/ClusterMap.h index 7695ebeabb..04323c5905 100644 --- a/cpp/src/qpid/cluster/ClusterMap.h +++ b/cpp/src/qpid/cluster/ClusterMap.h @@ -25,9 +25,11 @@ #include "types.h" #include "qpid/framing/ClusterMapBody.h" #include "qpid/Url.h" -#include <boost/optional.hpp> +#include <boost/function.hpp> #include <vector> +#include <deque> #include <map> +#include <iosfwd> namespace qpid { namespace cluster { @@ -41,21 +43,22 @@ class ClusterMap { public: ClusterMap(); + + MemberId dumpRequest(const MemberId& from, const Url& url); + + void dumpError(const MemberId&); + + void ready(const MemberId& from, const Url& url); - /** Update map for url-notice event. - *@param from Member that sent the notice. - *@param url URL for from. - *@return MemberId of member that should dump to URL, or a null - * MemberId() if no dump is needed. - */ - MemberId urlNotice(const MemberId& from, const Url& url); - - /** Dump failed notice */ - void dumpFailed(const MemberId&); - - /** Update map for leave event */ + /** Update map for cpg leave event */ void leave(const MemberId&); + /** Instead of updating the map, queue the updates for unstall */ + void stall(); + + /** Apply queued updates */ + void unstall(); + /** Number of unfinished dumps for member. */ int dumps(const MemberId&) const; @@ -63,13 +66,20 @@ class ClusterMap framing::ClusterMapBody toControl() const; /** Initialize map contents from a cluster control body. */ + void init(const framing::FieldTable& members, + const framing::FieldTable& dumpees, + const framing::FieldTable& dumps); + void fromControl(const framing::ClusterMapBody&); size_t memberCount() const { return members.size(); } size_t dumpeeCount() const { return dumpees.size(); } + bool isMember(const MemberId& id) const { return members.find(id) != members.end(); } bool isDumpee(const MemberId& id) const { return dumpees.find(id) != dumpees.end(); } + std::vector<Url> memberUrls() const; + private: struct Dumpee { Url url; MemberId dumper; }; typedef std::map<MemberId, Url> MemberMap; @@ -80,7 +90,14 @@ class ClusterMap MemberMap members; DumpeeMap dumpees; + bool stalled; + std::deque<boost::function<void()> > stallq; + + friend std::ostream& operator<<(std::ostream&, const ClusterMap&); + friend std::ostream& operator<<(std::ostream& o, const ClusterMap::DumpeeMap::value_type& dv); + friend std::ostream& operator<<(std::ostream& o, const ClusterMap::MemberMap::value_type& mv); }; + }} // namespace qpid::cluster #endif /*!QPID_CLUSTER_CLUSTERMAP_H*/ |