MySQL 26.7.0
Source Code Documentation
gcs_event_handlers.h
Go to the documentation of this file.
1/* Copyright (c) 2014, 2026, 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 designed to work 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 either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef GCS_EVENT_HANDLERS_INCLUDE
25#define GCS_EVENT_HANDLERS_INCLUDE
26
27#include <set>
28#include <vector>
29
43
44/**
45 Group_member_info_pointer_comparator to guarantee uniqueness
46 */
49 return one->has_lower_uuid(other);
50 }
51};
52
53/*
54 @class Plugin_gcs_events_handler
55
56 Implementation of all GCS event handlers to the plugin
57 */
60 public:
61 /**
62 Plugin_gcs_events_handler constructor
63
64 It receives, via the constructor, all the necessary dependencies to work.
65 */
69 ulong components_stop_timeout);
71
72 /*
73 Implementation of all callback methods
74 */
75 void on_message_received(const Gcs_message &message) const override;
76 void on_view_changed(const Gcs_view &new_view,
77 const Exchanged_data &exchanged_data) const override;
79 void on_suspicions(
80 const std::vector<Gcs_member_identifier> &members,
81 const std::vector<Gcs_member_identifier> &unreachable) const override;
82
83 /**
84 Sets the component stop timeout.
85
86 @param[in] timeout the timeout
87 */
89
90 /**
91 This function disable read-only mode when member version is compatible with
92 group.
93
94 @param[in] force_check Compatibility is mandatory re-checked
95 */
96 void disable_read_mode_for_compatible_members(bool force_check = false) const;
97
98 private:
99 /*
100 Individual handling methods for all possible message types
101 received via on_message_received(...)
102 */
103 void handle_transactional_message(const Gcs_message &message) const;
104 void handle_recovery_metadata(const Gcs_message &message) const;
106 const Gcs_message &message) const;
107 void handle_transaction_prepared_message(const Gcs_message &message) const;
108 void handle_sync_before_execution_message(const Gcs_message &message) const;
109 void handle_certifier_message(const Gcs_message &message) const;
110 void handle_recovery_message(Plugin_gcs_message *message) const;
111 void handle_stats_message(const Gcs_message &message) const;
113 Plugin_gcs_message *processed_message) const;
114 void handle_group_action_message(const Gcs_message &message) const;
115 /**
116 This method passes the message to message listeners
117 @param plugin_message A pointer to the processed plugin gcs message
118 @param message_origin A id of the message originating member
119 @return true if the message should be skipped, false otherwise
120 */
121 bool pre_process_message(Plugin_gcs_message *plugin_message,
122 const std::string &message_origin) const;
123
124 /**
125 Logs and leaves the group after receiving a malformed message.
126
127 @param[in] error_message the error message to log and report
128 */
129 void leave_on_malformed_message(const char *error_message) const;
130
131 /**
132 Gets the first payload item raw data, or leaves the group if the message is
133 malformed.
134
135 @param[in] message the message received from GCS
136 @param[in] error_message the error message to log and report
137 @param[out] payload_item_data the data
138 @param[out] payload_item_length the length of the data
139
140 @return the operation status
141 @retval false OK
142 @retval true Error
143 */
145 const char *error_message,
146 const unsigned char **payload_item_data,
147 size_t *payload_item_length) const;
148
149 /*
150 Methods to act upon members after a on_view_change(...) is called
151 */
152 int update_group_info_manager(const Gcs_view &new_view,
153 const Exchanged_data &exchanged_data,
154 bool is_joining, bool is_leaving) const;
155 void handle_joining_members(const Gcs_view &new_view, bool is_joining,
156 bool is_leaving) const;
157 void handle_leaving_members(const Gcs_view &new_view, bool is_joining,
158 bool is_leaving) const;
159
160 /**
161 This method updates the status of the members in the list according to the
162 given parameters.
163
164 @param members the vector with members to change the status to
165 @param status the status to change to.
166 @param old_equal_to change if the old status is equal to
167 @param old_different_from change if the old status if different from
168
169 @note When not using the old_equal_to and old_different_from parameters, you
170 can pass the Group_member_info::MEMBER_END value.
171 */
173 const std::vector<Gcs_member_identifier> &members,
176 Group_member_info::Group_member_status old_different_from) const;
177
178 /**
179 This method handles the election of a new primary node when the plugin runs
180 in single primary mode.
181
182 @param election_mode election type
183 @param suggested_primary what should be the next primary to elect
184
185 @note This function unsets the super read only mode on primary node
186 and sets it on secondary nodes
187 */
189 enum_primary_election_mode election_mode,
190 std::string &suggested_primary) const;
191
192 int process_local_exchanged_data(const Exchanged_data &exchanged_data,
193 bool is_joining) const;
194
195 /**
196 Verifies if a certain Vector of Member Ids contains a given member id.
197
198 @param members the vector with members to verify
199 @param member_id the member to check if it contained.
200
201 @return true if member_id occurs in members.
202 */
203 bool is_member_on_vector(const std::vector<Gcs_member_identifier> &members,
204 const Gcs_member_identifier &member_id) const;
205
206 /**
207 Checks the compatibility of the member with the group.
208 It checks:
209 1) If the number of members was exceeded
210 2) If member version is compatible with the group
211 3) If the gtid_assignment_block_size is equal to the group
212 4) If the hash algorithm used is equal to the group
213 5) If the member has more known transactions than the group
214
215 @param number_of_members the number of members in the new view
216
217 @retval 0 compatible
218 @retval >0 not compatible with the group
219 */
220 int check_group_compatibility(size_t number_of_members) const;
221
222 /**
223 When the member is joining, cycle through all members on group and see if it
224 is compatible with them.
225
226 @return the compatibility with the group
227 @retval INCOMPATIBLE //Versions not compatible
228 @retval COMPATIBLE //Versions compatible
229 @retval READ_COMPATIBLE //Member can read but not write
230 */
232
233 /**
234 Method that compares the group's aggregated GTID set against the joiner
235 GTID set. These sets contain executed and received GTIDs present
236 in the relay log files belonging to each member plugin applier channel.
237
238 @return if the joiner has more GTIDs then the group.
239 @retval 0 Joiner has less GTIDs than the group
240 @retval >0 Joiner has more GTIDS than the group
241 @retval <0 Error when processing GTID information
242 */
244
245 /**
246 This method takes all the group executed sets and adds those belonging to
247 non recovering member to the view change packet
248
249 @param[in] view_packet the view change packet
250 */
251 void collect_members_executed_sets(View_change_packet *view_packet) const;
252
253 /**
254 Method that compares the member options with
255 the value of the same option on all other members.
256 It compares:
257 1) GTID assignment block size
258 2) Write set hash algorithm
259
260 @retval 0 Joiner has the same value as all other members
261 @retval !=0 Otherwise
262 */
264
265 /**
266 Check if a member is not entering a group where an action is running.
267 If action is running provide details of action.
268
269 @param[out] group_action_running_initiator Group action configuration
270 initiator details
271 @param[out] group_action_running_description Group action configuration
272 description
273
274 @retval false no group action is running
275 @retval true a group action is running
276 */
278 std::string &group_action_running_initiator,
279 std::string &group_action_running_description) const;
280
281 /**
282 Check if the group is running a primary election
283
284 @retval false no primary election is running
285 @retval true a primary election is running
286 */
288
289 /**
290 This method checks if member was expelled from the group due
291 to network failures.
292
293 @param[in] view the view delivered by the GCS
294
295 @retval true the member was expelled
296 @retval false otherwise
297 */
298 bool was_member_expelled_from_group(const Gcs_view &view) const;
299
300 /**
301 Logs member joining message to error logs from view.
302
303 @param[in] new_view the view delivered by the GCS
304 */
305 void log_members_joining_message(const Gcs_view &new_view) const;
306
307 /**
308 Logs member leaving message to error logs from view.
309
310 @param[in] new_view the view delivered by the GCS
311 */
312 void log_messages_during_member_leave(const Gcs_view &new_view) const;
313
314 /**
315 This function return all members present in vector of Gcs_member_identifier
316 in HOST:PORT format separated by comma.
317 Function also return PRIMARY member if any in HOST:PORT format.
318
319 @param[in] members joining or leaving members for this view
320 @param[out] all_hosts host and port of all members from view
321 @param[out] primary_host primary member hosts and port of all members from
322 view
323 */
324 void get_hosts_from_view(const std::vector<Gcs_member_identifier> &members,
325 std::string &all_hosts,
326 std::string &primary_host) const;
327
328 /**
329 Leave group on recovering metadata error.
330
331 @param[in] error_message Log error message on member leave.
332 */
333 void leave_group_on_recovery_metadata_error(std::string error_message) const;
334
337
338 /*
339 Holds, until view can be installed, all Member information received from
340 other members
341 */
342 std::set<Group_member_info *, Group_member_info_pointer_comparator>
344
346
347 /**The status of this member when it joins*/
349
350 /* Component stop timeout on shutdown */
352
353#ifndef NDEBUG
355#endif
356
357 /** The notification context for the GCS delivery thread. */
359};
360
361#endif /* GCS_EVENT_HANDLERS_INCLUDE */
Definition: applier.h:276
Definition: compatibility_module.h:41
This interface is implemented by those who wish to receive messages.
Definition: gcs_communication_event_listener.h:36
This interface is implemented by those who wish to receive Control Interface notifications.
Definition: gcs_control_event_listener.h:52
It represents the identity of a group member within a certain group.
Definition: gcs_member_identifier.h:40
This class serves as data container for information flowing in the GCS ecosystem.
Definition: gcs_message.h:48
Class that represents the data that is exchanged within a group.
Definition: gcs_message.h:357
This represents the membership view that a member has from a group.
Definition: gcs_view.h:55
Definition: member_info.h:81
Group_member_status
Definition: member_info.h:175
bool has_lower_uuid(Group_member_info *other)
Return true if server uuid is lower than other member server uuid.
Definition: member_info.cc:1041
A convenience context class used to share information between the event handlers and the notifier.
Definition: notification.h:35
Definition: gcs_event_handlers.h:59
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:1042
void handle_single_primary_message(Plugin_gcs_message *processed_message) const
Definition: gcs_event_handlers.cc:505
void handle_transaction_prepared_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:313
bool get_first_payload_item_or_leave(const Gcs_message &message, const char *error_message, const unsigned char **payload_item_data, size_t *payload_item_length) const
Gets the first payload item raw data, or leaves the group if the message is malformed.
Definition: gcs_event_handlers.cc:222
void handle_transactional_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:237
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:1065
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:1081
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:1663
void handle_sync_before_execution_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:347
int process_local_exchanged_data(const Exchanged_data &exchanged_data, bool is_joining) const
Definition: gcs_event_handlers.cc:1494
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:861
void handle_joining_members(const Gcs_view &new_view, bool is_joining, bool is_leaving) const
Definition: gcs_event_handlers.cc:1168
void handle_leaving_members(const Gcs_view &new_view, bool is_joining, bool is_leaving) const
Definition: gcs_event_handlers.cc:1448
void handle_recovery_metadata(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:568
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:723
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:2214
void handle_group_action_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:532
Compatibility_module * compatibility_manager
Definition: gcs_event_handlers.h:345
bool set_number_of_members_on_view_changed_to_10
Definition: gcs_event_handlers.h:354
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:57
ulong stop_wait_timeout
Definition: gcs_event_handlers.h:351
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:202
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:81
void handle_recovery_message(Plugin_gcs_message *message) const
Definition: gcs_event_handlers.cc:400
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:1902
Recovery_module * recovery_module
Definition: gcs_event_handlers.h:336
int check_group_compatibility(size_t number_of_members) const
Checks the compatibility of the member with the group.
Definition: gcs_event_handlers.cc:1828
void handle_certifier_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:372
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:1484
bool is_group_running_a_primary_election() const
Check if the group is running a primary election.
Definition: gcs_event_handlers.cc:2199
Applier_module_interface * applier_module
Definition: gcs_event_handlers.h:335
void leave_group_on_recovery_metadata_error(std::string error_message) const
Leave group on recovering metadata error.
Definition: gcs_event_handlers.cc:713
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:849
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:899
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:2179
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:2035
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:807
Notification_context m_notification_ctx
The notification context for the GCS delivery thread.
Definition: gcs_event_handlers.h:358
~Plugin_gcs_events_handler() override
Definition: gcs_event_handlers.cc:76
void handle_transactional_with_guarantee_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:267
void leave_on_malformed_message(const char *error_message) const
Logs and leaves the group after receiving a malformed message.
Definition: gcs_event_handlers.cc:211
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:1785
void handle_stats_message(const Gcs_message &message) const
Definition: gcs_event_handlers.cc:491
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:1961
st_compatibility_types * joiner_compatibility_status
The status of this member when it joins.
Definition: gcs_event_handlers.h:348
std::set< Group_member_info *, Group_member_info_pointer_comparator > * temporary_states
Definition: gcs_event_handlers.h:343
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:2059
void set_stop_wait_timeout(ulong timeout)
Sets the component stop timeout.
Definition: gcs_event_handlers.h:88
This is the base GCS plugin message.
Definition: gcs_plugin_messages.h:65
Definition: recovery.h:39
A packet to send view change related info to the applier.
Definition: pipeline_interfaces.h:116
st_compatibility_types
Definition: compatibility_module.h:33
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:40
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:499
enum_primary_election_mode
Enum for election types.
Definition: primary_election_include.h:33
required uint32 status
Definition: replication_asynchronous_connection_failover.proto:61
Group_member_info_pointer_comparator to guarantee uniqueness.
Definition: gcs_event_handlers.h:47
bool operator()(Group_member_info *one, Group_member_info *other) const
Definition: gcs_event_handlers.h:48