MySQL 8.4.2
Source Code Documentation
rpl_context.h
Go to the documentation of this file.
1/* Copyright (c) 2014, 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 RPL_SESSION_H
25#define RPL_SESSION_H
26
27#include <sys/types.h>
28#include <memory>
29
30#include "my_inttypes.h" // IWYU pragma: keep
31#include "mysql/binlog/event/compression/compressor.h" // mysql::binlog::event::compression::Compressor
33
37#include "sql/psi_memory_key.h"
38#include "sql/resource_blocker.h" // resource_blocker::User
40
41#include <functional>
42#include <vector>
43
44class Gtid_set;
45class Tsid_map;
46class THD;
47struct Gtid;
48
49/** Type of replication channel thread/transaction might be associated to*/
51 NO_CHANNEL_INFO = 0, // No information exists about the channel
52 RPL_STANDARD_CHANNEL = 1, // It is a standard replication channel
53 GR_APPLIER_CHANNEL = 2, // It is a GR applier channel
54 GR_RECOVERY_CHANNEL = 3 // It is a GR recovery channel
55};
56
57/**
58 This class is an interface for session consistency instrumentation
59 in the server. It holds the context information for a given session.
60
61 It does not require locking since access to this content is mutually
62 exclusive by design (only one thread reading or writing to this object
63 at a time).
64 */
66 public:
67 /**
68 This is an interface to be implemented by classes that want to listen
69 to changes to this context. This can be used, for instance, by the
70 session tracker gtids to become aware of ctx modifications.
71 */
73 public:
75 virtual ~Ctx_change_listener() = default;
77
78 private:
79 // not implemented
82 };
83
84 private:
85 /*
86 Local tsid_map to enable a lock free m_gtid_set.
87 */
89
90 /**
91 Set holding the transaction identifiers of the gtids
92 to reply back on the response packet.
93
94 Lifecycle: Emptied after the reply is sent back to the application. Remains
95 empty until:
96 - a RW transaction commits and a GTID is written to the binary log.
97 - a RO transaction is issued, the consistency level is set to "Check
98 Potential Writes" and the transaction is committed.
99 */
101
102 /**
103 If a listener is registered, e.g., the session track gtids, then this
104 points to an instance of such listener.
105
106 Since this context is valid only for one session, there is no need
107 to protect this with locks.
108 */
110
111 /**
112 Keeps track of the current session track gtids, so that we capture
113 according to what was set before. For instance, if the user does:
114 SET @@SESSION.SESSION_TRACK_GTIDS='ALL_GTIDS';
115 ...
116 SET @@SESSION.SESSION_TRACK_GTIDS='OWN_GTID';
117
118 The last statement should return a set of GTIDs.
119 */
121
122 protected:
123 /*
124 Auxiliary function to determine if GTID collection should take place
125 when it is invoked. It takes into consideration the gtid_mode and
126 the current session context.
127
128 @param thd the thread context.
129 @return true if should collect gtids, false otherwise.
130 */
131 inline bool shall_collect(const THD *thd);
132
133 /**
134 Auxiliary function that allows notification of ctx change listeners.
135 */
138 }
139
140 public:
141 /**
142 Simple constructor.
143 */
145
146 /**
147 The destructor. Deletes the m_gtid_set and the tsid_map.
148 */
150
151 /**
152 Registers the listener. The pointer MUST not be NULL.
153
154 @param listener a pointer to the listener to register.
155 @param thd THD context associated to this listener.
156 */
159
160 /**
161 Unregisters the listener. The listener MUST have registered previously.
162
163 @param listener a pointer to the listener to register.
164 */
167
168 /**
169 This member function MUST return a reference to the set of collected
170 GTIDs so far.
171
172 @return the set of collected GTIDs so far.
173 */
174 inline Gtid_set *state() { return m_gtid_set; }
175
176 /**
177 This function MUST be called after the response packet is set to the
178 client connected. The implementation may act on the collected state
179 for instance to do garbage collection.
180
181 @param thd The thread context.
182 * @return true on error, false otherwise.
183 */
184 virtual bool notify_after_response_packet(const THD *thd);
185
186 /**
187 This function SHALL be called once the GTID for the given transaction has
188 has been added to GTID_EXECUTED.
189
190 This function SHALL store the data if the
191 thd->variables.session_track_gtids is set to a value other than NONE.
192
193 @param thd The thread context.
194 @return true on error, false otherwise.
195 */
196 virtual bool notify_after_gtid_executed_update(const THD *thd);
197
198 /**
199 This function MUST be called after a transaction is committed
200 in the server. It should be called regardless whether it is a
201 RO or RW transaction. Also, DDLs, DDS are considered transaction
202 for what is worth.
203
204 This function SHALL store relevant data for the session consistency.
205
206 @param thd The thread context.
207 @return true on error, false otherwise.
208 */
209 virtual bool notify_after_transaction_commit(const THD *thd);
210
211 virtual bool notify_after_xa_prepare(const THD *thd) {
213 }
214
215 /**
216 Update session tracker (m_curr_session_track_gtids) from thd.
217 */
219
220 private:
221 // not implemented
225};
226
227/**
228 This class tracks the last used GTID per session.
229*/
231 public:
234
235 /**
236 Set the last used GTID the session.
237
238 @param[in] gtid the used gtid.
239 @param[in] sid the used sid.
240 */
241 void set_last_used_gtid(const Gtid &gtid, const mysql::gtid::Tsid &sid);
242
243 /**
244 Get the last used GTID the session.
245
246 @param[out] gtid the used gtid.
247 */
248 void get_last_used_gtid(Gtid &gtid);
249
250 /**
251 Get the last used TSID of the session.
252
253 @param[out] tsid the used tsid.
254 */
256
257 private:
258 std::unique_ptr<Gtid> m_last_used_gtid;
260};
261
267
268 public:
269 using Compressor_ptr_t = std::shared_ptr<Compressor_t>;
272
274
275 /// Return the compressor.
276 ///
277 /// This constructs the compressor on the first invocation and
278 /// returns the same compressor on subsequent invocations.
280
281 /// Return reference to the buffer sequence holding compressed
282 /// bytes.
284
285 private:
289};
290
291/**
292 Keeps the THD session context to be used with the
293 `Bgc_ticket_manager`. In particular, manages the value of the ticket the
294 current THD session has been assigned to.
295 */
297 public:
299 virtual ~Binlog_group_commit_ctx() = default;
300
301 /**
302 Retrieves the ticket that the THD session has been assigned to. If
303 it hasn't been assigned to any yet, returns '0'.
304
305 @return The ticket the THD session has been assigned to, if
306 any. Returns `0` if it hasn't.
307 */
309 /**
310 Sets the THD session's ticket to the given value.
311
312 @param ticket The ticket to set the THD session to.
313 */
315 /**
316 Assigns the THD session to the ticket accepting assignments in the
317 ticket manager. The method is idem-potent within the execution of a
318 statement. This means that it can be invoked several times during the
319 execution of a command within the THD session that only once will the
320 session be assign to a ticket.
321 */
322 void assign_ticket();
323 /**
324 Whether or not the session already waited on the ticket.
325
326 @return true if the session already waited, false otherwise.
327 */
328 bool has_waited();
329 /**
330 Marks the underlying session has already waited on the ticket.
331 */
333 /**
334 Resets the THD session's ticket context.
335 */
336 void reset();
337 /**
338 Returns the textual representation of this object;
339
340 @return a string containing the textual representation of this object.
341 */
342 std::string to_string() const;
343 /**
344 Dumps the textual representation of this object into the given output
345 stream.
346
347 @param out The stream to dump this object into.
348 */
349 void format(std::ostream &out) const;
350 /**
351 Dumps the textual representation of an instance of this class into the
352 given output stream.
353
354 @param out The output stream to dump the instance to.
355 @param to_dump The class instance to dump to the output stream.
356
357 @return The output stream to which the instance was dumped to.
358 */
359 inline friend std::ostream &operator<<(
360 std::ostream &out, Binlog_group_commit_ctx const &to_dump) {
361 to_dump.format(out);
362 return out;
363 }
364 /**
365 Retrieves the flag for determining if it should be possible to manually
366 set the session's ticket.
367
368 @return the reference for the atomic flag.
369 */
371
372 private:
373 /** The ticket the THD session has been assigned to. */
375 /** Whether or not the session already waited on the ticket. */
376 bool m_has_waited{false};
377
378 public:
379 /// Set whether binlog max size was exceeded.
380 /// The max size exceeded condition must be checked with LOCK_log held and
381 /// thus its done early during flush stage although not used until end of BGC.
382 /// This is an optimization which avoids taking LOCK_log at end of BGC when no
383 /// session has seen that the threshold has been exceeded.
384 void set_max_size_exceeded(bool value) { m_max_size_exceeded = value; }
385
386 /// Turn on forced rotate at end of BGC. Thus performing a rotate although
387 /// the max size has not been reached.
389
390 /// Aggregate the rotate requests over all sessions in queue
391 ///
392 /// @return The first element states whether any session
393 /// detected max binlog size exceeded and the second whether any session
394 /// requested forced binlog rotate.
395 static std::pair<bool, bool> aggregate_rotate_settings(THD *queue);
396
397 private:
398 /// Whether session detected that binlog max size was exceeded.
400 /// Whether session requests forced rotate
401 bool m_force_rotate{false};
402};
403
404/*
405 This class SHALL encapsulate the replication context associated with the THD
406 object.
407 */
409 public:
410 /**
411 This structure helps to maintain state of transaction.
412 State of transaction is w.r.t delegates
413 Please refer Trans_delegate to understand states being referred.
414 */
416 // Initialized, first state
418 // begin is being called
420 // binlog cache created, transaction will be binlogged
422 // before_commit is being called
424 // before_rollback is being called
426 // transaction has ended
428 // end
429 TX_RPL_STAGE_END // Not used
430 };
431
433
434 private:
438 /** Manages interaction and keeps context w.r.t `Bgc_ticket_manager` */
440 std::vector<std::function<bool()>> m_post_filters_actions;
441 /** If this thread is a channel, what is its type*/
443
446
447 public:
451
452 /**
453 Initializers. Clears the writeset session history and re-set delegate state
454 to INIT.
455 */
456 void init();
457
459 return m_session_gtids_ctx;
460 }
461
464 }
465
466 /**
467 Retrieves the class member responsible for managing the interaction
468 with `Bgc_ticket_manager`.
469
470 @return The class member responsible for managing the interaction
471 with `Bgc_ticket_manager`.
472 */
474
476
477 void set_rpl_channel_type(enum_rpl_channel_type rpl_channel_type_arg) {
478 rpl_channel_type = rpl_channel_type_arg;
479 }
480
483 }
484
485 std::vector<std::function<bool()>> &post_filters_actions() {
487 }
488
489 /**
490 Sets the transaction states
491
492 @param[in] status state to which THD is progressing
493 */
496
497 /**
498 Returns the transaction state.
499
500 @return status transaction status is returned
501 */
503
504 private:
505 /* Maintains transaction status of Trans_delegate. */
508};
509
510#endif /* RPL_SESSION_H */
Keeps the THD session context to be used with the Bgc_ticket_manager.
Definition: rpl_context.h:296
void assign_ticket()
Assigns the THD session to the ticket accepting assignments in the ticket manager.
Definition: rpl_context.cc:247
bool m_has_waited
Whether or not the session already waited on the ticket.
Definition: rpl_context.h:376
void set_force_rotate()
Turn on forced rotate at end of BGC.
Definition: rpl_context.h:388
binlog::BgcTicket get_session_ticket()
Retrieves the ticket that the THD session has been assigned to.
Definition: rpl_context.cc:236
bool has_waited()
Whether or not the session already waited on the ticket.
Definition: rpl_context.cc:256
virtual ~Binlog_group_commit_ctx()=default
bool m_max_size_exceeded
Whether session detected that binlog max size was exceeded.
Definition: rpl_context.h:399
binlog::BgcTicket m_session_ticket
The ticket the THD session has been assigned to.
Definition: rpl_context.h:374
static memory::Aligned_atomic< bool > & manual_ticket_setting()
Retrieves the flag for determining if it should be possible to manually set the session's ticket.
Definition: rpl_context.cc:284
void set_max_size_exceeded(bool value)
Set whether binlog max size was exceeded.
Definition: rpl_context.h:384
void format(std::ostream &out) const
Dumps the textual representation of this object into the given output stream.
Definition: rpl_context.cc:275
static std::pair< bool, bool > aggregate_rotate_settings(THD *queue)
Aggregate the rotate requests over all sessions in queue.
Definition: rpl_context.cc:289
bool m_force_rotate
Whether session requests forced rotate.
Definition: rpl_context.h:401
friend std::ostream & operator<<(std::ostream &out, Binlog_group_commit_ctx const &to_dump)
Dumps the textual representation of an instance of this class into the given output stream.
Definition: rpl_context.h:359
std::string to_string() const
Returns the textual representation of this object;.
Definition: rpl_context.cc:269
void set_session_ticket(binlog::BgcTicket ticket)
Sets the THD session's ticket to the given value.
Definition: rpl_context.cc:240
void reset()
Resets the THD session's ticket context.
Definition: rpl_context.cc:262
void mark_as_already_waited()
Marks the underlying session has already waited on the ticket.
Definition: rpl_context.cc:258
Binlog_group_commit_ctx()=default
Represents a set of GTIDs.
Definition: rpl_gtid.h:1556
This class tracks the last used GTID per session.
Definition: rpl_context.h:230
void get_last_used_tsid(mysql::gtid::Tsid &tsid)
Get the last used TSID of the session.
Definition: rpl_context.cc:210
Last_used_gtid_tracker_ctx()
Definition: rpl_context.cc:193
mysql::gtid::Tsid m_last_used_tsid
Definition: rpl_context.h:259
void get_last_used_gtid(Gtid &gtid)
Get the last used GTID the session.
Definition: rpl_context.cc:205
void set_last_used_gtid(const Gtid &gtid, const mysql::gtid::Tsid &sid)
Set the last used GTID the session.
Definition: rpl_context.cc:199
std::unique_ptr< Gtid > m_last_used_gtid
Definition: rpl_context.h:258
virtual ~Last_used_gtid_tracker_ctx()
Definition: rpl_context.h:408
std::vector< std::function< bool()> > & post_filters_actions()
Definition: rpl_context.h:485
enum_transaction_rpl_delegate_status get_tx_rpl_delegate_stage_status()
Returns the transaction state.
Definition: rpl_context.cc:310
Last_used_gtid_tracker_ctx m_last_used_gtid_tracker_ctx
Definition: rpl_context.h:436
enum_transaction_rpl_delegate_status m_tx_rpl_delegate_stage_status
Definition: rpl_context.h:506
enum_transaction_rpl_delegate_status
This structure helps to maintain state of transaction.
Definition: rpl_context.h:415
@ TX_RPL_STAGE_CACHE_CREATED
Definition: rpl_context.h:421
@ TX_RPL_STAGE_CONNECTION_CLEANED
Definition: rpl_context.h:427
@ TX_RPL_STAGE_BEFORE_ROLLBACK
Definition: rpl_context.h:425
@ TX_RPL_STAGE_BEGIN
Definition: rpl_context.h:419
@ TX_RPL_STAGE_INIT
Definition: rpl_context.h:417
@ TX_RPL_STAGE_BEFORE_COMMIT
Definition: rpl_context.h:423
@ TX_RPL_STAGE_END
Definition: rpl_context.h:429
Transaction_compression_ctx m_transaction_compression_ctx
Definition: rpl_context.h:437
void set_tx_rpl_delegate_stage_status(enum_transaction_rpl_delegate_status status)
Sets the transaction states.
Definition: rpl_context.cc:304
std::vector< std::function< bool()> > m_post_filters_actions
Definition: rpl_context.h:440
Transaction_compression_ctx & transaction_compression_ctx()
Definition: rpl_context.h:481
Session_consistency_gtids_ctx m_session_gtids_ctx
Definition: rpl_context.h:435
resource_blocker::User dump_thread_user
Definition: rpl_context.h:432
enum_rpl_channel_type get_rpl_channel_type()
Definition: rpl_context.h:475
Binlog_group_commit_ctx m_binlog_group_commit_ctx
Manages interaction and keeps context w.r.t Bgc_ticket_manager
Definition: rpl_context.h:439
void init()
Initializers.
Definition: rpl_context.cc:300
Session_consistency_gtids_ctx & session_gtids_ctx()
Definition: rpl_context.h:458
Binlog_group_commit_ctx & binlog_group_commit_ctx()
Retrieves the class member responsible for managing the interaction with Bgc_ticket_manager.
Definition: rpl_context.cc:314
void set_rpl_channel_type(enum_rpl_channel_type rpl_channel_type_arg)
Definition: rpl_context.h:477
Rpl_thd_context(const Rpl_thd_context &rsc)
Last_used_gtid_tracker_ctx & last_used_gtid_tracker_ctx()
Definition: rpl_context.h:462
Rpl_thd_context(PSI_memory_key transaction_compression_ctx)
Definition: rpl_context.h:448
enum_rpl_channel_type rpl_channel_type
If this thread is a channel, what is its type.
Definition: rpl_context.h:442
Rpl_thd_context & operator=(const Rpl_thd_context &rsc)
This is an interface to be implemented by classes that want to listen to changes to this context.
Definition: rpl_context.h:72
Ctx_change_listener & operator=(const Ctx_change_listener &rsc)
Ctx_change_listener(const Ctx_change_listener &rsc)
This class is an interface for session consistency instrumentation in the server.
Definition: rpl_context.h:65
virtual bool notify_after_xa_prepare(const THD *thd)
Definition: rpl_context.h:211
virtual bool notify_after_transaction_commit(const THD *thd)
This function MUST be called after a transaction is committed in the server.
Definition: rpl_context.cc:71
bool shall_collect(const THD *thd)
Definition: rpl_context.cc:59
Session_consistency_gtids_ctx::Ctx_change_listener * m_listener
If a listener is registered, e.g., the session track gtids, then this points to an instance of such l...
Definition: rpl_context.h:109
virtual bool notify_after_gtid_executed_update(const THD *thd)
This function SHALL be called once the GTID for the given transaction has has been added to GTID_EXEC...
Definition: rpl_context.cc:97
Gtid_set * state()
This member function MUST return a reference to the set of collected GTIDs so far.
Definition: rpl_context.h:174
void unregister_ctx_change_listener(Session_consistency_gtids_ctx::Ctx_change_listener *listener)
Unregisters the listener.
Definition: rpl_context.cc:179
virtual bool notify_after_response_packet(const THD *thd)
This function MUST be called after the response packet is set to the client connected.
Definition: rpl_context.cc:145
Gtid_set * m_gtid_set
Set holding the transaction identifiers of the gtids to reply back on the response packet.
Definition: rpl_context.h:100
void notify_ctx_change_listener()
Auxiliary function that allows notification of ctx change listeners.
Definition: rpl_context.h:136
void update_tracking_activeness_from_session_variable(const THD *thd)
Update session tracker (m_curr_session_track_gtids) from thd.
Definition: rpl_context.cc:141
virtual ~Session_consistency_gtids_ctx()
The destructor.
Definition: rpl_context.cc:47
ulong m_curr_session_track_gtids
Keeps track of the current session track gtids, so that we capture according to what was set before.
Definition: rpl_context.h:120
Session_consistency_gtids_ctx(const Session_consistency_gtids_ctx &rsc)
Tsid_map * m_tsid_map
Definition: rpl_context.h:88
void register_ctx_change_listener(Session_consistency_gtids_ctx::Ctx_change_listener *listener, THD *thd)
Registers the listener.
Definition: rpl_context.cc:161
Session_consistency_gtids_ctx()
Simple constructor.
Definition: rpl_context.cc:41
Session_consistency_gtids_ctx & operator=(const Session_consistency_gtids_ctx &rsc)
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Definition: rpl_context.h:262
Transaction_compression_ctx(PSI_memory_key key)
Definition: rpl_context.cc:214
Memory_resource_t m_managed_buffer_memory_resource
Definition: rpl_context.h:286
Compressor_ptr_t get_compressor(THD *session)
Return the compressor.
Definition: rpl_context.cc:220
Compressor_ptr_t m_compressor
Definition: rpl_context.h:288
Managed_buffer_sequence_t & managed_buffer_sequence()
Return reference to the buffer sequence holding compressed bytes.
Definition: rpl_context.cc:232
Managed_buffer_sequence_t m_managed_buffer_sequence
Definition: rpl_context.h:287
std::shared_ptr< Compressor_t > Compressor_ptr_t
Definition: rpl_context.h:269
Represents a bidirectional map between TSID and SIDNO.
Definition: rpl_gtid.h:749
Represents the Binlog Group Commit Ticket - BGC Ticket.
Definition: bgc_ticket.h:54
Templated class that encapsulates an std::atomic within a byte buffer that is padded to the processor...
Definition: aligned_atomic.h:158
Abstract base class for compressors.
Definition: compressor.h:80
mysql::binlog::event::compression::buffer::Managed_buffer_sequence<> Managed_buffer_sequence_t
Definition: compressor.h:83
Description of a heuristic to determine how much memory to allocate.
Definition: grow_calculator.h:68
Owned, non-contiguous, growable memory buffer.
Definition: managed_buffer_sequence.h:115
Polymorphism-free memory resource class with custom allocator and deallocator functions.
Definition: memory_resource.h:88
Represents Transaction Source Identifier which is composed of source UUID and transaction tag.
Definition: tsid.h:47
Definition: resource_blocker.h:137
unsigned int PSI_memory_key
Instrumented memory key.
Definition: psi_memory_bits.h:49
Some integer typedefs for easier portability.
static QUEUE queue
Definition: myisampack.cc:210
std::vector< T, ut::allocator< T > > vector
Specialization of vector which uses allocator.
Definition: ut0new.h:2874
required string key
Definition: replication_asynchronous_connection_failover.proto:60
required uint32 status
Definition: replication_asynchronous_connection_failover.proto:61
enum_rpl_channel_type
Type of replication channel thread/transaction might be associated to.
Definition: rpl_context.h:50
@ NO_CHANNEL_INFO
Definition: rpl_context.h:51
@ GR_RECOVERY_CHANNEL
Definition: rpl_context.h:54
@ RPL_STANDARD_CHANNEL
Definition: rpl_context.h:52
@ GR_APPLIER_CHANNEL
Definition: rpl_context.h:53
TODO: Move this structure to mysql/binlog/event/control_events.h when we start using C++11.
Definition: rpl_gtid.h:1100