23#ifndef GCS_XCOM_STATE_EXCHANGE_INCLUDED
24#define GCS_XCOM_STATE_EXCHANGE_INCLUDED
43#include "plugin/group_replication/libmysqlgcs/xdr_gen/xcom_vp.h"
119 synode_no configuration_id,
122 const uchar *data, uint64_t data_size);
196 bool decode(
const uchar *data, uint64_t data_size);
418 synode_no configuration_id, std::vector<Gcs_member_identifier *> &
total,
419 std::vector<Gcs_member_identifier *> &left,
420 std::vector<Gcs_member_identifier *> &joined,
421 std::vector<std::unique_ptr<Gcs_message_data>> &exchangeable_data,
422 Gcs_view *current_view, std::string *group,
452 virtual std::vector<Gcs_xcom_node_information>
480 virtual std::set<Gcs_member_identifier *> *
get_left() = 0;
486 virtual std::set<Gcs_member_identifier *> *
get_total() = 0;
498 virtual std::map<Gcs_member_identifier, Xcom_member_state *>
524 void init()
override;
526 void reset()
override;
533 synode_no configuration_id, std::vector<Gcs_member_identifier *> &
total,
534 std::vector<Gcs_member_identifier *> &left,
535 std::vector<Gcs_member_identifier *> &joined,
536 std::vector<std::unique_ptr<Gcs_message_data>> &exchangeable_data,
537 Gcs_view *current_view, std::string *group,
559 std::set<Gcs_member_identifier *> *
get_total()
override {
605 std::vector<std::unique_ptr<Gcs_message_data>> &exchangeable_data);
621 std::set<Gcs_member_identifier *> &pset);
This interface represents all the communication facilities that a binding implementation should provi...
Definition: gcs_communication_interface.h:89
It represents the identity of a group member within a certain group.
Definition: gcs_member_identifier.h:39
This represents the membership view that a member has from a group.
Definition: gcs_view.h:54
This class contains information on the configuration, i.e set of nodes or simply site definition.
Definition: gcs_xcom_group_member_information.h:390
Definition: gcs_xcom_state_exchange.h:369
virtual std::map< Gcs_member_identifier, Xcom_member_state * > * get_member_states()=0
virtual std::string * get_group()=0
virtual std::vector< Gcs_xcom_node_information > compute_incompatible_members()=0
Compute the set of incompatible members after the state exchange has finished.
virtual void init()=0
Accomplishes all necessary initialization steps.
virtual bool process_recovery_state()=0
Recovers any missing packets required for the member to join the group.
virtual std::set< Gcs_member_identifier * > * get_total()=0
virtual void end()=0
If messages were buffered during its processing, they are delivered to upper layers and internal stru...
virtual Gcs_xcom_view_identifier * get_new_view_id()=0
Retrieves the new view identifier after a State Exchange.
virtual std::set< Gcs_member_identifier * > * get_left()=0
virtual std::set< Gcs_member_identifier * > * get_joined()=0
virtual ~Gcs_xcom_state_exchange_interface()=default
virtual void reset()=0
If messages were buffered during its processing, they are discarded and internal structures needed ar...
virtual void reset_with_flush()=0
Has the same behavior as the reset but additionally flushes buffered messages.
virtual void compute_maximum_supported_protocol_version()=0
Computes the maximum protocol version supported by the group.
virtual bool state_exchange(synode_no configuration_id, std::vector< Gcs_member_identifier * > &total, std::vector< Gcs_member_identifier * > &left, std::vector< Gcs_member_identifier * > &joined, std::vector< std::unique_ptr< Gcs_message_data > > &exchangeable_data, Gcs_view *current_view, std::string *group, const Gcs_member_identifier &local_info, const Gcs_xcom_nodes &xcom_nodes)=0
Signals the module to start a State Exchange.
virtual bool process_member_state(Xcom_member_state *ms_info, const Gcs_member_identifier &p_id, Gcs_protocol_version maximum_supported_protocol_version, Gcs_protocol_version used_protocol_version)=0
Processes a member state message on an ongoing State Exchange round.
Implementation of the gcs_xcom_state_exchange_interface.
Definition: gcs_xcom_state_exchange.h:510
void init() override
Accomplishes all necessary initialization steps.
Definition: gcs_xcom_state_exchange.cc:333
std::map< Gcs_member_identifier, uint > m_awaited_vector
Definition: gcs_xcom_state_exchange.h:667
void update_communication_channel(const Gcs_xcom_nodes &xcom_nodes)
Update the communication system with information on membership.
Definition: gcs_xcom_state_exchange.cc:655
std::pair< bool, Gcs_protocol_version > members_announce_same_version() const
Checks whether all the existing group members, myself excluded, announce the same protocol version.
Definition: gcs_xcom_state_exchange.cc:753
std::string * get_group() override
Definition: gcs_xcom_state_exchange.h:568
void compute_maximum_supported_protocol_version() override
Computes the maximum protocol version supported by the group.
Definition: gcs_xcom_state_exchange.cc:940
Gcs_member_identifier m_local_information
Definition: gcs_xcom_state_exchange.h:687
std::string * m_group_name
Definition: gcs_xcom_state_exchange.h:684
std::set< Gcs_member_identifier * > * get_joined() override
Definition: gcs_xcom_state_exchange.h:553
Gcs_xcom_view_identifier * get_new_view_id() override
Retrieves the new view identifier after a State Exchange.
Definition: gcs_xcom_state_exchange.cc:1029
Gcs_communication_interface * m_broadcaster
Definition: gcs_xcom_state_exchange.h:665
std::map< Gcs_member_identifier, Xcom_member_state * > * get_member_states() override
Definition: gcs_xcom_state_exchange.h:563
bool is_joining()
Computes if the local member is joining.
Definition: gcs_xcom_state_exchange.cc:493
std::map< Gcs_member_identifier, Gcs_protocol_version > m_member_versions
Definition: gcs_xcom_state_exchange.h:678
Gcs_xcom_nodes m_ms_xcom_nodes
Definition: gcs_xcom_state_exchange.h:695
enum_gcs_error broadcast_state(const Gcs_xcom_view_identifier &proposed_view, std::vector< std::unique_ptr< Gcs_message_data > > &exchangeable_data)
Broadcasts the local state to all nodes in the Cluster.
Definition: gcs_xcom_state_exchange.cc:516
bool process_member_state(Xcom_member_state *ms_info, const Gcs_member_identifier &p_id, Gcs_protocol_version maximum_supported_protocol_version, Gcs_protocol_version used_protocol_version) override
Processes a member state message on an ongoing State Exchange round.
Definition: gcs_xcom_state_exchange.cc:664
std::vector< Gcs_xcom_node_information > compute_incompatible_members() override
Compute the set of incompatible members after the state exchange has finished.
Definition: gcs_xcom_state_exchange.cc:720
std::set< Gcs_member_identifier * > * get_left() override
Definition: gcs_xcom_state_exchange.h:557
void fill_member_set(std::vector< Gcs_member_identifier * > &in, std::set< Gcs_member_identifier * > &pset)
Converts xcom data to a set of internal representation.
Definition: gcs_xcom_state_exchange.cc:1009
bool incompatible_with_group() const
Checks whether this server is incompatible with the group.
Definition: gcs_xcom_state_exchange.cc:787
void update_awaited_vector()
Updates the structure that waits for State Exchanges.
Definition: gcs_xcom_state_exchange.cc:636
bool state_exchange(synode_no configuration_id, std::vector< Gcs_member_identifier * > &total, std::vector< Gcs_member_identifier * > &left, std::vector< Gcs_member_identifier * > &joined, std::vector< std::unique_ptr< Gcs_message_data > > &exchangeable_data, Gcs_view *current_view, std::string *group, const Gcs_member_identifier &local_info, const Gcs_xcom_nodes &xcom_nodes) override
Signals the module to start a State Exchange.
Definition: gcs_xcom_state_exchange.cc:408
bool is_leaving()
Computes if the local member is leaving.
Definition: gcs_xcom_state_exchange.cc:505
std::map< Gcs_member_identifier, uint > m_recover_vector
Definition: gcs_xcom_state_exchange.h:669
void reset_with_flush() override
Has the same behavior as the reset but additionally flushes buffered messages.
Definition: gcs_xcom_state_exchange.cc:335
std::set< Gcs_member_identifier * > m_ms_total
Definition: gcs_xcom_state_exchange.h:672
std::set< Gcs_member_identifier * > m_ms_left
Definition: gcs_xcom_state_exchange.h:672
bool snapshot_is_enough(Gcs_xcom_synode_set const &snapshot_to_recover) const
Auxiliary method that checks whether snapshot_to_recover contains all the synodes required.
void save_member_state(Xcom_member_state *ms_info, const Gcs_member_identifier &p_id, Gcs_protocol_version maximum_supported_protocol_version, Gcs_protocol_version used_protocol_version)
Stores the member's state and protocol version.
Definition: gcs_xcom_state_exchange.cc:1015
~Gcs_xcom_state_exchange() override
Definition: gcs_xcom_state_exchange.cc:324
std::map< Gcs_member_identifier, Xcom_member_state * > m_member_states
Definition: gcs_xcom_state_exchange.h:675
std::vector< synode_no > cached_ids
Definition: gcs_xcom_state_exchange.h:692
std::map< Gcs_member_identifier, Gcs_protocol_version > m_member_max_versions
Definition: gcs_xcom_state_exchange.h:681
void reset() override
If messages were buffered during its processing, they are discarded and internal structures needed ar...
Definition: gcs_xcom_state_exchange.cc:360
std::vector< Gcs_xcom_node_information > compute_incompatible_joiners()
Computes the set of incompatible nodes that are trying to join the group.
Definition: gcs_xcom_state_exchange.cc:884
std::set< Gcs_member_identifier * > m_ms_joined
Definition: gcs_xcom_state_exchange.h:672
Gcs_xcom_state_exchange(Gcs_xcom_state_exchange const &)
synode_no m_configuration_id
Definition: gcs_xcom_state_exchange.h:690
Gcs_xcom_state_exchange(Gcs_communication_interface *comm)
State Exchange constructor.
Definition: gcs_xcom_state_exchange.cc:308
void end() override
If messages were buffered during its processing, they are delivered to upper layers and internal stru...
Definition: gcs_xcom_state_exchange.cc:399
bool process_recovery_state() override
Recovers any missing packets required for the member to join the group.
Definition: gcs_xcom_state_exchange.cc:962
Gcs_xcom_state_exchange & operator=(Gcs_xcom_state_exchange const &)
std::set< Gcs_member_identifier * > * get_total() override
Definition: gcs_xcom_state_exchange.h:559
Definition: gcs_xcom_state_exchange.h:715
virtual void end_view_exchange()=0
virtual void end_leave()=0
virtual bool is_joining()=0
virtual bool belongs_to_group()=0
virtual void set_current_view(Gcs_view *current_view)=0
virtual bool is_leaving()=0
virtual bool start_leave()=0
virtual void set_unsafe_current_view(Gcs_view *current_view)=0
virtual bool is_finalized()=0
virtual void set_belongs_to_group(bool belong)=0
virtual Gcs_view * get_current_view()=0
virtual bool is_view_changing()=0
virtual ~Gcs_xcom_view_change_control_interface()=default
virtual void wait_for_view_change_end()=0
virtual void end_join()=0
virtual bool start_join()=0
virtual Gcs_view * get_unsafe_current_view()=0
virtual void finalize()=0
virtual void start_view_exchange()=0
Definition: gcs_xcom_state_exchange.h:753
void end_join() override
Definition: gcs_xcom_state_exchange.cc:1213
bool start_join() override
Definition: gcs_xcom_state_exchange.cc:1202
bool is_finalized() override
Definition: gcs_xcom_state_exchange.cc:1231
bool m_view_changing
Definition: gcs_xcom_state_exchange.h:782
My_xp_mutex_impl m_current_view_mutex
Definition: gcs_xcom_state_exchange.h:799
Gcs_view * get_current_view() override
Definition: gcs_xcom_state_exchange.cc:1122
void end_view_exchange() override
Definition: gcs_xcom_state_exchange.cc:1150
My_xp_cond_impl m_wait_for_view_cond
Definition: gcs_xcom_state_exchange.h:786
Gcs_xcom_view_change_control(Gcs_xcom_view_change_control const &)
~Gcs_xcom_view_change_control() override
Definition: gcs_xcom_state_exchange.cc:1101
bool is_view_changing() override
Definition: gcs_xcom_state_exchange.cc:1157
bool is_joining() override
Definition: gcs_xcom_state_exchange.cc:1219
void finalize() override
Definition: gcs_xcom_state_exchange.cc:1229
bool is_leaving() override
Definition: gcs_xcom_state_exchange.cc:1192
void start_view_exchange() override
Definition: gcs_xcom_state_exchange.cc:1144
void wait_for_view_change_end() override
Definition: gcs_xcom_state_exchange.cc:1166
Gcs_xcom_view_change_control & operator=(Gcs_xcom_view_change_control const &)
bool belongs_to_group() override
Definition: gcs_xcom_state_exchange.cc:1136
void set_belongs_to_group(bool belong) override
Definition: gcs_xcom_state_exchange.cc:1140
void set_current_view(Gcs_view *current_view) override
Definition: gcs_xcom_state_exchange.cc:1108
bool start_leave() override
Definition: gcs_xcom_state_exchange.cc:1175
bool m_joining
Definition: gcs_xcom_state_exchange.h:784
My_xp_mutex_impl m_joining_leaving_mutex
Definition: gcs_xcom_state_exchange.h:788
void end_leave() override
Definition: gcs_xcom_state_exchange.cc:1186
Gcs_xcom_view_change_control()
Definition: gcs_xcom_state_exchange.cc:1078
bool m_belongs_to_group
Definition: gcs_xcom_state_exchange.h:804
std::atomic< bool > m_finalized
Definition: gcs_xcom_state_exchange.h:808
Gcs_view * m_current_view
Definition: gcs_xcom_state_exchange.h:793
My_xp_mutex_impl m_wait_for_view_mutex
Definition: gcs_xcom_state_exchange.h:787
Gcs_view * get_unsafe_current_view() override
Definition: gcs_xcom_state_exchange.cc:1132
bool m_leaving
Definition: gcs_xcom_state_exchange.h:783
void set_unsafe_current_view(Gcs_view *current_view) override
Definition: gcs_xcom_state_exchange.cc:1116
Definition: gcs_xcom_view_identifier.h:32
Definition: my_xp_cond.h:135
Definition: my_xp_mutex.h:122
Class that conveys the state to be exchanged between members, which is not provided by XCom.
Definition: gcs_xcom_state_exchange.h:104
Xcom_member_state & operator=(Xcom_member_state const &)=delete
Xcom_member_state(Xcom_member_state const &)=delete
Gcs_xcom_view_identifier * m_view_id
Definition: gcs_xcom_state_exchange.h:262
synode_no m_configuration_id
Definition: gcs_xcom_state_exchange.h:268
const Gcs_xcom_synode_set & get_snapshot() const
Definition: gcs_xcom_state_exchange.h:244
Gcs_protocol_version m_version
GCS communication version number in use.
Definition: gcs_xcom_state_exchange.h:293
static constexpr uint64_t get_encode_snapshot_elem_size()
Definition: gcs_xcom_state_exchange.h:254
Gcs_xcom_view_identifier * get_view_id()
Definition: gcs_xcom_state_exchange.h:224
uint64_t get_encode_payload_size() const
Definition: gcs_xcom_state_exchange.cc:73
static constexpr uint64_t get_encode_header_size()
Definition: gcs_xcom_state_exchange.h:208
bool decode_header(const uchar *buffer, uint64_t buffer_len)
Decodes the Member State's header that was sent through the network.
Definition: gcs_xcom_state_exchange.cc:205
uchar * m_data
Definition: gcs_xcom_state_exchange.h:273
static constexpr auto WIRE_XCOM_SNAPSHOT_NR_ELEMS_SIZE
Definition: gcs_xcom_state_exchange.h:252
static constexpr auto WIRE_XCOM_VARIABLE_VIEW_ID_SIZE
Definition: gcs_xcom_state_exchange.h:247
static constexpr auto WIRE_XCOM_VIEW_ID_SIZE
Definition: gcs_xcom_state_exchange.h:248
static constexpr auto WIRE_XCOM_GROUP_ID_SIZE
Definition: gcs_xcom_state_exchange.h:249
uint64_t get_data_size() const
Definition: gcs_xcom_state_exchange.h:242
uint64_t m_data_size
Definition: gcs_xcom_state_exchange.h:278
bool encode_header(uchar *buffer, uint64_t *buffer_len) const
Encodes the Member State's header to be sent through the newtwork.
Definition: gcs_xcom_state_exchange.cc:91
bool encode_snapshot(uchar *buffer, uint64_t *buffer_len) const
Encodes the Member State's snapshot to be sent through the network.
Definition: gcs_xcom_state_exchange.cc:158
static constexpr auto WIRE_XCOM_NODE_ID_SIZE
Definition: gcs_xcom_state_exchange.h:251
~Xcom_member_state()
Member state destructor.
Definition: gcs_xcom_state_exchange.cc:68
static constexpr auto WIRE_XCOM_MSG_ID_SIZE
Definition: gcs_xcom_state_exchange.h:250
bool decode(const uchar *data, uint64_t data_size)
Decodes Member State that was sent through the network.
Definition: gcs_xcom_state_exchange.cc:280
Xcom_member_state(const Gcs_xcom_view_identifier &view_id, synode_no configuration_id, Gcs_protocol_version version, const Gcs_xcom_synode_set &snapshot, const uchar *data, uint64_t data_size)
Xcom_member_state constructor.
Definition: gcs_xcom_state_exchange.cc:37
bool decode_snapshot(const uchar *buffer, uint64_t buffer_len)
Decodes the Member State's snapshot that was sent through the network.
Definition: gcs_xcom_state_exchange.cc:238
synode_no get_configuration_id() const
Definition: gcs_xcom_state_exchange.h:230
Gcs_xcom_synode_set m_snapshot
Recovery information which is currently a list of the XCom synods of the fragments that are in buffer...
Definition: gcs_xcom_state_exchange.h:288
const uchar * get_data() const
Definition: gcs_xcom_state_exchange.h:236
uint64_t get_encode_snapshot_size() const
Definition: gcs_xcom_state_exchange.cc:77
enum_gcs_error
This enumeration describes errors which can occur during group communication operations.
Definition: gcs_types.h:40
Gcs_protocol_version
The GCS protocol versions.
Definition: gcs_types.h:127
std::unordered_set< Gcs_xcom_synode > Gcs_xcom_synode_set
Definition: gcs_xcom_synode.h:83
unsigned char uchar
Definition: my_inttypes.h:51
Type total(const Shards< COUNT > &shards) noexcept
Get the total value of all shards.
Definition: ut0counter.h:332
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:419
std::vector< T, ut::allocator< T > > vector
Specialization of vector which uses allocator.
Definition: ut0new.h:2873
required uint64 version
Definition: replication_group_member_actions.proto:40