00001 #ifndef QPID_CLUSTER_CLUSTERMAP_H
00002 #define QPID_CLUSTER_CLUSTERMAP_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "types.h"
00026 #include "qpid/Url.h"
00027 #include "qpid/framing/ClusterConnectionMembershipBody.h"
00028
00029 #include <boost/function.hpp>
00030 #include <boost/optional.hpp>
00031
00032 #include <vector>
00033 #include <deque>
00034 #include <map>
00035 #include <set>
00036 #include <iosfwd>
00037
00038 namespace qpid {
00039 namespace cluster {
00040
00044 class ClusterMap {
00045 public:
00046 typedef std::map<MemberId, Url> Map;
00047 typedef std::set<MemberId> Set;
00048
00049 ClusterMap();
00050 ClusterMap(const MemberId& id, const Url& url, bool isReady);
00051 ClusterMap(const framing::FieldTable& urls, const framing::FieldTable& states);
00052
00056 bool configChange(
00057 cpg_address *current, int nCurrent,
00058 cpg_address *left, int nLeft,
00059 cpg_address *joined, int nJoined);
00060
00061 bool configChange(const std::string& addresses);
00062
00063 bool isNewbie(const MemberId& id) const { return newbies.find(id) != newbies.end(); }
00064 bool isMember(const MemberId& id) const { return members.find(id) != members.end(); }
00065 bool isAlive(const MemberId& id) const { return alive.find(id) != alive.end(); }
00066
00067 Url getNewbieUrl(const MemberId& id) { return getUrl(newbies, id); }
00068 Url getMemberUrl(const MemberId& id) { return getUrl(members, id); }
00069
00071 MemberId firstNewbie() const;
00072
00074 framing::ClusterConnectionMembershipBody asMethodBody() const;
00075
00076 size_t aliveCount() const { return alive.size(); }
00077 size_t memberCount() const { return members.size(); }
00078 std::vector<Url> memberUrls() const;
00079
00080 bool dumpRequest(const MemberId& id, const std::string& url);
00082 boost::optional<Url> dumpOffer(const MemberId& from, const MemberId& to);
00083
00085 bool ready(const MemberId& id, const Url&);
00086
00087 private:
00088 Url getUrl(const Map& map, const MemberId& id);
00089
00090 Map newbies, members;
00091 Set alive;
00092
00093 friend std::ostream& operator<<(std::ostream&, const Map&);
00094 friend std::ostream& operator<<(std::ostream&, const ClusterMap&);
00095 };
00096
00097 }}
00098
00099 #endif