MySQL 8.0.40
Source Code Documentation
gcs_xcom_communication_interface.h
Go to the documentation of this file.
1/* Copyright (c) 2015, 2024, 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_XCOM_COMMUNICATION_INTERFACE_INCLUDED
25#define GCS_XCOM_COMMUNICATION_INTERFACE_INCLUDED
26
27#include <cstdlib>
28#include <map> // std::map
29#include <utility> // std::pair
30#include <vector> // std::vector
31
43
45
46/**
47 @class Gcs_xcom_communication_interface
48
49 Abstraction layer that adds XCom specific methods to the generic
50 communication interface.
51
52 This adds the following functionalities to the generic
53 Gcs_communication_interface:
54 - Ability to send messages without view safety and stats counter. This method
55 shall be used by the State Exchange algorithm when the high-level view
56 change is still occurring.
57 - Delegation method that will contain all the business logic related with
58 messages delivery to registered clients.
59*/
61 public:
62 /**
63 Sends a message that is internal to the binding implementation.
64 This message will not be subject to the same restrictions of send_message.
65 As such, it will not observe view safety nor will count for the statistics
66 of messages sent.
67
68 @param[in] message_to_send the message to send
69 @param[out] message_length the length of message which was send if GCS_OK,
70 unspecified otherwise
71 @param[in] cargo internal message header cargo type
72 @return the xcom broadcast message error
73 @retval GCS_OK message is transmitted successfully
74 @retval GCS_NOK error occurred while transmitting message
75 @retval GCS_MESSAGE_TOO_BIG message is bigger then xcom can handle
76
77 */
78
79 virtual enum_gcs_error do_send_message(const Gcs_message &message_to_send,
80 unsigned long long *message_length,
81 Cargo_type cargo) = 0;
82
84
85 /**
86 Buffer packets when a view is not installed yet and the state
87 exchange phase is being executed.
88
89 Note that this method must be executed by the same thread that
90 processes global view messages and data message in order to
91 avoid any concurrency issue.
92
93 @param packet Packet to buffer.
94 @param xcom_nodes Membership at the time the packet was received
95 */
96
98 Gcs_packet &&packet, std::unique_ptr<Gcs_xcom_nodes> &&xcom_nodes) = 0;
99
100 /**
101 The state exchange phase has been executed and the view has been
102 installed so this is used to send any buffered packet to upper
103 layers.
104
105 Note that this method must be executed by the same thread that
106 processes global view messages and data message in order to
107 avoid any concurrency issue.
108 */
109
110 virtual void deliver_buffered_packets() = 0;
111
112 /*
113 Clean up possible buffered packets that were not delivered to
114 upper layers because the state exchange has not finished and a
115 new global view message was received triggering a new state
116 exchange phase.
117
118 Note that this method must be executed by the same thread that
119 processes global view messages and data message in order to
120 avoid any concurrency issue.
121 */
122
123 virtual void cleanup_buffered_packets() = 0;
124
125 /**
126 Return the number of buffered packets.
127
128 Note that this method must be executed by the same thread that
129 processes global view messages and data message in order to
130 avoid any concurrency issue.
131 */
132
133 virtual size_t number_buffered_packets() = 0;
134
135 /**
136 Notify the pipeline about the new XCom membership when a state exchange
137 begins.
138
139 Note that this method must be executed by the same thread that processes
140 global view messages and data message in order to avoid any concurrency
141 issue.
142
143 @param me The identifier of this server
144 @param members The XCom membership
145 */
147 const Gcs_xcom_nodes &members) = 0;
148
149 /**
150 Attempts to recover the missing packets that are required for a node to
151 join the group successfully.
152 For example, the missing packets may be some fragments of a message that
153 have already been delivered by XCom to the existing members of the group.
154 The joining node needs those fragments in order to be able to deliver the
155 reassembled message when the final fragments are delivered by XCom.
156
157 Note that this method must be executed by the same thread that processes
158 global view messages and data message in order to avoid any concurrency
159 issue.
160
161 @param synodes The synodes where the required packets were decided
162 @returns true If successful, false otherwise
163 */
164 virtual bool recover_packets(Gcs_xcom_synode_set const &synodes) = 0;
165
166 /**
167 Converts the packet into a message that can be delivered to the upper
168 layer.
169
170 @param packet The packet to convert
171 @param xcom_nodes The membership at the time the packet was delivered
172 @retval Gcs_message* if successful
173 @retval nullptr if unsuccessful
174 */
176 Gcs_packet &&packet, std::unique_ptr<Gcs_xcom_nodes> &&xcom_nodes) = 0;
177
178 /**
179 The purpose of this method is to be called when in Gcs_xcom_interface
180 callback method xcom_receive_data is invoked.
181
182 This allows, in terms of software architecture, to concentrate all the
183 message delivery logic and processing in a single place.
184
185 The deliver_message callback that is registered in XCom
186 (in gcs_xcom_interface.h) and that actually receives the low-level
187 messages, is implemented as a delegator to this method.
188
189 Note that the method will be responsible for deleting the message
190 passed as parameter and must be executed by the same thread that
191 processes global view messages and data message in order to avoid
192 any concurrency issue.
193 */
194
196 Gcs_packet &&packet, std::unique_ptr<Gcs_xcom_nodes> &&xcom_nodes) = 0;
197
199};
200
201/**
202 @class Gcs_xcom_communication_interface
203
204 Implementation of the Gcs_communication_interface for xcom.
205*/
207 public:
208 /**
209 Gcs_xcom_communication_interface constructor.
210
211 @param[in] stats a reference to the statistics interface
212 @param[in] proxy a reference to an implementation of
213 Gcs_xcom_communication_proxy
214 @param[in] view_control a reference to a
215 gcs_xcom_view_change_control_interface implementation
216 @param[in] gcs_engine Pointer to gcs engine
217 @param[in] group_id reference to the group identifier
218 @param[in] comms_mgmt an unique_ptr to a
219 Network_provider_management_interface
220 */
221
222 explicit Gcs_xcom_communication(
226 std::unique_ptr<Network_provider_management_interface> comms_mgmt);
227
229
230 // Implementation of the Gcs_communication_interface
231
232 /**
233 Implementation of the public send_message method defined in
234 Gcs_xcom_communication.
235 Besides sending a message to the group, this method does two extra things:
236 - Guarantees view safety, in which no messages can be sent when a view
237 change is occurring.
238 - Registers in the statistics interface that a message was sent.
239
240 @param[in] message_to_send the message to send
241 @return the xcom broadcast message error
242 @retval GCS_OK when message is transmitted successfully
243 @retval GCS_NOK when error occurred while transmitting message
244 @retval GCS_MESSAGE_TOO_BIG when message is bigger then
245 xcom can handle
246 */
247
248 enum_gcs_error send_message(const Gcs_message &message_to_send) override;
249
251 const Gcs_communication_event_listener &event_listener) override;
252
253 void remove_event_listener(int event_listener_handle) override;
254
255 // Implementation of the Gcs_xcom_communication_interface
256 enum_gcs_error do_send_message(const Gcs_message &message_to_send,
257 unsigned long long *message_length,
258 Cargo_type cargo) override;
259
260 // For unit testing purposes
261 std::map<int, const Gcs_communication_event_listener &>
263
265
267 Gcs_packet &&packet,
268 std::unique_ptr<Gcs_xcom_nodes> &&xcom_nodes) override;
269
270 void deliver_buffered_packets() override;
271
272 void cleanup_buffered_packets() override;
273
274 size_t number_buffered_packets() override;
275
277 const Gcs_xcom_nodes &members) override;
278
279 bool recover_packets(Gcs_xcom_synode_set const &synodes) override;
280
282 Gcs_packet &&packet,
283 std::unique_ptr<Gcs_xcom_nodes> &&xcom_nodes) override;
284
286 Gcs_packet &&packet,
287 std::unique_ptr<Gcs_xcom_nodes> &&xcom_nodes) override;
288
290
291 std::pair<bool, std::future<void>> set_protocol_version(
292 Gcs_protocol_version new_version) override;
293
295
297
299
301
302 private:
303 // Registered event listeners
304 std::map<int, const Gcs_communication_event_listener &> event_listeners;
305
306 // Reference to the stats updater interface
308
309 // Reference to the xcom proxy interface
311
312 // Reference to the view change control object
314
315 /**
316 The pipeline of stages a message has to go through before it is delivered
317 to the application or sent to the network.
318 */
320
321 /**
322 Buffer that is used to store packets while the node is about to install
323 a view and is running the state exchange phase.
324 */
325 std::vector<std::pair<Gcs_packet, std::unique_ptr<Gcs_xcom_nodes>>>
327
328 /** Most recent XCom membership known. */
330
331 /** Hash of the group. */
332 unsigned int m_gid_hash;
333
334 /** Protocol changer. */
336
337 /***/
338 std::unique_ptr<Network_provider_management_interface> m_comms_mgmt_interface;
339
340 /** Notify upper layers that a message has been received. */
341 void notify_received_message(std::unique_ptr<Gcs_message> &&message);
342
343 /** Delivers the packet to the upper layer. */
345 std::unique_ptr<Gcs_xcom_nodes> &&xcom_nodes);
346
347 /**
348 @returns the list of possible donors from which to recover the missing
349 packets this server requires to successfully join the group.
350 */
351 std::vector<Gcs_xcom_node_information> possible_packet_recovery_donors()
352 const;
353
354 /**
355 Error code for the packet recovery proceess.
356 */
358 OK,
360 NO_MEMORY,
364 ERROR
365 };
366
367 /**
368 Attempts to recover the packets delivered in @c synodes from @c donor.
369
370 @c recovered_data is an out parameter.
371 */
373 Gcs_xcom_node_information const &donor,
374 Gcs_xcom_synode_set const &synodes,
375 synode_app_data_array &recovered_data);
376
377 /**
378 Processes all the recovered packets.
379 */
381 synode_app_data_array const &recovered_data);
382
383 /**
384 Processes a single recovered packet.
385 */
387 synode_app_data const &recovered_data);
388
389 /**
390 Logs the packet recovery failure.
391 */
393 packet_recovery_result const &error_code,
394 Gcs_xcom_node_information const &donor) const;
395
396 /*
397 Disabling the copy constructor and assignment operator.
398 */
401};
402
403#endif /* GCS_XCOM_COMMUNICATION_INTERFACE_INCLUDED */
This interface is implemented by those who wish to receive messages.
Definition: gcs_communication_event_listener.h:36
This interface represents all the communication facilities that a binding implementation should provi...
Definition: gcs_communication_interface.h:90
This represents the unique identification of a group.
Definition: gcs_group_identifier.h:35
It represents the identity of a group member within a certain group.
Definition: gcs_member_identifier.h:40
This is the pipeline that an outgoing or incoming message has to go through when being sent to or rec...
Definition: gcs_message_stages.h:365
Class that represents the data that is exchanged within a group.
Definition: gcs_message.h:357
This class is an abstraction for the packet concept.
Definition: gcs_internal_message.h:58
Abstraction layer that adds XCom specific methods to the generic communication interface.
Definition: gcs_xcom_communication_interface.h:60
virtual void process_user_data_packet(Gcs_packet &&packet, std::unique_ptr< Gcs_xcom_nodes > &&xcom_nodes)=0
The purpose of this method is to be called when in Gcs_xcom_interface callback method xcom_receive_da...
virtual bool recover_packets(Gcs_xcom_synode_set const &synodes)=0
Attempts to recover the missing packets that are required for a node to join the group successfully.
virtual Gcs_message * convert_packet_to_message(Gcs_packet &&packet, std::unique_ptr< Gcs_xcom_nodes > &&xcom_nodes)=0
Converts the packet into a message that can be delivered to the upper layer.
virtual void buffer_incoming_packet(Gcs_packet &&packet, std::unique_ptr< Gcs_xcom_nodes > &&xcom_nodes)=0
Buffer packets when a view is not installed yet and the state exchange phase is being executed.
virtual void cleanup_buffered_packets()=0
~Gcs_xcom_communication_interface() override=default
virtual size_t number_buffered_packets()=0
Return the number of buffered packets.
virtual enum_gcs_error do_send_message(const Gcs_message &message_to_send, unsigned long long *message_length, Cargo_type cargo)=0
Sends a message that is internal to the binding implementation.
virtual Gcs_message_pipeline & get_msg_pipeline()=0
virtual void deliver_buffered_packets()=0
The state exchange phase has been executed and the view has been installed so this is used to send an...
virtual void update_members_information(const Gcs_member_identifier &me, const Gcs_xcom_nodes &members)=0
Notify the pipeline about the new XCom membership when a state exchange begins.
Implements the communication protocol change logic.
Definition: gcs_xcom_communication_protocol_changer.h:217
Definition: gcs_xcom_communication_interface.h:206
std::map< int, const Gcs_communication_event_listener & > event_listeners
Definition: gcs_xcom_communication_interface.h:304
Gcs_message_pipeline m_msg_pipeline
The pipeline of stages a message has to go through before it is delivered to the application or sent ...
Definition: gcs_xcom_communication_interface.h:319
size_t number_buffered_packets() override
Return the number of buffered packets.
Definition: gcs_xcom_communication_interface.cc:250
bool recover_packets(Gcs_xcom_synode_set const &synodes) override
Attempts to recover the missing packets that are required for a node to join the group successfully.
Definition: gcs_xcom_communication_interface.cc:447
Gcs_message_pipeline & get_msg_pipeline() override
Definition: gcs_xcom_communication_interface.h:264
Gcs_message * convert_packet_to_message(Gcs_packet &&packet, std::unique_ptr< Gcs_xcom_nodes > &&xcom_nodes) override
Converts the packet into a message that can be delivered to the upper layer.
Definition: gcs_xcom_communication_interface.cc:490
packet_recovery_result process_recovered_packets(synode_app_data_array const &recovered_data)
Processes all the recovered packets.
Definition: gcs_xcom_communication_interface.cc:356
void notify_received_message(std::unique_ptr< Gcs_message > &&message)
Notify upper layers that a message has been received.
Definition: gcs_xcom_communication_interface.cc:202
void set_communication_protocol(enum_transport_protocol protocol) override
Sets the communication protocol to use.
Definition: gcs_xcom_communication_interface.cc:640
void deliver_user_data_packet(Gcs_packet &&packet, std::unique_ptr< Gcs_xcom_nodes > &&xcom_nodes)
Delivers the packet to the upper layer.
Definition: gcs_xcom_communication_interface.cc:602
packet_recovery_result recover_packets_from_donor(Gcs_xcom_node_information const &donor, Gcs_xcom_synode_set const &synodes, synode_app_data_array &recovered_data)
Attempts to recover the packets delivered in synodes from donor.
Definition: gcs_xcom_communication_interface.cc:377
std::unique_ptr< Network_provider_management_interface > m_comms_mgmt_interface
Definition: gcs_xcom_communication_interface.h:338
Gcs_xcom_communication(Gcs_xcom_statistics_updater *stats, Gcs_xcom_proxy *proxy, Gcs_xcom_view_change_control_interface *view_control, Gcs_xcom_engine *gcs_engine, Gcs_group_identifier const &group_id, std::unique_ptr< Network_provider_management_interface > comms_mgmt)
Gcs_xcom_communication_interface constructor.
Definition: gcs_xcom_communication_interface.cc:59
void deliver_buffered_packets() override
The state exchange phase has been executed and the view has been installed so this is used to send an...
Definition: gcs_xcom_communication_interface.cc:232
Gcs_protocol_version get_protocol_version() const override
Retrieves the current GCS protocol version in use.
Definition: gcs_xcom_communication_interface.cc:621
void buffer_incoming_packet(Gcs_packet &&packet, std::unique_ptr< Gcs_xcom_nodes > &&xcom_nodes) override
Buffer packets when a view is not installed yet and the state exchange phase is being executed.
Definition: gcs_xcom_communication_interface.cc:222
Gcs_protocol_version get_maximum_supported_protocol_version() const override
Get the maximum protocol version currently supported by the group.
Definition: gcs_xcom_communication_interface.cc:631
Gcs_xcom_proxy * m_xcom_proxy
Definition: gcs_xcom_communication_interface.h:310
void set_maximum_supported_protocol_version(Gcs_protocol_version version)
Definition: gcs_xcom_communication_interface.cc:635
enum_gcs_error send_message(const Gcs_message &message_to_send) override
Implementation of the public send_message method defined in Gcs_xcom_communication.
Definition: gcs_xcom_communication_interface.cc:86
~Gcs_xcom_communication() override
std::vector< Gcs_xcom_node_information > possible_packet_recovery_donors() const
Definition: gcs_xcom_communication_interface.cc:261
void remove_event_listener(int event_listener_handle) override
Removes a previously registered event listener.
Definition: gcs_xcom_communication_interface.cc:198
Gcs_xcom_nodes m_xcom_nodes
Most recent XCom membership known.
Definition: gcs_xcom_communication_interface.h:329
Gcs_xcom_communication & operator=(const Gcs_xcom_communication &)
enum_gcs_error do_send_message(const Gcs_message &message_to_send, unsigned long long *message_length, Cargo_type cargo) override
Sends a message that is internal to the binding implementation.
Definition: gcs_xcom_communication_interface.cc:116
Gcs_xcom_statistics_updater * stats
Definition: gcs_xcom_communication_interface.h:307
void update_members_information(const Gcs_member_identifier &me, const Gcs_xcom_nodes &members) override
Notify the pipeline about the new XCom membership when a state exchange begins.
Definition: gcs_xcom_communication_interface.cc:254
packet_recovery_result process_recovered_packet(synode_app_data const &recovered_data)
Processes a single recovered packet.
Definition: gcs_xcom_communication_interface.cc:286
void log_packet_recovery_failure(packet_recovery_result const &error_code, Gcs_xcom_node_information const &donor) const
Logs the packet recovery failure.
Definition: gcs_xcom_communication_interface.cc:404
Gcs_xcom_communication(const Gcs_xcom_communication &)
enum_transport_protocol get_incoming_connections_protocol() override
Get the incoming connections protocol which is currently active.
Definition: gcs_xcom_communication_interface.cc:646
void process_user_data_packet(Gcs_packet &&packet, std::unique_ptr< Gcs_xcom_nodes > &&xcom_nodes) override
The purpose of this method is to be called when in Gcs_xcom_interface callback method xcom_receive_da...
Definition: gcs_xcom_communication_interface.cc:547
std::map< int, const Gcs_communication_event_listener & > * get_event_listeners()
Definition: gcs_xcom_communication_interface.cc:82
Gcs_xcom_communication_protocol_changer m_protocol_changer
Protocol changer.
Definition: gcs_xcom_communication_interface.h:335
packet_recovery_result
Error code for the packet recovery proceess.
Definition: gcs_xcom_communication_interface.h:357
void cleanup_buffered_packets() override
Definition: gcs_xcom_communication_interface.cc:246
unsigned int m_gid_hash
Hash of the group.
Definition: gcs_xcom_communication_interface.h:332
std::pair< bool, std::future< void > > set_protocol_version(Gcs_protocol_version new_version) override
Modifies the GCS protocol version in use.
Definition: gcs_xcom_communication_interface.cc:625
int add_event_listener(const Gcs_communication_event_listener &event_listener) override
Registers an implementation of a Gcs_communication_event_listener that will receive Communication Eve...
Definition: gcs_xcom_communication_interface.cc:185
std::vector< std::pair< Gcs_packet, std::unique_ptr< Gcs_xcom_nodes > > > m_buffered_packets
Buffer that is used to store packets while the node is about to install a view and is running the sta...
Definition: gcs_xcom_communication_interface.h:326
Gcs_xcom_view_change_control_interface * m_view_control
Definition: gcs_xcom_communication_interface.h:313
Definition: gcs_xcom_notification.h:94
It represents a node within a group and is identified by the member identifier, unique identifier and...
Definition: gcs_xcom_group_member_information.h:193
This class contains information on the configuration, i.e set of nodes or simply site definition.
Definition: gcs_xcom_group_member_information.h:391
Definition: gcs_xcom_proxy.h:52
This interface contains the public methods that the implementation of the Gcs_statistics_interface wi...
Definition: gcs_xcom_statistics_interface.h:39
Definition: gcs_xcom_state_exchange.h:716
Cargo_type
The different cargo type codes.
Definition: gcs_internal_message_headers.h:115
enum_gcs_error
This enumeration describes errors which can occur during group communication operations.
Definition: gcs_types.h:41
Gcs_protocol_version
The GCS protocol versions.
Definition: gcs_types.h:128
static Gcs_xcom_engine * gcs_engine
Definition: gcs_xcom_interface.cc:144
std::unordered_set< Gcs_xcom_synode > Gcs_xcom_synode_set
Definition: gcs_xcom_synode.h:84
enum_transport_protocol
Enum that describes the available XCom Communication Stacks.
Definition: network_provider.h:45
required uint64 version
Definition: replication_group_member_actions.proto:41
Definition: mysqlslap.cc:238