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