MySQL 8.3.0
Source Code Documentation
gcs_event_handlers.h
Go to the documentation of this file.
1/* Copyright (c) 2014, 2023, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is also distributed with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23#ifndef GCS_EVENT_HANDLERS_INCLUDE
24#define GCS_EVENT_HANDLERS_INCLUDE
25
26#include <set>
27#include <vector>
28
42
43/**
44 Group_member_info_pointer_comparator to guarantee uniqueness
45 */
48 return one->has_lower_uuid(other);
49 }
50};
51
52/*
53 @class Plugin_gcs_events_handler
54
55 Implementation of all GCS event handlers to the plugin
56 */
59 public:
60 /**
61 Plugin_gcs_events_handler constructor
62
63 It receives, via the constructor, all the necessary dependencies to work.
64 */
68 ulong components_stop_timeout);
70
71 /*
72 Implementation of all callback methods
73 */
74 void on_message_received(const Gcs_message &message) const override;
75 void on_view_changed(const Gcs_view &new_view,
76 const Exchanged_data &exchanged_data) const override;
78 void on_suspicions(
79 const std::vector<Gcs_member_identifier> &members,
80 const std::vector<Gcs_member_identifier> &unreachable) const override;
81
82 /**
83 Sets the component stop timeout.
84
85 @param[in] timeout the timeout
86 */
88
89 /**
90 This function disable read-only mode when member version is compatible with
91 group.
92
93 @param[in] force_check Compatibility is mandatory re-checked
94 */
95 void disable_read_mode_for_compatible_members(bool force_check = false) const;
96
97 private:
98 /*
99 Individual handling methods for all possible message types
100 received via on_message_received(...)
101 */
102 void handle_transactional_message(const Gcs_message &message) const;
103 void handle_recovery_metadata(const Gcs_message &message) const;
105 const Gcs_message &message) const;
106 void handle_transaction_prepared_message(const Gcs_message &message) const;
107 void handle_sync_before_execution_message(const Gcs_message &message) const;
108 void handle_certifier_message(const Gcs_message &message) const;
109 void handle_recovery_message(Plugin_gcs_message *message) const;
110 void handle_stats_message(const Gcs_message &message) const;
112 Plugin_gcs_message *processed_message) const;
113 void handle_group_action_message(const Gcs_message &message) const;
114 /**
115 This method passes the message to message listeners
116 @param plugin_message A pointer to the processed plugin gcs message
117 @param message_origin A id of the message originating member
118 @return true if the message should be skipped, false otherwise
119 */
120 bool pre_process_message(Plugin_gcs_message *plugin_message,
121 const std::string &message_origin) const;
122 /*
123 Methods to act upon members after a on_view_change(...) is called
124 */
125 int update_group_info_manager(const Gcs_view &new_view,
126 const Exchanged_data &exchanged_data,
127 bool is_joining, bool is_leaving) const;
128 void handle_joining_members(const Gcs_view &new_view, bool is_joining,
129 bool is_leaving) const;
130 void handle_leaving_members(const Gcs_view &new_view, bool is_joining,
131 bool is_leaving) const;
132
133 /**
134 This method updates the status of the members in the list according to the
135 given parameters.
136
137 @param members the vector with members to change the status to
138 @param status the status to change to.
139 @param old_equal_to change if the old status is equal to
140 @param old_different_from change if the old status if different from
141
142 @note When not using the old_equal_to and old_different_from parameters, you
143 can pass the Group_member_info::MEMBER_END value.
144 */
146 const std::vector<Gcs_member_identifier> &members,
149 Group_member_info::Group_member_status old_different_from) const;
150
151 /**
152 This method handles the election of a new primary node when the plugin runs
153 in single primary mode.
154
155 @param election_mode election type
156 @param suggested_primary what should be the next primary to elect
157
158 @note This function unsets the super read only mode on primary node
159 and sets it on secondary nodes
160 */
162 enum_primary_election_mode election_mode,
163 std::string &suggested_primary) const;
164
165 int process_local_exchanged_data(const Exchanged_data &exchanged_data,
166 bool is_joining) const;
167
168 /**
169 Verifies if a certain Vector of Member Ids contains a given member id.
170
171 @param members the vector with members to verify
172 @param member_id the member to check if it contained.
173
174 @return true if member_id occurs in members.
175 */
176 bool is_member_on_vector(const std::vector<Gcs_member_identifier> &members,
177 const Gcs_member_identifier &member_id) const;
178
179 /**
180 Checks the compatibility of the member with the group.
181 It checks:
182 1) If the number of members was exceeded
183 2) If member version is compatible with the group
184 3) If the gtid_assignment_block_size is equal to the group
185 4) If the hash algorithm used is equal to the group
186 5) If the member has more known transactions than the group
187
188 @param number_of_members the number of members in the new view
189
190 @retval 0 compatible
191 @retval >0 not compatible with the group
192 */
193 int check_group_compatibility(size_t number_of_members) const;
194
195 /**
196 When the member is joining, cycle through all members on group and see if it
197 is compatible with them.
198
199 @return the compatibility with the group
200 @retval INCOMPATIBLE //Versions not compatible
201 @retval COMPATIBLE //Versions compatible
202 @retval READ_COMPATIBLE //Member can read but not write
203 */
205
206 /**
207 Method that compares the group's aggregated GTID set against the joiner
208 GTID set. These sets contain executed and received GTIDs present
209 in the relay log files belonging to each member plugin applier channel.
210
211 @return if the joiner has more GTIDs then the group.
212 @retval 0 Joiner has less GTIDs than the group
213 @retval >0 Joiner has more GTIDS than the group
214 @retval <0 Error when processing GTID information
215 */
217
218 /**
219 This method takes all the group executed sets and adds those belonging to
220 non recovering member to the view change packet
221
222 @param[in] view_packet the view change packet
223 */
224 void collect_members_executed_sets(View_change_packet *view_packet) const;
225
226 /**
227 Method that compares the member options with
228 the value of the same option on all other members.
229 It compares:
230 1) GTID assignment block size
231 2) Write set hash algorithm
232
233 @retval 0 Joiner has the same value as all other members
234 @retval !=0 Otherwise
235 */
237
238 /**
239 Check if a member is not entering a group where an action is running.
240 If action is running provide details of action.
241
242 @param[out] group_action_running_initiator Group action configuration
243 initiator details
244 @param[out] group_action_running_description Group action configuration
245 description
246
247 @retval false no group action is running
248 @retval true a group action is running
249 */
251 std::string &group_action_running_initiator,
252 std::string &group_action_running_description) const;
253
254 /**
255 Check if the group is running a primary election
256
257 @retval false no primary election is running
258 @retval true a primary election is running
259 */
261
262 /**
263 This method checks if member was expelled from the group due
264 to network failures.
265
266 @param[in] view the view delivered by the GCS
267
268 @retval true the member was expelled
269 @retval false otherwise
270 */
271 bool was_member_expelled_from_group(const Gcs_view &view) const;
272
273 /**
274 Logs member joining message to error logs from view.
275
276 @param[in] new_view the view delivered by the GCS
277 */
278 void log_members_joining_message(const Gcs_view &new_view) const;
279
280 /**
281 Logs member leaving message to error logs from view.
282
283 @param[in] new_view the view delivered by the GCS
284 */
285 void log_messages_during_member_leave(const Gcs_view &new_view) const;
286
287 /**
288 This function return all members present in vector of Gcs_member_identifier
289 in HOST:PORT format separated by comma.
290 Function also return PRIMARY member if any in HOST:PORT format.
291
292 @param[in] members joining or leaving members for this view
293 @param[out] all_hosts host and port of all members from view
294 @param[out] primary_host primary member hosts and port of all members from
295 view
296 */
297 void get_hosts_from_view(const std::vector<Gcs_member_identifier> &members,
298 std::string &all_hosts,
299 std::string &primary_host) const;
300
301 /**
302 Leave group on recovering metadata error.
303
304 @param[in] error_message Log error message on member leave.
305 */
306 void leave_group_on_recovery_metadata_error(std::string error_message) const;
307
310
311 /*
312 Holds, until view can be installed, all Member information received from
313 other members
314 */
315 std::set<Group_member_info *, Group_member_info_pointer_comparator>
317
319
320 /**The status of this member when it joins*/
322
323 /* Component stop timeout on shutdown */
325
326#ifndef NDEBUG
328#endif
329
330 /** The notification context for the GCS delivery thread. */
332};
333
334#endif /* GCS_EVENT_HANDLERS_INCLUDE */
Definition: applier.h:275
Definition: compatibility_module.h:39
This interface is implemented by those who wish to receive messages.
Definition: gcs_communication_event_listener.h:35
This interface is implemented by those who wish to receive Control Interface notifications.
Definition: gcs_control_event_listener.h:51
It represents the identity of a group member within a certain group.
Definition: gcs_member_identifier.h:39
This class serves as data container for information flowing in the GCS ecosystem.
Definition: gcs_message.h:47
Class that represents the data that is exchanged within a group.
Definition: gcs_message.h:356
This represents the membership view that a member has from a group.
Definition: gcs_view.h:54
Definition: member_info.h:80
Group_member_status
Definition: member_info.h:168
bool has_lower_uuid(Group_member_info *other)
Return true if server uuid is lower than other member server uuid.
Definition: member_info.cc:902
A convenience context class used to share information between the event handlers and the notifier.
Definition: notification.h:34
Definition: gcs_event_handlers.h:58
bool was_member_expelled_from_group(const Gcs_view &view) const
This method checks if member was expelled from the group due to network failures.
Definition: gcs_event_handlers.cc:966
void handle_single_primary_message(Plugin_gcs_message *processed_message) const
Definition: gcs_event_handlers.cc:431
void handle_transaction_prepared_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:247
void handle_transactional_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:183
void handle_leader_election_if_needed(enum_primary_election_mode election_mode, std::string &suggested_primary) const
This method handles the election of a new primary node when the plugin runs in single primary mode.
Definition: gcs_event_handlers.cc:989
int update_group_info_manager(const Gcs_view &new_view, const Exchanged_data &exchanged_data, bool is_joining, bool is_leaving) const
Definition: gcs_event_handlers.cc:1005
Gcs_message_data * get_exchangeable_data() const override
This method is called when the Data Exchange is about to happen in order for the client to provide wh...
Definition: gcs_event_handlers.cc:1568
void handle_sync_before_execution_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:281
int process_local_exchanged_data(const Exchanged_data &exchanged_data, bool is_joining) const
Definition: gcs_event_handlers.cc:1414
void get_hosts_from_view(const std::vector< Gcs_member_identifier > &members, std::string &all_hosts, std::string &primary_host) const
This function return all members present in vector of Gcs_member_identifier in HOST:PORT format separ...
Definition: gcs_event_handlers.cc:785
void handle_joining_members(const Gcs_view &new_view, bool is_joining, bool is_leaving) const
Definition: gcs_event_handlers.cc:1092
void handle_leaving_members(const Gcs_view &new_view, bool is_joining, bool is_leaving) const
Definition: gcs_event_handlers.cc:1368
void handle_recovery_metadata(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:492
void on_suspicions(const std::vector< Gcs_member_identifier > &members, const std::vector< Gcs_member_identifier > &unreachable) const override
This member function is called when the set of suspicions has changed in the underlying communication...
Definition: gcs_event_handlers.cc:647
void disable_read_mode_for_compatible_members(bool force_check=false) const
This function disable read-only mode when member version is compatible with group.
Definition: gcs_event_handlers.cc:2110
void handle_group_action_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:458
Compatibility_module * compatibility_manager
Definition: gcs_event_handlers.h:318
bool set_number_of_members_on_view_changed_to_10
Definition: gcs_event_handlers.h:327
Plugin_gcs_events_handler(Applier_module_interface *applier_module, Recovery_module *recovery_module, Compatibility_module *compatibility_manager, ulong components_stop_timeout)
Plugin_gcs_events_handler constructor.
Definition: gcs_event_handlers.cc:54
ulong stop_wait_timeout
Definition: gcs_event_handlers.h:324
bool pre_process_message(Plugin_gcs_message *plugin_message, const std::string &message_origin) const
This method passes the message to message listeners.
Definition: gcs_event_handlers.cc:174
void on_message_received(const Gcs_message &message) const override
This method is called whenever a message is to be delivered.
Definition: gcs_event_handlers.cc:78
void handle_recovery_message(Plugin_gcs_message *message) const
Definition: gcs_event_handlers.cc:326
st_compatibility_types check_version_compatibility_with_group() const
When the member is joining, cycle through all members on group and see if it is compatible with them.
Definition: gcs_event_handlers.cc:1801
Recovery_module * recovery_module
Definition: gcs_event_handlers.h:309
int check_group_compatibility(size_t number_of_members) const
Checks the compatibility of the member with the group.
Definition: gcs_event_handlers.cc:1727
void handle_certifier_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:301
bool is_member_on_vector(const std::vector< Gcs_member_identifier > &members, const Gcs_member_identifier &member_id) const
Verifies if a certain Vector of Member Ids contains a given member id.
Definition: gcs_event_handlers.cc:1404
bool is_group_running_a_primary_election() const
Check if the group is running a primary election.
Definition: gcs_event_handlers.cc:2095
Applier_module_interface * applier_module
Definition: gcs_event_handlers.h:308
void leave_group_on_recovery_metadata_error(std::string error_message) const
Leave group on recovering metadata error.
Definition: gcs_event_handlers.cc:637
void log_members_joining_message(const Gcs_view &new_view) const
Logs member joining message to error logs from view.
Definition: gcs_event_handlers.cc:773
void on_view_changed(const Gcs_view &new_view, const Exchanged_data &exchanged_data) const override
This method is called when the view is ready to be installed.
Definition: gcs_event_handlers.cc:823
bool is_group_running_a_configuration_change(std::string &group_action_running_initiator, std::string &group_action_running_description) const
Check if a member is not entering a group where an action is running.
Definition: gcs_event_handlers.cc:2075
void collect_members_executed_sets(View_change_packet *view_packet) const
This method takes all the group executed sets and adds those belonging to non recovering member to th...
Definition: gcs_event_handlers.cc:1941
void log_messages_during_member_leave(const Gcs_view &new_view) const
Logs member leaving message to error logs from view.
Definition: gcs_event_handlers.cc:731
Notification_context m_notification_ctx
The notification context for the GCS delivery thread.
Definition: gcs_event_handlers.h:331
~Plugin_gcs_events_handler() override
Definition: gcs_event_handlers.cc:73
void handle_transactional_with_guarantee_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:210
void update_member_status(const std::vector< Gcs_member_identifier > &members, Group_member_info::Group_member_status status, Group_member_info::Group_member_status old_equal_to, Group_member_info::Group_member_status old_different_from) const
This method updates the status of the members in the list according to the given parameters.
Definition: gcs_event_handlers.cc:1684
void handle_stats_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:417
int compare_member_transaction_sets() const
Method that compares the group's aggregated GTID set against the joiner GTID set.
Definition: gcs_event_handlers.cc:1867
st_compatibility_types * joiner_compatibility_status
The status of this member when it joins.
Definition: gcs_event_handlers.h:321
std::set< Group_member_info *, Group_member_info_pointer_comparator > * temporary_states
Definition: gcs_event_handlers.h:316
int compare_member_option_compatibility() const
Method that compares the member options with the value of the same option on all other members.
Definition: gcs_event_handlers.cc:1965
void set_stop_wait_timeout(ulong timeout)
Sets the component stop timeout.
Definition: gcs_event_handlers.h:87
This is the base GCS plugin message.
Definition: gcs_plugin_messages.h:63
Definition: recovery.h:45
A packet to send view change related info to the applier.
Definition: pipeline_interfaces.h:115
st_compatibility_types
Definition: compatibility_module.h:31
std::vector< std::pair< Gcs_member_identifier *, Gcs_message_data * > > Exchanged_data
Alias for the Data exchanged and delivered from all nodes.
Definition: gcs_control_event_listener.h:39
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:497
enum_primary_election_mode
Enum for election types.
Definition: primary_election_include.h:32
required uint32 status
Definition: replication_asynchronous_connection_failover.proto:60
Group_member_info_pointer_comparator to guarantee uniqueness.
Definition: gcs_event_handlers.h:46
bool operator()(Group_member_info *one, Group_member_info *other) const
Definition: gcs_event_handlers.h:47