18 #include <boost/uuid/uuid_io.hpp>
19 #include <boost/functional/hash.hpp>
21 #include "hazelcast/client/cluster.h"
22 #include "hazelcast/client/spi/impl/ClientClusterServiceImpl.h"
23 #include "hazelcast/client/membership_listener.h"
24 #include "hazelcast/client/initial_membership_event.h"
25 #include "hazelcast/client/member.h"
26 #include "hazelcast/client/serialization/serialization.h"
27 #include "hazelcast/client/membership_event.h"
28 #include "hazelcast/client/impl/vector_clock.h"
29 #include "hazelcast/client/member_selectors.h"
30 #include "hazelcast/client/internal/partition/strategy/StringPartitioningStrategy.h"
35 : cluster_service_(cluster_service)
41 return cluster_service_.get_member_list();
47 return cluster_service_.add_membership_listener(std::move(listener));
53 return cluster_service_.remove_membership_listener(registration_id);
61 member::member(address member_address,
62 boost::uuids::uuid uuid,
64 std::unordered_map<std::string, std::string> attr,
65 std::unordered_map<endpoint_qualifier, address> address_map,
67 : address_(std::move(member_address))
70 , attributes_(std::move(attr))
71 , address_map_(std::move(address_map))
75 member::member(address member_address)
76 : address_(member_address)
81 member::member(boost::uuids::uuid uuid)
105 const std::unordered_map<std::string, std::string>&
106 member::get_attributes()
const
112 operator<<(std::ostream& out,
const member& member)
114 const address& address = member.get_address();
116 out << address.get_host();
119 out << address.get_port();
120 out <<
" - " << boost::uuids::to_string(member.get_uuid());
121 if (member.is_lite_member()) {
130 std::unordered_map<std::string, std::string>::const_iterator it =
131 attributes_.find(key);
132 if (attributes_.end() != it) {
133 return &(it->second);
148 return attributes_.find(key) != attributes_.end();
152 member::operator<(
const member& rhs)
const
154 return uuid_ < rhs.uuid_;
157 const std::unordered_map<endpoint_qualifier, address>&
158 member::address_map()
const
164 operator==(
const member& lhs,
const member& rhs)
166 return lhs.address_ == rhs.address_ && lhs.uuid_ == rhs.uuid_;
169 endpoint::endpoint(boost::uuids::uuid uuid,
170 boost::optional<address> socket_address)
172 , socket_address_(std::move(socket_address))
181 const boost::optional<address>&
184 return socket_address_;
190 membership_event_type event_type,
191 const std::unordered_map<boost::uuids::uuid,
193 boost::hash<boost::uuids::uuid>>& members_list)
196 , event_type_(event_type)
197 , members_(members_list)
202 std::unordered_map<boost::uuids::uuid, member, boost::hash<boost::uuids::uuid>>
214 membership_event::membership_event_type
226 local_endpoint::local_endpoint(boost::uuids::uuid uuid,
227 boost::optional<address> socket_address,
229 std::unordered_set<std::string> labels)
230 :
endpoint(uuid, std::move(socket_address))
231 , name_(std::move(name))
232 , labels_(std::move(labels))
236 local_endpoint::get_name()
const
242 vector_clock::vector_clock() =
default;
244 vector_clock::vector_clock(
245 const vector_clock::timestamp_vector& replica_logical_timestamps)
246 : replica_timestamp_entries_(replica_logical_timestamps)
248 for (
const vector_clock::timestamp_vector::value_type& replicaTimestamp :
249 replica_logical_timestamps) {
250 replica_timestamps_[replicaTimestamp.first] = replicaTimestamp.second;
254 vector_clock::timestamp_vector
255 vector_clock::entry_set()
257 return replica_timestamp_entries_;
261 vector_clock::is_after(vector_clock& other)
263 bool anyTimestampGreater =
false;
264 for (
const vector_clock::timestamp_map::value_type& otherEntry :
265 other.replica_timestamps_) {
266 const auto& replicaId = otherEntry.first;
267 int64_t otherReplicaTimestamp = otherEntry.second;
268 std::pair<bool, int64_t> localReplicaTimestamp =
269 get_timestamp_for_replica(replicaId);
271 if (!localReplicaTimestamp.first ||
272 localReplicaTimestamp.second < otherReplicaTimestamp) {
274 }
else if (localReplicaTimestamp.second > otherReplicaTimestamp) {
275 anyTimestampGreater =
true;
280 return anyTimestampGreater ||
281 other.replica_timestamps_.size() < replica_timestamps_.size();
284 std::pair<bool, int64_t>
285 vector_clock::get_timestamp_for_replica(boost::uuids::uuid replica_id)
287 if (replica_timestamps_.count(replica_id) == 0) {
288 return std::make_pair(
false, -1);
290 return std::make_pair(
true, replica_timestamps_[replica_id]);
295 member_selectors::data_member_selector::select(
const member& member)
const
297 return !member.is_lite_member();
300 const std::unique_ptr<member_selector> member_selectors::DATA_MEMBER_SELECTOR(
301 new member_selectors::data_member_selector());
304 namespace partition {
307 StringPartitioningStrategy::get_base_name(
const std::string& name)
309 size_t index_of = name.find(
'@');
310 if (index_of == std::string::npos) {
313 return name.substr(0, index_of);
317 StringPartitioningStrategy::get_partition_key(
const std::string& key)
319 size_t firstIndexOf = key.find(
'@');
320 if (firstIndexOf == std::string::npos) {
323 return key.substr(firstIndexOf + 1);
331 operator==(
const endpoint_qualifier& lhs,
const endpoint_qualifier& rhs)
333 return lhs.type == rhs.type && lhs.identifier == rhs.identifier;
337 member::version::operator==(
const member::version& rhs)
const
339 return major == rhs.major && minor == rhs.minor && patch == rhs.patch;
343 member::version::operator!=(
const member::version& rhs)
const
345 return !(rhs == *
this);
349 member::version::operator<(
const member::version& rhs)
const
351 if (major < rhs.major)
353 if (rhs.major < major)
355 if (minor < rhs.minor)
357 if (rhs.minor < minor)
359 return patch < rhs.patch;
363 member::version::operator>(
const member::version& rhs)
const
369 member::version::operator<=(
const member::version& rhs)
const
371 return !(rhs < *
this);
375 member::version::operator>=(
const member::version& rhs)
const
377 return !(*
this < rhs);
381 operator<<(std::ostream& os,
const member::version& version)
383 os << version.major <<
"." << version.minor <<
"." << version.patch;
391 hash<hazelcast::client::member>::operator()(
394 std::size_t seed = 0;
397 boost::hash_combine(seed, m.get_uuid());
402 hash<hazelcast::client::endpoint_qualifier>::operator()(
405 std::size_t seed = 0;
406 boost::hash_combine(seed, e.type);
407 boost::hash_combine(seed, e.identifier);
Hazelcast cluster interface.
cluster(spi::impl::ClientClusterServiceImpl &cluster_service)
Constructor.
std::vector< member > get_members()
Set of current members of the cluster.
bool remove_membership_listener(boost::uuids::uuid registration_id)
Removes the specified membership_listener.
boost::uuids::uuid add_membership_listener(membership_listener &&listener)
Adds membership_listener to listen for membership updates.
Endpoint represents a peer in the cluster.
boost::uuids::uuid get_uuid() const
Returns the UUID of this endpoint.
const boost::optional< address > & get_socket_address() const
Returns the socket address for this endpoint.
bool is_lite_member() const
Lite member is does not hold data.
boost::uuids::uuid get_uuid() const
Returns UUID of this member.
bool lookup_attribute(const std::string &key) const
check if an attribute is defined for given key.
const std::string * get_attribute(const std::string &key) const
Returns the value of the specified key for this member or default constructed value if value is undef...
version get_version() const
Returns the Hazelcast codebase version of this member; this may or may not be different from the vers...
const address & get_address() const
Returns the socket address of this member.
membership_event(cluster &cluster, const member &m, membership_event_type event_type, const std::unordered_map< boost::uuids::uuid, member, boost::hash< boost::uuids::uuid >> &members_list)
Internal API.
std::unordered_map< boost::uuids::uuid, member, boost::hash< boost::uuids::uuid > > get_members() const
Returns a consistent view of the the members exactly after this MembershipEvent has been processed.
cluster & get_cluster()
Returns the cluster of the event.
virtual ~membership_event()
Destructor.
membership_event_type get_event_type() const
Returns the membership event type; MembershipEvent::MEMBER_JOINED , MembershipEvent::MEMBER_LEFT.
const member & get_member() const
Returns the removed or added member.
Cluster membership listener.