MySQL 9.5.0
Source Code Documentation
rpl_rli.h
Go to the documentation of this file.
1/* Copyright (c) 2005, 2025, 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_RLI_H
25#define RPL_RLI_H
26
27#include <sys/types.h>
28#include <time.h>
29#include <atomic>
30#include <memory>
31#include <string>
32#include <string_view>
33#include <tuple>
34#include <vector>
35
36#include "lex_string.h"
37#include "map_helpers.h"
38#include "my_bitmap.h"
39#include "my_dbug.h"
40#include "my_inttypes.h"
41#include "my_io.h"
42#include "my_psi_config.h"
43#include "my_sys.h"
48#include "mysql/my_loglevel.h"
50#include "mysql/thread_type.h"
51#include "prealloced_array.h" // Prealloced_array
52#include "sql/binlog.h" // MYSQL_BIN_LOG
55#include "sql/log_event.h" //Gtid_log_event
56#include "sql/psi_memory_key.h"
57#include "sql/query_options.h"
58#include "sql/rpl_gtid.h" // Gtid_set
59#include "sql/rpl_info.h" // Rpl_info
60#include "sql/rpl_mta_submode.h" // enum_mts_parallel_type
62#include "sql/rpl_tblmap.h" // table_mapping
64#include "sql/rpl_utility.h" // Deferred_log_events
65#include "sql/sql_class.h" // THD
67#include "sql/table.h"
68#include "strmake.h"
69
71class Master_info;
72class Rpl_filter;
75class Slave_worker;
76class String;
77struct LEX_SOURCE_INFO;
78
79extern uint sql_replica_skip_counter;
80
82
83typedef struct slave_job_item {
89
90/**
91 This class is used to store the type and value for
92 Assign_gtids_to_anonymous_transactions parameter of Change replication source
93 command on slave.
94*/
96 public:
97 /**
98 This accepted value of the type of the
99 Assign_gtids_to_anonymous_transactions info OFF : Anonymous gtid events
100 won't be converted to Gtid event. LOCAL: Anonymous gtid events will be
101 converted to Gtid event & the UUID used while create GTIDs will be the one
102 of replica which is the server where this transformation of anonymous to
103 gtid event happens. UUID: Anonymous gtid events will be converted to Gtid
104 event & the UUID used while create GTIDs will be the one specified via
105 Change replication source command to the parameter
106 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
107 */
109 /**
110 The default constructor initializes parameters to their default value
111 */
114 m_sidno = 0;
115 }
116 rpl_sidno get_sidno() const { return m_sidno; }
117 enum_type get_type() const;
118 std::string get_value() const;
119 /*
120 Here the assign_gtids_to_anonymous_transactions_value contains the textual
121 representation of the UUID used while creating a GTID.
122 */
123 bool set_info(enum_type assign_gtids_to_anonymous_transactions_type,
124 const char *assign_gtids_to_anonymous_transactions_value);
125
126 private:
127 /** This stores the type of Assign_gtids_to_anonymous_transactions info */
129 /** Stores the UUID in case the m_type is not OFF */
130 std::string m_value;
131 // The sidno corresponding to the UUID value.
133};
134/*******************************************************************************
135Replication SQL Thread
136
137Relay_log_info contains:
138 - the current relay log
139 - the current relay log offset
140 - master log name
141 - master log sequence corresponding to the last update
142 - misc information specific to the SQL thread
143
144Relay_log_info is initialized from a repository, i.e. table or file, if there is
145one. Otherwise, data members are initialized with defaults by calling
146init_relay_log_info().
147
148The applier metadata shall be updated whenever: (i) the relay log file
149is rotated, (ii) SQL Thread is stopped, (iii) while processing a Xid_log_event,
150(iv) after a Query_log_event (i.e. commit or rollback) and (v) after processing
151any statement written to the binary log without a transaction context.
152
153The Xid_log_event is a commit for transactional engines and must be handled
154differently to provide reliability/data integrity. In this case, positions
155are updated within the context of the current transaction. So
156
157 . If the relay.info is stored in a transactional repository and the server
158 crashes before successfully committing the transaction the changes to the
159 position table will be rolled back along with the data.
160
161 . If the relay.info is stored in a non-transactional repository, for instance,
162 a file or a system table created using MyIsam, and the server crashes before
163 successfully committing the transaction the changes to the position table
164 will not be rolled back but data will.
165
166In particular, when there are mixed transactions, i.e a transaction that updates
167both transaction and non-transactional engines, the Xid_log_event is still used
168but reliability/data integrity cannot be achieved as we shall explain in what
169follows.
170
171Changes to non-transactional engines, such as MyIsam, cannot be rolled back if a
172failure happens. For that reason, there is no point in updating the positions
173within the boundaries of any on-going transaction. This is true for both commit
174and rollback. If a failure happens after processing the pseudo-transaction but
175before updating the positions, the transaction will be re-executed when the
176slave is up most likely causing an error that needs to be manually circumvented.
177This is a well-known issue when non-transactional statements are executed.
178
179Specifically, if rolling back any transaction, positions are updated outside the
180transaction boundaries. However, there may be a problem in this scenario even
181when only transactional engines are updated. This happens because if there is a
182rollback and such transaction is written to the binary log, a non-transactional
183engine was updated or a temporary table was created or dropped within its
184boundaries.
185
186In particular, in both STATEMENT and MIXED logging formats, this happens because
187any temporary table is automatically dropped after a shutdown/startup.
188See BUG#26945 for further details.
189
190Statements written to the binary log outside the boundaries of a transaction are
191DDLs or maintenance commands which are not transactional. These means that they
192cannot be rolled back if a failure happens. In such cases, the positions are
193updated after processing the events. If a failure happens after processing the
194statement but before updating the positions, the statement will be
195re-executed when the slave is up most likely causing an error that needs to be
196manually circumvented. This is a well-known issue when non-transactional
197statements are executed.
198
199The --sync-relay-log-info does not have effect when a system table, either
200transactional or non-transactional is used.
201
202To correctly recovery from failures, one should combine transactional system
203tables along with the --relay-log-recovery.
204*******************************************************************************/
205class Relay_log_info : public Rpl_info {
206 friend class Rpl_info_factory;
207
208 public:
209 /**
210 Set of possible return values for the member methods related to
211 `PRIVILEGE_CHECKS_USER` management.
212 */
213 enum class enum_priv_checks_status : int {
214 /** Function ended successfully */
215 SUCCESS = 0,
216 /** Value for user is anonymous (''@'...') */
218 /** Value for the username part of the user is larger than 32 characters */
220 /** Value for the hostname part of the user is larger than 255 characters */
222 /** Value for the hostname part of the user has illegal characters */
224 /**
225 Value for the username part of the user is NULL but the value for the
226 hostname is not NULL.
227 */
229 /**
230 Provided user doesn't exists.
231 */
233 /**
234 Provided user doesn't have the necessary privileges to execute the needed
235 operations.
236 */
238 /** Values provided for the internal variables are corrupted. */
240 /**
241 Provided user doesn't have `FILE` privileges during the execution of a
242 `LOAD DATA`event.
243 */
245 };
246
247 enum class enum_require_row_status : int {
248 /** Function ended successfully */
249 SUCCESS = 0,
250 /** Value for `privilege_checks_user` is not empty */
252 };
253
254 /*
255 The per-channel filter associated with this RLI
256 */
258 /**
259 Flags for the state of the replication.
260 */
262 /** The replication thread is inside a statement */
264
265 /** Flag counter. Should always be last */
267 };
268
269 /**
270 Identifies what is the replica policy on primary keys in tables.
271 */
273 /**No policy, used on PFS*/
275 /**
276 The replica sets the value of sql_require_primary_key according to
277 the source replicated value.
278 */
280 /** The replica enforces tables to have primary keys for a given channel*/
282 /** The replica does not enforce any policy around primary keys*/
284 /** The replica generates GIPKs for incoming keyless tables*/
286 };
287
288 /**
289 Stores the information related to the ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
290 parameter of CHANGE REPLICATION SOURCE
291 */
294
295 /*
296 The SQL thread owns one Relay_log_info, and each client that has
297 executed a BINLOG statement owns one Relay_log_info. This function
298 returns zero for the Relay_log_info object that belongs to the SQL
299 thread and nonzero for Relay_log_info objects that belong to
300 clients.
301 */
302 inline bool belongs_to_client() {
303 assert(info_thd);
304 return !info_thd->slave_thread;
305 }
306/* Instrumentation key for performance schema for mts_temp_table_LOCK */
307#ifdef HAVE_PSI_INTERFACE
309#endif
310 /*
311 Lock to protect race condition while transferring temporary table from
312 worker thread to coordinator thread and vice-versa
313 */
315 /*
316 Lock to acquire by methods that concurrently update lwm of committed
317 transactions and the min waited timestamp and its index.
318 */
321 /*
322 If true, events with the same server id should be replicated. This
323 field is set on creation of a relay log info structure by copying
324 the value of ::replicate_same_server_id and can be overridden if
325 necessary. For example of when this is done, check sql_binlog.cc,
326 where the BINLOG statement can be used to execute "raw" events.
327 */
329
330 /*
331 Protected with internal locks.
332 Must get data_lock when resetting the logs.
333 */
335
336 /*
337 Identifies when the recovery process is going on.
338 See sql/rpl_replica.h:init_recovery for further details.
339 */
341
342 /* The following variables are safe to read any time */
343
344 /*
345 When we restart replica thread we need to have access to the previously
346 created temporary tables. Modified only on init/end and by the SQL
347 thread, read only by SQL thread.
348 */
350
351 /* parent Master_info structure */
353
354 /* number of temporary tables open in this channel */
355 std::atomic<int32> atomic_channel_open_temp_tables{0};
356
357 /** the status of the commit timestamps for the relay log */
358 enum {
359 /*
360 no GTID log event has been processed, so it is not known if this log
361 has commit timestamps
362 */
364 // the immediate master does not support commit timestamps
366 // the immediate master supports commit timestamps
369
370 /**
371 @return the pointer to the Gtid_monitoring_info.
372 */
375 }
376
377 /**
378 Stores the details of the transaction which has just started processing.
379
380 This function is called by the STS applier or MTS worker when applying a
381 Gtid.
382
383 @param gtid_arg the gtid of the trx
384 @param original_ts_arg the original commit timestamp of the transaction
385 @param immediate_ts_arg the immediate commit timestamp of the transaction
386 @param skipped true if the transaction was gtid skipped
387 */
388 void started_processing(Gtid gtid_arg, ulonglong original_ts_arg,
389 ulonglong immediate_ts_arg, bool skipped = false) {
390 gtid_monitoring_info->start(gtid_arg, original_ts_arg, immediate_ts_arg,
391 skipped);
392 }
393
394 /**
395 Stores the details of the transaction which has just started processing.
396
397 This function is called by the MTS coordinator when queuing a Gtid to
398 a worker.
399
400 @param gtid_log_ev_arg the gtid log event of the trx
401 */
402 void started_processing(Gtid_log_event *gtid_log_ev_arg) {
403 Gtid gtid = {0, 0};
404 if (gtid_log_ev_arg->get_type() == ASSIGNED_GTID) {
405 gtid = {gtid_log_ev_arg->get_sidno(true), gtid_log_ev_arg->get_gno()};
406 }
407 started_processing(gtid, gtid_log_ev_arg->original_commit_timestamp,
408 gtid_log_ev_arg->immediate_commit_timestamp);
409 }
410
411 /**
412 When the processing of a transaction is completed, that timestamp is
413 recorded, the information is copied to last_processed_trx and the
414 information in processing_trx is cleared.
415
416 If the transaction was "applied" but GTID-skipped, the copy will not
417 happen and the last_processed_trx will keep its current value.
418 */
420
421 /**
422 @return True if there is a transaction being currently processed
423 */
426 }
427
428 /**
429 Clears the processing_trx structure fields. Normally called when there is an
430 error while processing the transaction.
431 */
433
434 /**
435 Clears the Gtid_monitoring_info fields.
436 */
438
439 /**
440 When a transaction is retried, the error number and message, and total number
441 of retries are stored. The timestamp for this error is also set here.
442
443 @param transient_errno_arg Transient error number.
444 @param transient_err_message_arg Transient error message.
445 @param trans_retries_arg Number of times this transaction has been
446 retried so far.
447 */
448 void retried_processing(uint transient_errno_arg,
449 const char *transient_err_message_arg,
450 ulong trans_retries_arg) {
452 transient_errno_arg, transient_err_message_arg, trans_retries_arg);
453 }
454
455 /*
456 If on init_info() call error_on_rli_init_info is true that means
457 that previous call to init_info() terminated with an error, RESET
458 SLAVE must be executed and the problem fixed manually.
459 */
461
462 /**
463 Retrieves the username part of the `PRIVILEGE_CHECKS_USER` option of `CHANGE
464 MASTER TO` statement.
465
466 @return a string holding the username part of the user or an empty string.
467 */
468 std::string get_privilege_checks_username() const;
469
470 /**
471 Retrieves the host part of the `PRIVILEGE_CHECKS_USER` option of `CHANGE
472 MASTER TO` statement.
473
474 @return a string holding the host part of the user or an empty string.
475 */
476 std::string get_privilege_checks_hostname() const;
477
478 /**
479 Returns whether or not there is no user configured for
480 `PRIVILEGE_CHECKS_USER`.
481
482 @return true if there is no user configured for `PRIVILEGE_CHECKS_USER` and
483 false otherwise.
484 */
486
487 /**
488 Returns whether or not the internal data regarding `PRIVILEGE_CHECKS_USER`
489 is corrupted. This may happen, for instance, if the user tries to change the
490 Relay_log_info repository manually or after a server crash.
491
492 @return true if the data is corrupted, false otherwise.
493 */
495
496 /**
497 Clears the info related to the data initialized from
498 `PRIVILEGE_CHECKS_USER`.
499 */
501
502 /**
503 Sets the flag that tells whether or not the data regarding the
504 `PRIVILEGE_CHECKS_USER` is corrupted.
505
506 @param is_corrupted the flag value.
507 */
508 void set_privilege_checks_user_corrupted(bool is_corrupted);
509
510 /**
511 Initializes data related to `PRIVILEGE_CHECKS_USER`, specifically the user
512 name and the user hostname.
513
514 @param param_privilege_checks_username the username part of the user.
515 @param param_privilege_checks_hostname the hostname part of the user.
516
517 @return a status code describing the state of the data initialization.
518 */
520 char const *param_privilege_checks_username,
521 char const *param_privilege_checks_hostname);
522
523 /**
524 Checks the validity and integrity of the data related to
525 `PRIVILEGE_CHECKS_USER`, specifically the user name and the user
526 hostname. Also checks if the user exists.
527
528 This method takes no parameters as it checks the values stored in the
529 internal member variables.
530
531 @return a status code describing the state of the data initialization.
532 */
534
535 /**
536 Checks the validity and integrity of the data related to
537 `PRIVILEGE_CHECKS_USER`, specifically the user name and the user
538 hostname. Also checks if the user exists.
539
540 @param param_privilege_checks_username the username part of the user.
541 @param param_privilege_checks_hostname the hostname part of the user.
542
543 @return a status code describing the state of the data initialization.
544 */
546 char const *param_privilege_checks_username,
547 char const *param_privilege_checks_hostname);
548 /**
549 Checks the existence of user provided as part of the `PRIVILEGE_CHECKS_USER`
550 option.
551
552 @param param_privilege_checks_username the username part of the user.
553 @param param_privilege_checks_hostname the host part of the user.
554
555 @return a status code describing the state of the data initialization.
556 */
558 char const *param_privilege_checks_username,
559 char const *param_privilege_checks_hostname);
560
561 /**
562 Returns a printable representation of the username and hostname currently
563 being used in the applier security context or empty strings other wise.
564
565 @return an `std::pair` containing the username and the hostname printable
566 representations.
567 */
568 std::pair<const char *, const char *>
570
571 /**
572 Outputs the error message associated with applier thread user privilege
573 checks error `error_code`.
574
575 The output stream to which is outputted is decided based on `to_client`
576 which, if set to `true` will output the message to the client session and if
577 `false` will output to the server log.
578
579 @param level the message urgency level, e.g., `ERROR_LEVEL`,
580 `WARNING_LEVEL`, etc.
581 @param status_code the status code to output the associated error message
582 for.
583 @param to_client a flag indicating if the message should be sent to the
584 client session or to the server log.
585 @param channel_name name of the channel for which the error is being
586 reported.
587 @param user_name username for which the error is being reported.
588 @param host_name hostname for which the error is being reported.
589 */
591 enum_priv_checks_status status_code,
592 bool to_client,
593 char const *channel_name = nullptr,
594 char const *user_name = nullptr,
595 char const *host_name = nullptr) const;
596
597 /**
598 Initializes the security context associated with the `PRIVILEGE_CHECKS_USER`
599 user that is to be used by the provided THD object.
600
601 @return a status code describing the state of the data initialization.
602 */
604 /**
605 Initializes the security context associated with the `PRIVILEGE_CHECKS_USER`
606 user that is to be used by the applier thread.
607
608 @return a status code describing the state of the data initialization.
609 */
611
612 /**
613 Returns whether the slave is running in row mode only.
614
615 @return true if row_format_required is active, false otherwise.
616 */
617 bool is_row_format_required() const;
618
619 /**
620 Sets the flag that tells whether or not the slave is running in row mode
621 only.
622
623 @param require_row the flag value.
624 */
625 void set_require_row_format(bool require_row);
626
627 /**
628 Returns what is the slave policy concerning primary keys on
629 replicated tables.
630
631 @return STREAM if it replicates the source values, ON if it enforces the
632 need on primary keys, OFF if it does no enforce any restrictions,
633 GENERATE if a GIPK is added to the table.
634 */
636
637 /**
638 Sets the field that tells what is the slave policy concerning primary keys
639 on replicated tables.
640
641 @param require_pk the policy value.
642 */
645
646 /*
647 This will be used to verify transactions boundaries of events being applied
648
649 Its output is used to detect when events were not logged using row based
650 logging.
651 */
653
654 /**
655 Marks the applier position information as being invalid or not.
656
657 @param invalid value to set the position/file info as invalid or not
658 */
660
661 /**
662 Returns if the applier positions are marked as being invalid or not.
663
664 @return true if applier position information is not reliable,
665 false otherwise.
666 */
668
669 /*
670 Let's call a group (of events) :
671 - a transaction
672 or
673 - an autocommitting query + its associated events (INSERT_ID,
674 TIMESTAMP...)
675 We need these rli coordinates :
676 - relay log name and position of the beginning of the group we currently are
677 executing. Needed to know where we have to restart when replication has
678 stopped in the middle of a group (which has been rolled back by the slave).
679 - relay log name and position just after the event we have just
680 executed. This event is part of the current group.
681 Formerly we only had the immediately above coordinates, plus a 'pending'
682 variable, but this dealt wrong with the case of a transaction starting on a
683 relay log and finishing (committing) on another relay log. Case which can
684 happen when, for example, the relay log gets rotated because of
685 max_binlog_size.
686 */
687 protected:
688 /**
689 Event group means a group of events of a transaction. group_relay_log_name
690 and group_relay_log_pos record the place before where all event groups
691 are applied. When slave starts, it resume to apply events from
692 group_relay_log_pos. They will be initialized to the begin of the first
693 relay log file if it is a new slave(including SLAVE RESET). Then,
694 group_relay_log_pos is advanced after each transaction is applied
695 successfully in single thread slave. For MTS, group_relay_log_pos
696 is updated by mts checkpoint mechanism. group_relay_log_pos and
697 group_relay_log_name are stored into relay_log_info file/table
698 periodically. When server startup, they are loaded from relay log info
699 file/table.
700 */
706
707 public:
708 /**
709 Process an event and based on its type () set group beginning and end
710 @param ev - event within a group (including first and last)
711 */
713 /**
714 Get event group positions in source binary log on a replica which is
715 processed by a worker in MTA or coordinator in STA.
716 @return source event group start and end position in binary log
717 */
718 std::tuple<ulonglong, ulonglong> get_group_source_log_start_end_pos() const;
719
720 private:
721 /**
722 * Event group beginning event has been seen. Event group may begin with two
723 * events marked as beginning.
724 * @see set_group_source_log_start_end_pos
725 */
727 /**
728 * @see set_group_source_log_start_end_pos, get_group_source_log_start_end_pos
729 */
731 /**
732 * @see set_group_source_log_start_end_pos, get_group_source_log_start_end_pos
733 */
735
736 protected:
737 /* current event's start position in relay log */
739 /*
740 Original log name and position of the group we're currently executing
741 (whose coordinates are group_relay_log_name/pos in the relay log)
742 in the master's binlog. These concern the *group*, because in the master's
743 binlog the log_pos that comes with each event is the position of the
744 beginning of the group.
745
746 Note: group_master_log_name, group_master_log_pos must only be
747 written from the thread owning the Relay_log_info (SQL thread if
748 !belongs_to_client(); client thread executing BINLOG statement if
749 belongs_to_client()).
750 */
753
754 private:
756 /*
757 Identifies when this object belongs to the SQL thread and was not
758 created for a client thread or some other purpose including
759 Slave_worker instance initializations. Ends up serving the same
760 purpose as the belongs_to_client method, but its value is set
761 earlier on in the class constructor.
762 */
764 /* Flag that ensures the retrieved GTID set is initialized only once. */
766
767 /// Flag that ensures the relay log is sanitized only once.
769
770 /**
771 Stores information on the last processed transaction or the transaction
772 that is currently being processed.
773
774 STS:
775 - timestamps of the currently applying/last applied transaction
776
777 MTS:
778 - coordinator thread: timestamps of the currently scheduling/last scheduled
779 transaction in a worker's queue
780 - worker thread: timestamps of the currently applying/last applied
781 transaction
782 */
784
785 /**
786 It will be set to true when receiver truncated relay log for some reason.
787 The truncated data may already be read by applier. So applier need to check
788 it each time the binlog_end_pos is updated.
789 */
791
792 /**
793 The user name part of the user passed on to `PRIVILEGE_CHECKS_USER`.
794 */
796
797 /**
798 The host name part of the user passed on to `PRIVILEGE_CHECKS_USER`.
799 */
801
802 /**
803 Tells whether or not the internal data regarding `PRIVILEGE_CHECKS_USER` is
804 corrupted. This may happen if the user tries to change the Relay_log_info
805 repository by hand.
806 */
808
809 /**
810 Tells if the slave is only accepting events logged with row based logging.
811 It also blocks
812 Operations with temporary table creation/deletion
813 Operations with LOAD DATA
814 Events: INTVAR_EVENT, RAND_EVENT, USER_VAR_EVENT
815 */
817
818 /**
819 Identifies what is the slave policy on primary keys in tables.
820 If set to STREAM it just replicates the value of sql_require_primary_key.
821 If set to ON it fails when the source tries to replicate a table creation
822 or alter operation that does not have a primary key.
823 If set to OFF it does not enforce any policies on the channel for primary
824 keys.
825 If set to GENERATE it adds GIPKs to tables that are created without a PK
826 in the replica applier threads.
827 */
829
830 /**
831 Are positions invalid. If true it means the applier related position
832 information (group_master_log_name and group_master_log_pos) might
833 be outdated.
834
835 Check also is_group_master_log_pos_invalid
836 */
838
839 public:
841
843
845
848 assert(sidno <= get_tsid_map()->get_max_sidno());
849 gtid_set->ensure_sidno(sidno);
850 gtid_set->_add_gtid(sidno, gno);
851 }
852
853 /**
854 Adds a GTID set to received GTID set.
855
856 @param gtid_set the gtid_set to add
857
858 @return RETURN_STATUS_OK or RETURN_STATUS_REPORTED_ERROR.
859 */
861
862 const Gtid_set *get_gtid_set() const { return gtid_set; }
863
864 bool reinit_sql_thread_io_cache(const char *log, bool need_data_lock);
865
866 /**
867 Check if group_relay_log_name is in index file.
868
869 @param [out] errmsg An error message is returned if error happens.
870
871 @retval false It is valid.
872 @retval true It is invalid. In this case, *errmsg is set to point to
873 the error message.
874*/
875 bool is_group_relay_log_name_invalid(const char **errmsg);
876 /**
877 Reset group_relay_log_name and group_relay_log_pos to the start of the
878 first relay log file. The caller must hold data_lock.
879
880 @param[out] errmsg An error message is set into it if error happens.
881
882 @retval false Success
883 @retval true Error
884 */
885 bool reset_group_relay_log_pos(const char **errmsg);
886 /*
887 Update the error number, message and timestamp fields. This function is
888 different from va_report() as va_report() also logs the error message in the
889 log apart from updating the error fields.
890 */
891 void fill_coord_err_buf(loglevel level, int err_code,
892 const char *buff_coord) const;
893
894 /**
895 Flag that the group_master_log_pos is invalid. This may occur
896 (for example) after CHANGE REPLICATION SOURCE TO RELAY_LOG_POS. This will
897 be unset after the first event has been executed and the
898 group_master_log_pos is valid again.
899
900 Check also m_is_applier_position_info_invalid
901 */
903
904 /*
905 Handling of the relay_log_space_limit optional constraint.
906 */
907 std::atomic<ulonglong> log_space_limit, log_space_total;
908
909 // This flag is used by a coordinator to check if the receiver waits for
910 // a relay log space. If yes, it will enable aggressive relay log
911 // purge.
913
914 // This is file to which coordinator moved after enforced purge
915 // It is used by the receiver to check if all possible files were purged
916 // before making a decision on whether transaction may fit into the
917 // relay_log_space_limit. It is used to avoid possibly infinite waiting in
918 // case a transaction and required relay log metadata is bigger than
919 // 'relay_log_space_limit'. This filename is protected with the
920 // log_space_lock
922
924
925 /**
926 Reset the delay.
927 This is used by RESET REPLICA to clear the delay.
928 */
930
931 /*
932 Needed for problems when slave stops and we want to restart it
933 skipping one or more events in the master log that have caused
934 errors, and have been manually applied by DBA already.
935 */
936 std::atomic<uint32> slave_skip_counter;
937 std::atomic<ulong>
938 abort_pos_wait; /* Incremented on change replication source */
941
942 /*
943 Condition and its parameters from START REPLICA UNTIL clause.
944
945 UNTIL condition is tested with is_until_satisfied() method that is
946 called by exec_relay_log_event(). is_until_satisfied() caches the result
947 of the comparison of log names because log names don't change very often;
948 this cache is invalidated by parts of code which change log names with
949 notify_*_log_name_updated() methods. (They need to be called only if SQL
950 thread is running).
951 */
952 enum {
962
964
965 /*
966 trans_retries varies between 0 to replica_transaction_retries and counts how
967 many times the slave has retried the present transaction; gets reset to 0
968 when the transaction finally succeeds. retried_trans is a cumulative
969 counter: how many times the slave has retried a transaction (any) since
970 slave started.
971 */
973
974 /*
975 If the end of the hot relay log is made of master's events ignored by the
976 slave I/O thread, these two keep track of the coords (in the master's
977 binlog) of the last of these events seen by the slave I/O thread. If not,
978 ign_master_log_name_end[0] == 0.
979 As they are like a Rotate event read/written from/to the relay log, they
980 are both protected by rli->relay_log.LOCK_binlog_end_pos.
981 */
984
985 /*
986 Identifies where the SQL Thread should create temporary files for the
987 LOAD DATA INFILE. This is used for security reasons.
988 */
991
992 /**
993 Identifies the last time a checkpoint routine has been executed.
994 */
995 struct timespec last_clock;
996
997 /**
998 Invalidates cached until_log_name and event_relay_log_name comparison
999 result. Should be called after switch to next relay log if
1000 there chances that sql_thread is running.
1001 */
1004 down_cast<Until_position *>(until_option)->notify_log_name_change();
1005 }
1006
1007 /**
1008 Receiver thread notifies that it truncated some data from relay log.
1009 data_lock will be acquired, so the caller should not hold data_lock.
1010 */
1012 /**
1013 Applier clears the flag after it handled the situation. The caller must
1014 hold data_lock.
1015 */
1017
1018 /**
1019 The same as @c notify_group_relay_log_name_update but for
1020 @c group_master_log_name.
1021 */
1024 down_cast<Until_position *>(until_option)->notify_log_name_change();
1025 }
1026
1029 }
1030
1031 /**
1032 Last executed event group coordinates are updated and optionally
1033 forcibly flushed to a repository.
1034 @param log_pos a value of the executed position to update to
1035 @param need_data_lock whether data_lock should be acquired
1036 @param force the value is passed to eventual flush_info()
1037 */
1038 int inc_group_relay_log_pos(ulonglong log_pos, bool need_data_lock,
1039 bool force = false);
1040
1041 int wait_for_pos(THD *thd, String *log_name, longlong log_pos,
1042 double timeout);
1043 /**
1044 Wait for a GTID set to be executed.
1045
1046 @param thd The thread for status changes and kill status
1047 @param gtid A char array with a GTID set
1048 @param timeout Number of seconds to wait before timing out
1049 @param update_THD_status Shall the method update the THD stage
1050
1051 @retval 0 The set is already executed
1052 @retval -1 There was a timeout waiting for the set
1053 @retval -2 There was an issue while waiting.
1054 */
1055 int wait_for_gtid_set(THD *thd, const char *gtid, double timeout,
1056 bool update_THD_status = true);
1057 /**
1058 Wait for a GTID set to be executed.
1059
1060 @param thd The thread for status changes and kill status
1061 @param gtid A String with a GTID set
1062 @param timeout Number of seconds to wait before timing out
1063 @param update_THD_status Shall the method update the THD stage
1064
1065 @retval 0 The set is already executed
1066 @retval -1 There was a timeout waiting for the set
1067 @retval -2 There was an issue while waiting.
1068 */
1069 int wait_for_gtid_set(THD *thd, String *gtid, double timeout,
1070 bool update_THD_status = true);
1071 /**
1072 Wait for a GTID set to be executed.
1073
1074 @param thd The thread for status changes and kill status
1075 @param wait_gtid_set A GTID_set object
1076 @param timeout Number of seconds to wait before timing out
1077 @param update_THD_status Shall the method update the THD stage
1078
1079 @retval 0 The set is already executed
1080 @retval -1 There was a timeout waiting for the set
1081 @retval -2 There was an issue while waiting.
1082 */
1083 int wait_for_gtid_set(THD *thd, const Gtid_set *wait_gtid_set, double timeout,
1084 bool update_THD_status = true);
1085
1087
1088 RPL_Table_ref *tables_to_lock; /* RBR: Tables to lock */
1089 uint tables_to_lock_count; /* RBR: Count of tables to lock */
1090 table_mapping m_table_map; /* RBR: Mapping table-id to table */
1091 /* RBR: Record Rows_query log event */
1093
1094 bool get_table_data(TABLE *table_arg, table_def **tabledef_var,
1095 TABLE **conv_table_var) const {
1096 assert(tabledef_var && conv_table_var);
1097 for (Table_ref *ptr = tables_to_lock; ptr != nullptr;
1098 ptr = ptr->next_global)
1099 if (ptr->table == table_arg) {
1100 *tabledef_var = &static_cast<RPL_Table_ref *>(ptr)->m_tabledef;
1101 *conv_table_var = static_cast<RPL_Table_ref *>(ptr)->m_conv_table;
1102 DBUG_PRINT("debug", ("Fetching table data for table %s.%s:"
1103 " tabledef: %p, conv_table: %p",
1104 table_arg->s->db.str, table_arg->s->table_name.str,
1105 *tabledef_var, *conv_table_var));
1106 return true;
1107 }
1108 return false;
1109 }
1110
1111 /**
1112 Last charset (6 bytes) seen by slave SQL thread is cached here; it helps
1113 the thread save 3 @c get_charset() per @c Query_log_event if the charset is
1114 not changing from event to event (common situation). When the 6 bytes are
1115 equal to 0 is used to mean "cache is invalidated".
1116 */
1118 bool cached_charset_compare(char *charset) const;
1119
1120 void cleanup_context(THD *, bool);
1122 void clear_tables_to_lock();
1123 int purge_relay_logs(THD *thd, const char **errmsg, bool delete_only = false);
1124
1125 /*
1126 Used to defer stopping the SQL thread to give it a chance
1127 to finish up the current group of events.
1128 The timestamp is set and reset in @c sql_slave_killed().
1129 */
1131
1132 /* The original master commit timestamp in microseconds since epoch */
1134
1135 /*
1136 A container to hold on Intvar-, Rand-, Uservar- log-events in case
1137 the slave is configured with table filtering rules.
1138 The withhold events are executed when their parent Query destiny is
1139 determined for execution as well.
1140 */
1142
1143 /*
1144 State of the container: true stands for IRU events gathering,
1145 false does for execution, either deferred or direct.
1146 */
1148
1149 /*****************************************************************************
1150 WL#5569 MTS
1151
1152 legends:
1153 C - Coordinator;
1154 W - Worker;
1155 WQ - Worker Queue containing event assignments
1156 */
1157 // number's is determined by global replica_parallel_workers
1159
1160 /*
1161 For the purpose of reporting the worker status in performance schema table,
1162 we need to preserve the workers array after worker thread was killed. So, we
1163 copy this array into the below vector which is used for reporting
1164 until next init_workers(). Note that we only copy those attributes that
1165 would be useful in reporting worker status. We only use a few attributes in
1166 this object as of now but still save the whole object. The idea is
1167 to be future proof. We will extend performance schema tables in future
1168 and then we would use a good number of attributes from this object.
1169 */
1170
1171 std::vector<Slave_worker *> workers_copy_pfs;
1172
1173 /*
1174 This flag is turned ON when the workers array is initialized.
1175 Before destroying the workers array we check this flag to make sure
1176 we are not destroying an uninitialized array. For the purpose of reporting
1177 the worker status in performance schema table, we need to preserve the
1178 workers array after worker thread was killed. So, we copy this array into
1179 workers_copy_pfs array which is used for reporting until next
1180 init_workers().
1181 */
1183
1184 std::atomic<ulong> pending_jobs;
1187 mysql_mutex_t exit_count_lock; // mutex of worker exit count
1189 ulonglong mts_pending_jobs_size; // actual mem usage by WQ:s
1190 ulonglong mts_pending_jobs_size_max; // max of WQ:s size forcing C to wait
1191 bool mts_wq_oversize; // C raises flag to wait some memory's released
1193 *last_assigned_worker; // is set to a Worker at assigning a group
1194 /*
1195 master-binlog ordered queue of Slave_job_group descriptors of groups
1196 that are under processing. The queue size is @c checkpoint_group.
1197 */
1199 /*
1200 Container for references of involved partitions for the current event group
1201 */
1202 // deferred array to hold partition-info-free events
1204
1205 bool curr_group_seen_gtid; // current group started with Gtid-event or not
1206 bool curr_group_seen_begin; // current group started with B-event or not
1207 bool curr_group_isolated; // current group requires execution in isolation
1208 volatile ulong
1209 mts_wq_underrun_w_id; // Id of a Worker whose queue is getting empty
1210 /*
1211 Ongoing excessive overrun counter to correspond to number of events that
1212 are being scheduled while a WQ is close to be filled up.
1213 `Close' is defined as (100 - mts_worker_underrun_level) %.
1214 The counter is incremented each time a WQ get filled over that level
1215 and decremented when the level drops below.
1216 The counter therefore describes level of saturation that Workers
1217 are experiencing and is used as a parameter to compute a nap time for
1218 Coordinator in order to avoid reaching WQ limits.
1219 */
1220 std::atomic<long> mts_wq_excess_cnt;
1221 ulonglong mts_groups_assigned; // number of groups (transactions) scheduled
1222 long mts_worker_underrun_level; // % of WQ size at which W is considered
1223 // hungry
1224 ulong mts_coordinator_basic_nap; // C sleeps to avoid WQs overrun
1225 ulong
1226 opt_replica_parallel_workers; // cache for ::opt_replica_parallel_workers
1227 ulong
1228 replica_parallel_workers; // the one slave session time number of workers
1229 ulong
1230 exit_counter; // Number of workers contributed to max updated group index
1232 ulong recovery_parallel_workers; // number of workers while recovering
1233 uint rli_checkpoint_seqno; // counter of groups executed after the most
1234 // recent CP
1235 uint checkpoint_group; // cache for ::opt_mta_checkpoint_group
1236 MY_BITMAP recovery_groups; // bitmap used during recovery
1238 ulong mts_recovery_group_cnt; // number of groups to execute at recovery
1239 ulong mts_recovery_index; // running index of recoverable groups
1241
1242 /*
1243 While distributing events based on their properties MTS
1244 Coordinator changes its mts group status.
1245 Transition normally flowws to follow `=>' arrows on the diagram:
1246
1247 +----------------------------+
1248 V |
1249 MTS_NOT_IN_GROUP => |
1250 {MTS_IN_GROUP => MTS_END_GROUP --+} while (!killed) => MTS_KILLED_GROUP
1251
1252 MTS_END_GROUP has `->' loop breaking link to MTS_NOT_IN_GROUP when
1253 Coordinator synchronizes with Workers by demanding them to
1254 complete their assignments.
1255 */
1256 enum {
1257 /*
1258 no new events were scheduled after last synchronization,
1259 includes Single-Threaded-Slave case.
1260 */
1262
1263 MTS_IN_GROUP, /* at least one not-terminal event scheduled to a Worker */
1264 MTS_END_GROUP, /* the last scheduled event is a terminal event */
1265 MTS_KILLED_GROUP /* Coordinator gave up to reach MTS_END_GROUP */
1267
1268 private:
1269 /// @brief The applier metrics aggregator
1271 /// @brief Empty metric aggregator when metric collection is not active
1273
1274 public:
1275 /// @brief Returns the replication applier metrics aggregator
1276 /// @return the MTA metrics aggregator
1278
1279 /// Number of times queue memory is exceeded
1281
1282 /// Last moment in time the MTA printed a coordinator waited stats
1284
1285 /**
1286 Storage for holding newly computed values for the last executed
1287 event group coordinates while the current group of events is
1288 being committed, see @c pre_commit, post_commit.
1289 */
1294
1295 /* Returns the number of elements in workers array/vector. */
1296 inline size_t get_worker_count() {
1298 return workers.size();
1299 else
1300 return workers_copy_pfs.size();
1301 }
1302
1303 /*
1304 Returns a pointer to the worker instance at index n in workers
1305 array/vector.
1306 */
1309 if (n >= workers.size()) return nullptr;
1310
1311 return workers[n];
1312 } else if (workers_copy_pfs.size()) {
1313 if (n >= workers_copy_pfs.size()) return nullptr;
1314
1315 return workers_copy_pfs[n];
1316 } else
1317 return nullptr;
1318 }
1319
1320 /**
1321 The method implements updating a slave info table. It's
1322 specialized differently for STS and MTS.
1323 */
1324 virtual bool commit_positions();
1325
1326 /*Channel defined mts submode*/
1328 /* MTS submode */
1330
1331 /* most of allocation in the coordinator rli is there */
1332 void init_workers(ulong);
1333
1334 /* counterpart of the init */
1335 void deinit_workers();
1336
1337 /**
1338 returns true if there is any gap-group of events to execute
1339 at slave starting phase.
1340 */
1341 inline bool is_mts_recovery() const { return mts_recovery_group_cnt != 0; }
1342
1347 recovery_groups_inited = false;
1348 }
1349 }
1350
1351 /**
1352 returns true if events are to be executed in parallel
1353 */
1354 inline bool is_parallel_exec() const {
1355 bool ret = (replica_parallel_workers > 0) && !is_mts_recovery();
1356
1357 assert(!ret || !workers.empty());
1358
1359 return ret;
1360 }
1361
1362 /**
1363 returns true if Coordinator is scheduling events belonging to
1364 the same group and has not reached yet its terminal event.
1365 */
1366 inline bool is_mts_in_group() {
1368 }
1369
1370 /**
1371 Check if it is time to compute MTS checkpoint.
1372
1373 @retval true It is time to compute MTS checkpoint.
1374 @retval false It is not MTS or it is not time for computing checkpoint.
1375 */
1377 /**
1378 While a group is executed by a Worker the relay log can change.
1379 Coordinator notifies Workers about this event. Worker is supposed
1380 to commit to the recovery table with the new info.
1381 */
1383
1384 /**
1385 While a group is executed by a Worker the relay log can change.
1386 Coordinator notifies Workers about this event. Coordinator and Workers
1387 maintain a bitmap of executed group that is reset with a new checkpoint.
1388 */
1389 void reset_notified_checkpoint(ulong count, time_t new_ts,
1390 bool update_timestamp = false);
1391
1392 /**
1393 Called when gaps execution is ended so it is crash-safe
1394 to reset the last session Workers info.
1395 */
1396 bool mts_finalize_recovery();
1397 /*
1398 * End of MTS section ******************************************************/
1399
1400 /* The general cleanup that slave applier may need at the end of query. */
1401 inline void cleanup_after_query() {
1403 }
1404 /* The general cleanup that slave applier may need at the end of session. */
1406 if (deferred_events) delete deferred_events;
1407 }
1408
1409 /**
1410 Helper function to do after statement completion.
1411
1412 This function is called from an event to complete the group by
1413 either stepping the group position, if the "statement" is not
1414 inside a transaction; or increase the event position, if the
1415 "statement" is inside a transaction.
1416
1417 @param event_log_pos
1418 Master log position of the event. The position is recorded in the
1419 relay log info and used to produce information for <code>SHOW
1420 SLAVE STATUS</code>.
1421 */
1422 int stmt_done(my_off_t event_log_pos);
1423
1424 /**
1425 Set the value of a replication state flag.
1426
1427 @param flag Flag to set
1428 */
1430
1431 /**
1432 Get the value of a replication state flag.
1433
1434 @param flag Flag to get value of
1435
1436 @return @c true if the flag was set, @c false otherwise.
1437 */
1438 bool get_flag(enum_state_flag flag) { return m_flags & (1UL << flag); }
1439
1440 /**
1441 Clear the value of a replication state flag.
1442
1443 @param flag Flag to clear
1444 */
1446
1447 private:
1448 /**
1449 Auxiliary function used by is_in_group.
1450
1451 The execute thread is in the middle of a statement in the
1452 following cases:
1453 - User_var/Intvar/Rand events have been processed, but the
1454 corresponding Query_log_event has not been processed.
1455 - Table_map or Row events have been processed, and the last Row
1456 event did not have the STMT_END_F set.
1457
1458 @retval true Replication thread is inside a statement.
1459 @retval false Replication thread is not inside a statement.
1460 */
1461 bool is_in_stmt() const {
1462 bool ret = (m_flags & (1UL << IN_STMT));
1463 DBUG_PRINT("info", ("is_in_stmt()=%d", ret));
1464 return ret;
1465 }
1466 /**
1467 Auxiliary function used by is_in_group.
1468
1469 @retval true The execute thread is inside a statement or a
1470 transaction, i.e., either a BEGIN has been executed or we are in
1471 the middle of a statement.
1472 @retval false The execute thread thread is not inside a statement
1473 or a transaction.
1474 */
1475 bool is_in_trx_or_stmt() const {
1476 bool ret = is_in_stmt() || (info_thd->variables.option_bits & OPTION_BEGIN);
1477 DBUG_PRINT("info", ("is_in_trx_or_stmt()=%d", ret));
1478 return ret;
1479 }
1480
1481 public:
1482 /**
1483 A group is defined as the entire range of events that constitute
1484 a transaction or auto-committed statement. It has one of the
1485 following forms:
1486
1487 (Gtid)? Query(BEGIN) ... (Query(COMMIT) | Query(ROLLBACK) | Xid)
1488 (Gtid)? (Rand | User_var | Int_var)* Query(DDL)
1489
1490 Thus, to check if the execute thread is in a group, there are
1491 two cases:
1492
1493 - If the master generates Gtid events (5.7.5 or later, or 5.6 or
1494 later with GTID_MODE=ON), then is_in_group is the same as
1495 info_thd->owned_gtid.sidno != 0, since owned_gtid.sidno is set
1496 to non-zero by the Gtid_log_event and cleared to zero at commit
1497 or rollback.
1498
1499 - If the master does not generate Gtid events (i.e., master is
1500 pre-5.6, or pre-5.7.5 with GTID_MODE=OFF), then is_in_group is
1501 the same as is_in_trx_or_stmt().
1502
1503 @retval true Replication thread is inside a group.
1504 @retval false Replication thread is not inside a group.
1505 */
1506 bool is_in_group() const {
1507 bool ret = is_in_trx_or_stmt() || info_thd->owned_gtid.sidno != 0;
1508 DBUG_PRINT("info", ("is_in_group()=%d", ret));
1509 return ret;
1510 }
1511
1513
1514 /**
1515 Initialize the relay log info. This function does a set of operations
1516 on the rli object like initializing variables, loading information from
1517 repository, setting up name for relay log files and index, MTS recovery
1518 (if necessary), calculating the received GTID set for the channel and
1519 storing the updated rli object configuration into the repository.
1520
1521 When this function is called in a change replication source process and the
1522 change procedure will purge all the relay log files later, there is no
1523 reason to try to calculate the received GTID set of the channel based on
1524 existing relay log files (they will be purged). Allowing reads to existing
1525 relay log files at this point may lead to put the server in a state where
1526 it will be no possible to configure it if it was reset when encryption of
1527 replication log files was ON and the keyring plugin is not available
1528 anymore.
1529
1530 @param skip_received_gtid_set_and_relaylog_recovery When true, skips the
1531 received GTID set and relay log recovery.
1532
1533 @retval 0 Success.
1534 @retval 1 Error.
1535 */
1536 int rli_init_info(bool skip_received_gtid_set_and_relaylog_recovery = false);
1537 void end_info();
1538
1539 /** No flush options given to relay log flush */
1540 static constexpr int RLI_FLUSH_NO_OPTION{0};
1541 /** Ignore server sync options and flush */
1542 static constexpr int RLI_FLUSH_IGNORE_SYNC_OPT{1 << 0};
1543 /** Flush disresgarding the value of GTID_ONLY */
1544 static constexpr int RLI_FLUSH_IGNORE_GTID_ONLY{1 << 1};
1545
1546 int flush_info(const int flush_flags);
1547 /**
1548 Clears from `this` Relay_log_info object all attribute values that are
1549 not to be kept.
1550
1551 @returns true if there were a problem with clearing the data and false
1552 otherwise.
1553 */
1554 bool clear_info();
1555 /**
1556 Checks if the underlying `Rpl_info` handler holds information for the fields
1557 to be kept between slave resets, while the other fields were cleared.
1558
1559 @param previous_result the result return from invoking the `check_info`
1560 method on `this` object.
1561
1562 @returns function success state represented by the `enum_return_check`
1563 enumeration.
1564 */
1566 const enum_return_check &previous_result) const;
1567 int flush_current_log();
1568 void set_master_info(Master_info *info);
1569
1572 }
1575 }
1576
1577 inline const char *get_group_master_log_name() const {
1578 return group_master_log_name;
1579 }
1580 inline const char *get_group_master_log_name_info() const {
1581 if (m_is_applier_source_position_info_invalid) return "INVALID";
1583 }
1585 return group_master_log_pos;
1586 }
1589 return get_group_master_log_pos();
1590 }
1591 inline void set_group_master_log_name(const char *log_file_name) {
1593 sizeof(group_master_log_name) - 1);
1594 }
1596 group_master_log_pos = log_pos;
1597 // Whenever the position is set, it means it is no longer invalid
1599 }
1600
1601 inline const char *get_group_relay_log_name() { return group_relay_log_name; }
1603 inline void set_group_relay_log_name(const char *log_file_name) {
1605 sizeof(group_relay_log_name) - 1);
1606 }
1607 inline void set_group_relay_log_name(const char *log_file_name, size_t len) {
1609 }
1610 inline void set_group_relay_log_pos(ulonglong log_pos) {
1611 group_relay_log_pos = log_pos;
1612 }
1613
1614 inline const char *get_event_relay_log_name() { return event_relay_log_name; }
1616 inline void set_event_relay_log_name(const char *log_file_name) {
1618 sizeof(event_relay_log_name) - 1);
1620 }
1621
1624
1625 inline void set_event_relay_log_pos(ulonglong log_pos) {
1626 event_relay_log_pos = log_pos;
1627 }
1628 inline const char *get_rpl_log_name() const {
1630 ? "INVALID"
1632 }
1633
1634 static size_t get_number_info_rli_fields();
1635
1636 /**
1637 Sets bits for columns that are allowed to be `NULL`.
1638
1639 @param nullable_fields the bitmap to hold the nullable fields.
1640 */
1641 static void set_nullable_fields(MY_BITMAP *nullable_fields);
1642
1643 /**
1644 Indicate that a delay starts.
1645
1646 This does not actually sleep; it only sets the state of this
1647 Relay_log_info object to delaying so that the correct state can be
1648 reported by SHOW REPLICA STATUS and SHOW PROCESSLIST.
1649
1650 Requires rli->data_lock.
1651
1652 @param delay_end The time when the delay shall end.
1653 */
1654 void start_sql_delay(time_t delay_end);
1655
1656 /* Note that this is cast to uint32 in show_slave_status(). */
1657 time_t get_sql_delay() { return sql_delay; }
1658 void set_sql_delay(time_t _sql_delay) { sql_delay = _sql_delay; }
1660
1661 Relay_log_info(bool is_slave_recovery,
1662#ifdef HAVE_PSI_INTERFACE
1663 PSI_mutex_key *param_key_info_run_lock,
1664 PSI_mutex_key *param_key_info_data_lock,
1665 PSI_mutex_key *param_key_info_sleep_lock,
1666 PSI_mutex_key *param_key_info_thd_lock,
1667 PSI_mutex_key *param_key_info_data_cond,
1668 PSI_mutex_key *param_key_info_start_cond,
1669 PSI_mutex_key *param_key_info_stop_cond,
1670 PSI_mutex_key *param_key_info_sleep_cond,
1671#endif
1672 uint param_id, const char *param_channel, bool is_rli_fake);
1673 ~Relay_log_info() override;
1674
1675 /*
1676 Determines if a warning message on unsafe execution was
1677 already printed out to avoid clutering the error log
1678 with several warning messages.
1679 */
1681
1682 /*
1683 'sql_thread_kill_accepted is set to true when killed status is recognized.
1684 */
1686
1688
1690 if (row_stmt_start_timestamp == 0) row_stmt_start_timestamp = time(nullptr);
1691
1693 }
1694
1696
1698
1701 }
1702
1704
1705 public:
1706 /**
1707 Delete the existing event and set a new one. This class is
1708 responsible for freeing the event, the caller should not do that.
1709
1710 @return 1 if an error was encountered, 0 otherwise.
1711 */
1713
1714 /**
1715 Return the current Format_description_log_event.
1716 */
1718 return rli_description_event;
1719 }
1720
1721 /**
1722 adaptation for the slave applier to specific master versions.
1723 */
1725 ulong adapt_to_master_version_updown(ulong master_version,
1726 ulong current_version);
1727 uchar slave_version_split[3]; // bytes of the slave server version
1728 /*
1729 relay log info repository should be updated on relay log
1730 rotate. But when the transaction is split across two relay logs,
1731 update the repository will cause unexpected results and should
1732 be postponed till the 'commit' of the transaction is executed.
1733
1734 A flag that set to 'true' when this type of 'forced flush'(at the
1735 time of rotate relay log) is postponed due to transaction split
1736 across the relay logs.
1737 */
1739
1741
1743 commit_order_mngr = mngr;
1744 }
1745
1746 /*
1747 Following set function is required to initialize the 'until_option' during
1748 MTS relay log recovery process.
1749
1750 Ideally initialization of 'until_option' is done through
1751 rli::init_until_option. This init_until_option requires the main server
1752 thread object and it makes use of the thd->lex->mi object to initialize the
1753 'until_option'.
1754
1755 But MTS relay log recovery process happens before the main server comes
1756 up at this time the THD object will not be available. Hence the following
1757 set function does the initialization of 'until_option'.
1758 */
1761 until_option = option;
1763 }
1764
1767 if (until_option) {
1768 delete until_option;
1769 until_option = nullptr;
1770 }
1772 }
1773
1774 bool set_info_search_keys(Rpl_info_handler *to) override;
1775
1776 /**
1777 Get coordinator's RLI. Especially used get the rli from
1778 a slave thread, like this: thd->rli_slave->get_c_rli();
1779 thd could be a SQL thread or a worker thread
1780 */
1781 virtual Relay_log_info *get_c_rli() { return this; }
1782
1783 const char *get_for_channel_str(bool upper_case = false) const override;
1784
1785 /**
1786 Set replication filter for the channel.
1787 */
1788 inline void set_filter(Rpl_filter *channel_filter) {
1789 rpl_filter = channel_filter;
1790 }
1791
1792 protected:
1794
1795 private:
1796 /*
1797 Commit order manager to order commits made by its workers. In context of
1798 Multi Source Replication each worker will be ordered by the corresponding
1799 corrdinator's order manager.
1800 */
1802
1803 /**
1804 Delay slave SQL thread by this amount of seconds.
1805 The delay is applied per transaction and based on the immediate master's
1806 commit time. Exceptionally, if a server in the replication chain does not
1807 support the commit timestamps in Gtid_log_event, the delay is applied per
1808 event and is based on the event timestamp.
1809 This is set with CHANGE REPLICATION SOURCE TO SOURCE_DELAY=X.
1810
1811 Guarded by data_lock. Initialized by the client thread executing
1812 START REPLICA. Written by client threads executing CHANGE REPLICATION
1813 SOURCE TO SOURCE_DELAY=X. Read by SQL thread and by client threads
1814 executing SHOW REPLICA STATUS. Note: must not be written while the
1815 slave SQL thread is running, since the SQL thread reads it without
1816 a lock when executing flush_info().
1817 */
1819
1820 /**
1821 During a delay, specifies the point in time when the delay ends.
1822
1823 This is used for the SQL_Remaining_Delay column in SHOW REPLICA STATUS.
1824
1825 Guarded by data_lock. Written by the sql thread. Read by client
1826 threads executing SHOW REPLICA STATUS.
1827 */
1829
1831
1832 /*
1833 Historically, the number of entires in applier metadata was the number
1834 of lines in applier metadata file. Since WL#13959, applier metadata can
1835 be stored only in table, but the notion of number of line is still
1836 preserved.
1837 Before the SOURCE_DELAY parameter was added (WL#344), applier metadata
1838 had 4 lines. Now it has 5 lines.
1839 */
1841
1842 /*
1843 Before the WL#5599, applier metadata had 5 lines. Now it has 6 lines.
1844 */
1846
1847 /*
1848 Before the Id was added (BUG#2334346), applier metadata
1849 had 6 lines. Now it has 7 lines.
1850 */
1852
1853 /*
1854 Add a channel in the applier metadata
1855 */
1857
1858 /*
1859 Represents entry id in applier metadata to save
1860 PRIVILEGE_CHECKS_USERNAME. It is username part of PRIVILEGES_CHECKS_USER
1861 column in performance_schema.replication_applier_configuration.
1862 */
1864
1865 /*
1866 Maximum length of PRIVILEGE_CHECKS_USERNAME.
1867 */
1868 static const int PRIV_CHECKS_USERNAME_LENGTH = 32;
1869
1870 /*
1871 Represents entry id in applier metadata to save
1872 PRIVILEGE_CHECKS_HOSTNAME. It is hostname part of PRIVILEGES_CHECKS_USER
1873 column in performance_schema.replication_applier_configuration.
1874 */
1876
1877 /*
1878 Maximum length of PRIVILEGE_CHECKS_USERNAME.
1879 */
1880 static const int PRIV_CHECKS_HOSTNAME_LENGTH = 255;
1881
1882 /*
1883 Represents entry id in applier metadata to save REQUIRE_ROW_FORMAT
1884 */
1886
1887 /*
1888 Represents entry id in applier metadata to save
1889 REQUIRE_TABLE_PRIMARY_KEY_CHECK
1890 */
1892 12;
1893
1894 /*
1895 Represent entry id in applier metadata to save
1896 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_TYPE.
1897 */
1898 static const int
1900 13;
1901
1902 /*
1903 Represent entry id in applier metadata to save
1904 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_VALUE.
1905 */
1906 static const int
1908 14;
1909 /*
1910 Total lines in applier metadata.
1911 This has to be updated every time a member is added or removed.
1912 Historically, the number of entires in applier metadata was the number
1913 of lines in applier metadata file. Since WL#13959, applier metadata can
1914 be stored only in table, but the notion of number of line is still
1915 preserved.
1916 */
1919
1920 bool read_info(Rpl_info_handler *from) override;
1921 bool write_info(Rpl_info_handler *to) override;
1922
1925
1926 /*
1927 Runtime state for printing a note when slave is taking
1928 too long while processing a row event.
1929 */
1932
1933 /**
1934 sets the suffix required for relay log names in multisource
1935 replication. When --relay-log option is not provided, the
1936 names of the relay log files are relaylog.0000x or
1937 relaylog-CHANNEL.00000x in the case of MSR. However, if
1938 that option is provided, then the names of the relay log
1939 files are <relay-log-option>.0000x or
1940 <relay-log-option>-CHANNEL.00000x in the case of MSR.
1941
1942 The function adds a channel suffix (according to the channel to
1943 file name conventions and conversions) to the relay log file.
1944
1945 @todo: truncate the log file if length exceeds.
1946
1947 @param[in, out] buff buffer to store the complete relay log file name
1948 @param[in] buff_size size of buffer buff
1949 @param[in] base_name the base name of the relay log file
1950 */
1951 const char *add_channel_to_relay_log_name(char *buff, uint buff_size,
1952 const char *base_name);
1953
1954 /*
1955 Applier thread InnoDB priority.
1956 When two transactions conflict inside InnoDB, the one with
1957 greater priority wins.
1958 Priority must be set before applier thread start so that all
1959 executed transactions have the same priority.
1960 */
1962
1963 /**
1964 If the SQL thread should or not ignore the set limit for
1965 write set collection
1966 */
1968
1969 /**
1970 Even if a component says all transactions require write sets,
1971 this variable says the SQL thread transactions can drop them
1972 */
1974
1975 /* The object stores and handles START REPLICA UNTIL option */
1977
1978 public:
1979 /*
1980 The boolean is set to true when the binlog (rli_fake) or slave
1981 (rli_slave) applier thread detaches any engine ha_data
1982 it has dealt with at time of XA START processing.
1983 The boolean is reset to false at the end of XA PREPARE,
1984 XA COMMIT ONE PHASE for the binlog applier, and
1985 at internal rollback of the slave applier at the same time with
1986 the engine ha_data re-attachment.
1987 */
1989 /**
1990 Reference to being applied event. The member is set at event reading
1991 and gets reset at the end of the event lifetime.
1992 See more in @c RLI_current_event_raii that provides the main
1993 interface to the member.
1994 */
1996
1997 /**
1998 Raised when slave applies and writes to its binary log statement
1999 which is not atomic DDL and has no XID assigned. Checked at commit
2000 time to decide whether it is safe to update slave info table
2001 within the same transaction as the write to binary log or this
2002 should be deferred. The deferred scenario applies for not XIDed events
2003 in which case such update might be lost on recovery.
2004 */
2006
2008
2010
2011 void set_ignore_write_set_memory_limit(bool ignore_limit) {
2012 m_ignore_write_set_memory_limit = ignore_limit;
2013 }
2014
2017 }
2018
2019 void set_allow_drop_write_set(bool does_not_require_ws) {
2020 m_allow_drop_write_set = does_not_require_ws;
2021 }
2022
2024
2025 const char *get_until_log_name();
2028 return until_option != nullptr &&
2030 }
2032 return until_option != nullptr &&
2034 }
2036 return until_option != nullptr &&
2038 }
2040 return until_option != nullptr &&
2042 }
2043 /**
2044 Initialize until option object when starting slave.
2045
2046 @param[in] thd The thread object of current session.
2047 @param[in] master_param the parameters of START REPLICA.
2048
2049 @return int
2050 @retval 0 Succeeds to initialize until option object.
2051 @retval <> 0 A defined error number is return if any error happens.
2052 */
2053 int init_until_option(THD *thd, const LEX_SOURCE_INFO *master_param);
2054
2055 /**
2056 Detaches the engine ha_data from THD. The fact
2057 is memorized in @c m_is_engine_ha_data_detached flag.
2058
2059 @param thd a reference to THD
2060 */
2061
2062 void detach_engine_ha_data(THD *thd);
2063
2064 /**
2065 Reattaches the engine ha_data to THD. The fact
2066 is memorized in @c m_is_engine_ha_data_detached flag.
2067
2068 @param thd a reference to THD
2069 */
2070
2071 void reattach_engine_ha_data(THD *thd);
2072
2073 /**
2074 Checks whether engine ha data is detached from THD
2075 @retval true if the data is detached
2076 @retval false if the data is not detached
2077 */
2079
2080 /**
2081 Execute actions at replicated atomic DLL post rollback time.
2082 This include marking the current atomic DDL query-log-event
2083 as having processed.
2084 This measure is necessary to avoid slave info table update execution
2085 when @c pre_commit() hook is called as part of DDL's eventual
2086 implicit commit.
2087 */
2089 static_cast<Query_log_event *>(current_event)->has_ddl_committed = true;
2090 }
2091
2092 /**
2093 The method implements a pre-commit hook to add up a new statement
2094 typically to a DDL transaction to update the slave info table.
2095 Note, in the non-transactional repository case the slave info
2096 is updated after successful commit of the main transaction.
2097
2098 @return false as success, otherwise true
2099 */
2100 bool pre_commit() {
2101 bool rc = false;
2102
2103 if (is_transactional()) {
2104 static_cast<Query_log_event *>(current_event)->has_ddl_committed = true;
2105 rc = commit_positions();
2106 }
2107 return rc;
2108 }
2109 /**
2110 Cleanup of any side effect that pre_commit() inflicts, including
2111 restore of the last executed group coordinates in case the current group
2112 has been destined to rollback, and signaling to possible waiters
2113 in the positive case.
2114
2115 @param on_rollback when true the method carries out rollback action
2116 */
2117 virtual void post_commit(bool on_rollback);
2118};
2119
2120/**
2121 Negation operator for `enum_priv_checks_status`, to facilitate validation
2122 against `SUCCESS`. To test for error status, use the `!!` idiom.
2123
2124 @param status the status code to check against `SUCCESS`
2125
2126 @return true if the status is `SUCCESS` and false otherwise.
2127 */
2129
2130/**
2131 Negation operator for `enum_require_row_status`, to facilitate validation
2132 against `SUCCESS`. To test for error status, use the `!!` idiom.
2133
2134 @param status the status code to check against `SUCCESS`
2135
2136 @return true if the status is `SUCCESS` and false otherwise.
2137 */
2139
2141
2142/**
2143 @param thd a reference to THD
2144 @return true if thd belongs to a Worker thread and false otherwise.
2145*/
2146inline bool is_mts_worker(const THD *thd) {
2148}
2149
2150/**
2151 Checks whether the supplied event encodes a (2pc-aware) DDL
2152 that has been already committed.
2153
2154 @param ev A reference to Query-log-event
2155 @return true when the event is already committed transactional DDL
2156*/
2157inline bool is_committed_ddl(Log_event *ev) {
2159 /* has been already committed */
2160 static_cast<Query_log_event *>(ev)->has_ddl_committed;
2161}
2162
2163/**
2164 Checks whether the transaction identified by the argument
2165 is executed by a slave applier thread is an atomic DDL
2166 not yet committed (see @c Query_log_event::has_ddl_committed).
2167 THD::is_operating_substatement_implicitly filters out intermediate
2168 commits done by non-atomic DDLs.
2169 The error-tagged atomic statements are regarded as non-atomic
2170 therefore this predicate returns negative in such case.
2171
2172 Note that call to is_atomic_ddl() returns "approximate" outcome in
2173 this case as it misses information about type of tables used by the DDL.
2174
2175 This can be a problem for binlogging slave, as updates to slave info
2176 which happen in the same transaction as write of binary log event
2177 without XID might be lost on recovery. To avoid this problem
2178 RLI::ddl_not_atomic flag is employed which is set to true when
2179 non-atomic DDL without XID is written to the binary log.
2180
2181 "Approximate" outcome is always fine for non-binlogging slave as in
2182 this case commit happens using one-phase routine for which recovery
2183 is always correct.
2184
2185 @param thd a pointer to THD describing the transaction context
2186 @return true when a slave applier thread is set to commit being processed
2187 DDL query-log-event, otherwise returns false.
2188*/
2190 assert(thd);
2191
2192 Relay_log_info *rli = thd->rli_slave;
2193
2194 /* Early return is about an error in the SQL thread initialization */
2195 if (!rli) return false;
2196
2197 return ((thd->system_thread == SYSTEM_THREAD_SLAVE_SQL ||
2199 rli->current_event)
2200 ? (rli->is_transactional() &&
2201 /* has not yet committed */
2202 (rli->current_event->get_type_code() ==
2204 !static_cast<Query_log_event *>(rli->current_event)
2205 ->has_ddl_committed) &&
2206 /* unless slave binlogger identified non-atomic */
2207 !rli->ddl_not_atomic &&
2208 /* slave info is not updated when a part of multi-DROP-TABLE
2209 commits */
2211 (is_atomic_ddl(thd, true) &&
2213 /* error-tagged atomic DDL do not update yet slave info */
2214 static_cast<Query_log_event *>(rli->current_event)
2215 ->error_code == 0)
2216 : false;
2217}
2218
2219/**
2220 RAII class to control the slave applier execution context binding
2221 with a being handled event. The main object of control is Query-log-event
2222 containing DDL statement.
2223 The member RLI::current_event is set to refer to an event once it is
2224 read, e.g by next_event() and is reset to NULL at exiting a
2225 read-exec loop. Once the event is destroyed RLI::current_event must be reset
2226 or guaranteed not be accessed anymore.
2227 In the MTS execution the worker is reliably associated with an event
2228 only with the latter is not deferred. This includes Query-log-event.
2229*/
2232
2233 public:
2235 : m_rli(rli_arg) {
2236 m_rli->current_event = ev;
2237 }
2240};
2241
2242/**
2243 @class MDL_lock_guard
2244
2245 Utility class to allow RAII pattern with `MDL_request` and `MDL_context`
2246 classes.
2247 */
2249 public:
2250 /**
2251 Constructor that initializes the object and the target `THD` object but
2252 doesn't try to acquire any lock.
2253
2254 @param target THD object, source for the `MDL_context` to use.
2255 */
2256 MDL_lock_guard(THD *target);
2257 /**
2258 Constructor that initializes the object and the target `THD` object and tries
2259 to acquire the lock identified by `namespace_arg` with MDL type identified by
2260 `mdl_type_arg`.
2261
2262 If the `blocking` parameter is true, it will instantly try to acquire the
2263 lock and block. If the `blocking` parameter is false, it will first test if
2264 the lock is already acquired and only try to lock if no conflicting lock is
2265 already acquired.
2266
2267 @param target THD object, source for the `MDL_context` to use.
2268 @param namespace_arg MDL key namespace to acquire the lock from.
2269 @param mdl_type_arg MDL acquisition type
2270 @param blocking whether or not the execution should block if the lock is
2271 already acquired.
2272 */
2273 MDL_lock_guard(THD *target, MDL_key::enum_mdl_namespace namespace_arg,
2274 enum_mdl_type mdl_type_arg, bool blocking = false);
2275 /**
2276 Destructor that unlocks all acquired locks.
2277 */
2278 virtual ~MDL_lock_guard();
2279
2280 /**
2281 Uses the target `THD` object MDL context to acquire the lock identified by
2282 `namespace_arg` with MDL type identified by `mdl_type_arg`.
2283
2284 If the `blocking` parameter is true, it will instantly try to acquire the
2285 lock and block. If the `blocking` parameter is false, it will first test if
2286 the lock is already acquired and only try to lock if no conflicting lock is
2287 already acquired.
2288
2289 The lock is determined to have been acquired if the `THD` object MDL context
2290 hasn't already a lock and the lock is acquired. In other words, if the MDL
2291 context already has acquired the lock, the method will return failure.
2292
2293 @param namespace_arg MDL key namespace to acquire the lock from.
2294 @param mdl_type_arg MDL acquisition type
2295 @param blocking whether or not the execution should block if the lock is
2296 already acquired.
2297
2298 @return false if the lock has been acquired by this method invocation and
2299 true if not.
2300 */
2301 bool lock(MDL_key::enum_mdl_namespace namespace_arg,
2302 enum_mdl_type mdl_type_arg, bool blocking = false);
2303 /**
2304 Returns whether or not the lock as been acquired within this object
2305 life-cycle.
2306
2307 @return true if the lock has been acquired within this object life-cycle.
2308 */
2309 bool is_locked();
2310
2311 private:
2312 /** The `THD` object holding the MDL context used for acquiring/releasing. */
2314 /** The MDL request holding the MDL ticket issued upon acquisition */
2316};
2317
2318/**
2319 @class Applier_security_context_guard
2320
2321 Utility class to allow RAII pattern with `Security_context` class.
2322
2323 At initiliazation, if the `THD` main security context isn't already the
2324 appropriate one, it copies the `Relay_log_info::info_thd::security_context`
2325 and replaces it with the one initialized with the `PRIVILEGE_CHECK_USER` user.
2326 At deinitialization, it copies the backed up security context.
2327
2328 It also deals with the case where no privilege checks are required, meaning,
2329 `PRIVILEGE_CHECKS_USER` is `NULL`.
2330
2331 Usage examples:
2332
2333 (1)
2334 @code
2335 Applier_security_context_guard security_context{rli, thd};
2336 if (!security_context.has_access({SUPER_ACL})) {
2337 return ER_NO_ACCESS;
2338 }
2339 @endcode
2340
2341 (4)
2342 @code
2343 Applier_security_context_guard security_context{rli, thd};
2344 if (!security_context.has_access(
2345 {{CREATE_ACL | INSERT_ACL | UPDATE_ACL, table},
2346 {SELECT_ACL, table}})) {
2347 return ER_NO_ACCESS;
2348 }
2349 @endcode
2350 */
2351
2353 public:
2354 /**
2355 If needed, backs up the current `thd` security context and replaces it with
2356 a security context for `PRIVILEGE_CHECKS_USER` user.
2357
2358 @param rli the `Relay_log_info` object that holds the
2359 `PRIVILEGE_CHECKS_USER` info.
2360 @param thd the `THD` for which initialize the security context.
2361 */
2362 Applier_security_context_guard(Relay_log_info const *rli, THD const *thd);
2363 /**
2364 Destructor that restores the backed up security context, if needed.
2365 */
2367
2368 // --> Deleted constructors and methods to remove default move/copy semantics
2370 delete;
2373 const Applier_security_context_guard &) = delete;
2375 delete;
2376 // <--
2377
2378 /**
2379 Returns whether or not privilege checks may be skipped within the current
2380 context.
2381
2382 @return true if privilege checks may be skipped and false otherwise.
2383 */
2384 bool skip_priv_checks() const;
2385 /**
2386 Checks if the `PRIVILEGE_CHECKS_USER` user has access to the privilieges
2387 passed on by `extra_privileges` parameter as well as to the privileges
2388 passed on at initialization time.
2389
2390 This particular method checks those privileges against a given table and
2391 against that table's columns - the ones that are used or changed in the
2392 event.
2393
2394 @param extra_privileges set of privileges to check, additionally to those
2395 passed on at initialization. It's a list of
2396 (privilege, TABLE*, Rows_log_event*) tuples.
2397
2398 @return true if the privileges are included in the security context and
2399 false, otherwise.
2400 */
2401 bool has_access(
2402 std::vector<std::tuple<Access_bitmask, TABLE const *, Rows_log_event *>>
2403 &extra_privileges) const;
2404 /**
2405 Checks if the `PRIVILEGE_CHECKS_USER` user has access to the privilieges
2406 passed on by `extra_privileges` parameter as well as to the privileges
2407 passed on at initialization time.
2408
2409 @param extra_privileges set of privileges to check, additionally to those
2410 passed on at initialization. It's a list of
2411 privileges to be checked against any database.
2412
2413 @return true if the privileges are included in the security context and
2414 false, otherwise.
2415 */
2416 bool has_access(
2417 std::initializer_list<std::string_view> extra_privileges) const;
2418
2419 /**
2420 Checks if the `PRIVILEGE_CHECKS_USER` user has access to the privilieges
2421 passed on by `extra_privileges` parameter as well as to the privileges
2422 passed on at initialization time.
2423
2424 @param extra_privileges set of privileges to check, additionally to those
2425 passed on at initialization. It's a list of
2426 privileges to be checked against any database.
2427
2428 @return true if the privileges are included in the security context and
2429 false, otherwise.
2430 */
2431 bool has_access(std::initializer_list<Access_bitmask> extra_privileges) const;
2432
2433 /**
2434 Returns the username for the user for which the security context was
2435 initialized.
2436
2437 If `PRIVILEGE_CHECKS_USER` was configured for the target `Relay_log_info`
2438 object, that one is returned.
2439
2440 Otherwise, the username associated with the `Security_context` initialized
2441 for `Relay_log_info::info_thd` will be returned.
2442
2443 @return an `std::string` holding the username for the active security
2444 context.
2445 */
2446 std::string get_username() const;
2447 /**
2448 Returns the hostname for the user for which the security context was
2449 initialized.
2450
2451 If `PRIVILEGE_CHECKS_USER` was configured for the target `Relay_log_info`
2452 object, that one is returned.
2453
2454 Otherwise, the hostname associated with the `Security_context` initialized
2455 for `Relay_log_info::info_thd` will be returned.
2456
2457 @return an `std::string` holding the hostname for the active security
2458 context.
2459 */
2460 std::string get_hostname() const;
2461
2462 private:
2463 /**
2464 The `Relay_log_info` object holding the info required to initialize the
2465 context.
2466 */
2468 /**
2469 The `THD` object for which the security context will be initialized.
2470 */
2471 THD const *m_thd;
2472 /** Applier security context based on `PRIVILEGE_CHECK_USER` user */
2474 /** Currently in use security context */
2476 /** Backed up security context */
2478 /** Flag that states if privilege check should be skipped */
2480 /** Flag that states if there is a logged user */
2482
2484 std::vector<std::string> &columns) const;
2485};
2486
2487#endif /* RPL_RLI_H */
Contains the classes representing events occurring in the replication stream.
Utility class to allow RAII pattern with Security_context class.
Definition: rpl_rli.h:2352
Applier_security_context_guard(Applier_security_context_guard &&)=delete
void extract_columns_to_check(TABLE const *table, Rows_log_event *event, std::vector< std::string > &columns) const
Definition: rpl_rli.cc:3527
virtual ~Applier_security_context_guard()
Destructor that restores the backed up security context, if needed.
Definition: rpl_rli.cc:3444
Applier_security_context_guard(Relay_log_info const *rli, THD const *thd)
If needed, backs up the current thd security context and replaces it with a security context for PRIV...
Definition: rpl_rli.cc:3393
bool skip_priv_checks() const
Returns whether or not privilege checks may be skipped within the current context.
Definition: rpl_rli.cc:3452
Security_context m_applier_security_ctx
Applier security context based on PRIVILEGE_CHECK_USER user.
Definition: rpl_rli.h:2473
bool m_privilege_checks_none
Flag that states if privilege check should be skipped.
Definition: rpl_rli.h:2479
Applier_security_context_guard & operator=(const Applier_security_context_guard &)=delete
std::string get_username() const
Returns the username for the user for which the security context was initialized.
Definition: rpl_rli.cc:3515
THD const * m_thd
The THD object for which the security context will be initialized.
Definition: rpl_rli.h:2471
Security_context * m_previous
Backed up security context.
Definition: rpl_rli.h:2477
Security_context * m_current
Currently in use security context.
Definition: rpl_rli.h:2475
bool m_logged_in_acl_user
Flag that states if there is a logged user.
Definition: rpl_rli.h:2481
bool has_access(std::vector< std::tuple< Access_bitmask, TABLE const *, Rows_log_event * > > &extra_privileges) const
Checks if the PRIVILEGE_CHECKS_USER user has access to the privilieges passed on by extra_privileges ...
Definition: rpl_rli.cc:3480
std::string get_hostname() const
Returns the hostname for the user for which the security context was initialized.
Definition: rpl_rli.cc:3521
Applier_security_context_guard & operator=(Applier_security_context_guard &&)=delete
Relay_log_info const * m_target
The Relay_log_info object holding the info required to initialize the context.
Definition: rpl_rli.h:2467
Applier_security_context_guard(const Applier_security_context_guard &)=delete
This class is used to store the type and value for Assign_gtids_to_anonymous_transactions parameter o...
Definition: rpl_rli.h:95
bool set_info(enum_type assign_gtids_to_anonymous_transactions_type, const char *assign_gtids_to_anonymous_transactions_value)
Definition: rpl_rli.cc:3326
rpl_sidno m_sidno
Definition: rpl_rli.h:132
enum_type get_type() const
Definition: rpl_rli.cc:3322
enum_type m_type
This stores the type of Assign_gtids_to_anonymous_transactions info.
Definition: rpl_rli.h:128
Assign_gtids_to_anonymous_transactions_info()
The default constructor initializes parameters to their default value.
Definition: rpl_rli.h:112
std::string m_value
Stores the UUID in case the m_type is not OFF.
Definition: rpl_rli.h:130
enum_type
This accepted value of the type of the Assign_gtids_to_anonymous_transactions info OFF : Anonymous gt...
Definition: rpl_rli.h:108
rpl_sidno get_sidno() const
Definition: rpl_rli.h:116
std::string get_value() const
Definition: rpl_rli.cc:3317
This has the functionality of mysql_rwlock_t, with two differences:
Definition: rpl_gtid.h:325
void assert_some_lock() const
Assert that some thread holds either the read or the write lock.
Definition: rpl_gtid.h:572
On a replica and only on a replica, this class is responsible for committing the applied transactions...
Definition: rpl_replica_commit_order_manager.h:197
Definition: rpl_utility.h:549
void rewind()
Definition: rpl_utility.cc:1323
For binlog version 4.
Definition: log_event.h:1531
This is a subclass if Gtid_event and Log_event.
Definition: log_event.h:3950
rpl_gno get_gno() const override
Return the GNO for this GTID.
Definition: log_event.h:4119
rpl_sidno get_sidno(bool need_lock)
Return the SIDNO relative to the global tsid_map for this GTID.
Definition: log_event.cc:13437
enum_gtid_type get_type() const
Return the gtid type for this Gtid_log_event: this can be either ANONYMOUS_GTID, AUTOMATIC_GTID,...
Definition: log_event.h:4083
Stores information to monitor a transaction during the different replication stages.
Definition: rpl_gtid.h:1413
void clear()
Clear all monitoring information.
Definition: rpl_gtid_misc.cc:496
void finish()
Sets the final information, copy processing info to last_processed and clears processing info.
Definition: rpl_gtid_misc.cc:563
void start(Gtid gtid_arg, ulonglong original_ts_arg, ulonglong immediate_ts_arg, bool skipped_arg=false)
Sets the initial monitoring information.
Definition: rpl_gtid_misc.cc:523
bool is_processing_trx_set()
Returns true if the processing_trx is set, false otherwise.
Definition: rpl_gtid_misc.cc:593
void store_transient_error(uint transient_errno_arg, const char *transient_err_message_arg, ulong trans_retries_arg)
Stores the information about the last transient error in the current transaction, namely: the error n...
Definition: rpl_gtid_misc.cc:611
void clear_processing_trx()
Clear only the processing_trx monitoring info.
Definition: rpl_gtid_misc.cc:503
Represents a set of GTIDs.
Definition: rpl_gtid.h:1557
enum_return_status ensure_sidno(rpl_sidno sidno)
Allocates space for all sidnos up to the given sidno in the array of intervals.
Definition: rpl_gtid_set.cc:145
void _add_gtid(rpl_sidno sidno, rpl_gno gno)
Adds the given GTID to this Gtid_set.
Definition: rpl_gtid.h:1627
Tsid_map * get_tsid_map() const
Return the Tsid_map associated with this Gtid_set.
Definition: rpl_gtid.h:2035
This is the abstract base class for binary log events.
Definition: log_event.h:538
virtual mysql::binlog::event::Log_event_type get_type_code() const
Definition: log_event.h:797
Utility class to allow RAII pattern with MDL_request and MDL_context classes.
Definition: rpl_rli.h:2248
bool lock(MDL_key::enum_mdl_namespace namespace_arg, enum_mdl_type mdl_type_arg, bool blocking=false)
Uses the target THD object MDL context to acquire the lock identified by namespace_arg with MDL type ...
Definition: rpl_rli.cc:3365
bool is_locked()
Returns whether or not the lock as been acquired within this object life-cycle.
Definition: rpl_rli.cc:3391
THD * m_target
The THD object holding the MDL context used for acquiring/releasing.
Definition: rpl_rli.h:2313
MDL_lock_guard(THD *target)
Constructor that initializes the object and the target THD object but doesn't try to acquire any lock...
Definition: rpl_rli.cc:3355
MDL_request m_request
The MDL request holding the MDL ticket issued upon acquisition.
Definition: rpl_rli.h:2315
virtual ~MDL_lock_guard()
Destructor that unlocks all acquired locks.
Definition: rpl_rli.cc:3384
A pending metadata lock request.
Definition: mdl.h:805
Definition: binlog.h:107
Definition: rpl_mi.h:87
Definition: rpl_mta_submode.h:55
bool empty() const
Definition: prealloced_array.h:226
size_t size() const
Definition: prealloced_array.h:227
A Query event is written to the binary log whenever the database is modified on the master,...
Definition: log_event.h:1291
RAII class to control the slave applier execution context binding with a being handled event.
Definition: rpl_rli.h:2230
Relay_log_info * m_rli
Definition: rpl_rli.h:2231
void set_current_event(Log_event *ev)
Definition: rpl_rli.h:2238
~RLI_current_event_raii()
Definition: rpl_rli.h:2239
RLI_current_event_raii(Relay_log_info *rli_arg, Log_event *ev)
Definition: rpl_rli.h:2234
Definition: rpl_rli.h:205
bool curr_group_seen_begin
Definition: rpl_rli.h:1206
uint checkpoint_group
Definition: rpl_rli.h:1235
static constexpr int RLI_FLUSH_IGNORE_SYNC_OPT
Ignore server sync options and flush.
Definition: rpl_rli.h:1542
enum_return_check check_if_info_was_cleared(const enum_return_check &previous_result) const
Checks if the underlying Rpl_info handler holds information for the fields to be kept between slave r...
Definition: rpl_rli.cc:1982
Tsid_map * get_tsid_map()
Definition: rpl_rli.h:842
enum_require_table_primary_key m_require_table_primary_key_check
Identifies what is the slave policy on primary keys in tables.
Definition: rpl_rli.h:828
Prealloced_array< Slave_job_item, 8 > curr_group_da
Definition: rpl_rli.h:1203
enum_priv_checks_status check_applier_acl_user(char const *param_privilege_checks_username, char const *param_privilege_checks_hostname)
Checks the existence of user provided as part of the PRIVILEGE_CHECKS_USER option.
Definition: rpl_rli.cc:3074
Format_description_log_event * get_rli_description_event() const
Return the current Format_description_log_event.
Definition: rpl_rli.h:1717
ulonglong group_source_log_start_pos
Definition: rpl_rli.h:730
static const int APPLIER_METADATA_LINES_WITH_ID
Definition: rpl_rli.h:1851
char cached_charset[6]
Definition: rpl_rli.h:963
std::atomic< int32 > atomic_channel_open_temp_tables
Definition: rpl_rli.h:355
TABLE * save_temporary_tables
Definition: rpl_rli.h:349
std::tuple< ulonglong, ulonglong > get_group_source_log_start_end_pos() const
Get event group positions in source binary log on a replica which is processed by a worker in MTA or ...
Definition: rpl_rli.cc:2928
int stmt_done(my_off_t event_log_pos)
Helper function to do after statement completion.
Definition: rpl_rli.cc:1228
mysql_cond_t log_space_cond
Definition: rpl_rli.h:940
ulonglong get_group_master_log_pos_info() const
Definition: rpl_rli.h:1587
cs::apply::instruments::Applier_metrics_interface & get_applier_metrics()
Returns the replication applier metrics aggregator.
Definition: rpl_rli.cc:3312
bool reset_group_relay_log_pos(const char **errmsg)
Reset group_relay_log_name and group_relay_log_pos to the start of the first relay log file.
Definition: rpl_rli.cc:511
void set_event_start_pos(my_off_t pos)
Definition: rpl_rli.h:1622
bool is_in_group() const
A group is defined as the entire range of events that constitute a transaction or auto-committed stat...
Definition: rpl_rli.h:1506
bool cached_charset_compare(char *charset) const
Definition: rpl_rli.cc:1218
int count_relay_log_space()
Definition: rpl_rli.cc:490
int flush_current_log()
Definition: rpl_rli.cc:1881
ulonglong max_updated_index
Definition: rpl_rli.h:1231
Rows_query_log_event * rows_query_ev
Definition: rpl_rli.h:1092
bool is_long_find_row_note_printed()
Definition: rpl_rli.h:1703
void notify_relay_log_change()
Invalidates cached until_log_name and event_relay_log_name comparison result.
Definition: rpl_rli.h:1002
bool set_info_search_keys(Rpl_info_handler *to) override
To search in the slave repositories, each slave info object (mi, rli or worker) should use a primary ...
Definition: rpl_rli.cc:2318
bool is_in_trx_or_stmt() const
Auxiliary function used by is_in_group.
Definition: rpl_rli.h:1475
std::atomic< ulong > pending_jobs
Definition: rpl_rli.h:1184
void set_filter(Rpl_filter *channel_filter)
Set replication filter for the channel.
Definition: rpl_rli.h:1788
time_t mta_coordinator_has_waited_stat
Last moment in time the MTA printed a coordinator waited stats.
Definition: rpl_rli.h:1283
bool curr_group_seen_gtid
Definition: rpl_rli.h:1205
Gtid_set * gtid_set
Definition: rpl_rli.h:755
const char * get_group_master_log_name() const
Definition: rpl_rli.h:1577
MY_BITMAP recovery_groups
Definition: rpl_rli.h:1236
table_mapping m_table_map
Definition: rpl_rli.h:1090
ulong mts_slave_worker_queue_len_max
Definition: rpl_rli.h:1188
mysql_cond_t logical_clock_cond
Definition: rpl_rli.h:320
bool is_in_stmt() const
Auxiliary function used by is_in_group.
Definition: rpl_rli.h:1461
ulonglong mts_groups_assigned
Definition: rpl_rli.h:1221
bool reinit_sql_thread_io_cache(const char *log, bool need_data_lock)
@ UNTIL_SQL_VIEW_ID
Definition: rpl_rli.h:959
@ UNTIL_MASTER_POS
Definition: rpl_rli.h:954
@ UNTIL_NONE
Definition: rpl_rli.h:953
@ UNTIL_SQL_BEFORE_GTIDS
Definition: rpl_rli.h:956
@ UNTIL_SQL_AFTER_GTIDS
Definition: rpl_rli.h:957
@ UNTIL_SQL_AFTER_MTS_GAPS
Definition: rpl_rli.h:958
@ UNTIL_DONE
Definition: rpl_rli.h:960
@ UNTIL_RELAY_POS
Definition: rpl_rli.h:955
void close_temporary_tables()
Definition: rpl_rli.cc:1000
ulong retried_trans
Definition: rpl_rli.h:972
struct timespec last_clock
Identifies the last time a checkpoint routine has been executed.
Definition: rpl_rli.h:995
void detach_engine_ha_data(THD *thd)
Detaches the engine ha_data from THD.
Definition: rpl_rli.cc:2780
mysql_mutex_t pending_jobs_lock
Definition: rpl_rli.h:1185
void set_event_relay_log_pos(ulonglong log_pos)
Definition: rpl_rli.h:1625
static const int APPLIER_METADATA_LINES_WITH_REQUIRE_ROW_FORMAT
Definition: rpl_rli.h:1885
ulonglong group_relay_log_pos
Definition: rpl_rli.h:702
uchar slave_version_split[3]
Definition: rpl_rli.h:1727
std::atomic< uint32 > slave_skip_counter
Definition: rpl_rli.h:936
ulong mts_coordinator_basic_nap
Definition: rpl_rli.h:1224
bool group_source_log_seen_start_pos
Event group beginning event has been seen.
Definition: rpl_rli.h:726
size_t slave_patternload_file_size
Definition: rpl_rli.h:990
char ign_master_log_name_end[FN_REFLEN]
Definition: rpl_rli.h:982
bool recovery_groups_inited
Definition: rpl_rli.h:1237
cs::apply::instruments::Applier_metrics_stub m_disabled_metric_aggregator
Empty metric aggregator when metric collection is not active.
Definition: rpl_rli.h:1272
ulonglong event_relay_log_pos
Definition: rpl_rli.h:704
void end_info()
Definition: rpl_rli.cc:1861
bool rli_fake
Definition: rpl_rli.h:763
ulong opt_replica_parallel_workers
Definition: rpl_rli.h:1226
void set_allow_drop_write_set(bool does_not_require_ws)
Definition: rpl_rli.h:2019
time_t get_sql_delay()
Definition: rpl_rli.h:1657
void clear_gtid_monitoring_info()
Clears the Gtid_monitoring_info fields.
Definition: rpl_rli.h:437
char group_master_log_name[FN_REFLEN]
Definition: rpl_rli.h:751
void clear_mts_recovery_groups()
Definition: rpl_rli.h:1343
const char * get_for_channel_str(bool upper_case=false) const override
Definition: rpl_rli.cc:2672
ulonglong ign_master_log_pos_end
Definition: rpl_rli.h:983
void cleanup_after_query()
Definition: rpl_rli.h:1401
Commit_order_manager * get_commit_order_manager()
Definition: rpl_rli.h:1740
ulong trans_retries
Definition: rpl_rli.h:972
void init_workers(ulong)
The method to invoke at slave threads start.
Definition: rpl_rli.cc:266
~Relay_log_info() override
Definition: rpl_rli.cc:286
enum Relay_log_info::@166 mts_group_status
uint32 m_flags
Definition: rpl_rli.h:1830
bool relay_log_sanitized
Flag that ensures the relay log is sanitized only once.
Definition: rpl_rli.h:768
void clear_tables_to_lock()
Definition: rpl_rli.cc:1363
const char * get_until_log_name()
Definition: rpl_rli.cc:2689
void post_rollback()
Execute actions at replicated atomic DLL post rollback time.
Definition: rpl_rli.h:2088
static const int APPLIER_METADATA_LINES_WITH_ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_TYPE
Definition: rpl_rli.h:1899
my_off_t event_start_pos
Definition: rpl_rli.h:738
bool m_is_engine_ha_data_detached
Definition: rpl_rli.h:1988
static size_t get_number_info_rli_fields()
Definition: rpl_rli.cc:2056
bool reported_unsafe_warning
Definition: rpl_rli.h:1680
static const int APPLIER_METADATA_LINES_WITH_PRIV_CHECKS_USERNAME
Definition: rpl_rli.h:1863
void set_require_table_primary_key_check(enum_require_table_primary_key require_pk)
Sets the field that tells what is the slave policy concerning primary keys on replicated tables.
Definition: rpl_rli.cc:3297
RPL_Table_ref * tables_to_lock
Definition: rpl_rli.h:1088
uint64 original_commit_timestamp
Definition: rpl_rli.h:1133
mysql_cond_t pending_jobs_cond
Definition: rpl_rli.h:1186
void set_commit_order_manager(Commit_order_manager *mngr)
Definition: rpl_rli.h:1742
std::vector< Slave_worker * > workers_copy_pfs
Definition: rpl_rli.h:1171
void set_thd_tx_priority(int priority)
Definition: rpl_rli.h:2007
void fill_coord_err_buf(loglevel level, int err_code, const char *buff_coord) const
Update the error number, message and timestamp fields.
Definition: rpl_rli.cc:555
enum_return_status add_gtid_set(const Gtid_set *gtid_set)
Adds a GTID set to received GTID set.
Definition: rpl_rli.cc:2679
bool replicate_same_server_id
Definition: rpl_rli.h:328
void add_logged_gtid(rpl_sidno sidno, rpl_gno gno)
Definition: rpl_rli.h:846
bool is_time_for_mta_checkpoint()
Check if it is time to compute MTS checkpoint.
Definition: rpl_rli.cc:2943
void set_flag(enum_state_flag flag)
Set the value of a replication state flag.
Definition: rpl_rli.h:1429
std::string m_privilege_checks_hostname
The host name part of the user passed on to PRIVILEGE_CHECKS_USER.
Definition: rpl_rli.h:800
ulong exit_counter
Definition: rpl_rli.h:1230
void reset_notified_relay_log_change()
While a group is executed by a Worker the relay log can change.
Definition: rpl_rli.cc:346
static void set_nullable_fields(MY_BITMAP *nullable_fields)
Sets bits for columns that are allowed to be NULL.
Definition: rpl_rli.cc:2060
bool m_is_applier_source_position_info_invalid
Are positions invalid.
Definition: rpl_rli.h:837
bool is_until_satisfied_all_transactions_read_from_relay_log()
Definition: rpl_rli.h:2039
void set_master_info(Master_info *info)
Definition: rpl_rli.cc:1890
bool gtid_retrieved_initialized
Definition: rpl_rli.h:765
bool force_flush_postponed_due_to_split_trans
Definition: rpl_rli.h:1738
volatile ulong mts_wq_underrun_w_id
Definition: rpl_rli.h:1209
void clear_processing_trx()
Clears the processing_trx structure fields.
Definition: rpl_rli.h:432
void deinit_workers()
The method to invoke at slave threads stop.
Definition: rpl_rli.cc:284
void clear_privilege_checks_user()
Clears the info related to the data initialized from PRIVILEGE_CHECKS_USER.
Definition: rpl_rli.cc:2980
my_off_t get_event_start_pos()
Definition: rpl_rli.h:1623
bool get_ignore_write_set_memory_limit()
Definition: rpl_rli.h:2015
virtual void post_commit(bool on_rollback)
Cleanup of any side effect that pre_commit() inflicts, including restore of the last executed group c...
Definition: rpl_rli.cc:2852
std::atomic< ulonglong > log_space_limit
Definition: rpl_rli.h:907
void start_sql_delay(time_t delay_end)
Indicate that a delay starts.
Definition: rpl_rli.cc:2068
void cached_charset_invalidate()
Last charset (6 bytes) seen by slave SQL thread is cached here; it helps the thread save 3 get_charse...
Definition: rpl_rli.cc:1211
uint tables_to_lock_count
Definition: rpl_rli.h:1089
int get_thd_tx_priority()
Definition: rpl_rli.h:2009
bool mts_recovery_group_seen_begin
Definition: rpl_rli.h:1240
bool long_find_row_note_printed
Definition: rpl_rli.h:1931
Deferred_log_events * deferred_events
Definition: rpl_rli.h:1141
Rpl_filter * rpl_filter
Definition: rpl_rli.h:257
ulong replica_parallel_workers
Definition: rpl_rli.h:1228
Until_option * until_option
Definition: rpl_rli.h:1976
int flush_info(const int flush_flags)
Stores the file and position where the execute-slave thread are in the relay log:
Definition: rpl_rli.cc:1946
bool is_relay_log_recovery
Definition: rpl_rli.h:340
Relay_log_info(bool is_slave_recovery, PSI_mutex_key *param_key_info_run_lock, PSI_mutex_key *param_key_info_data_lock, PSI_mutex_key *param_key_info_sleep_lock, PSI_mutex_key *param_key_info_thd_lock, PSI_mutex_key *param_key_info_data_cond, PSI_mutex_key *param_key_info_start_cond, PSI_mutex_key *param_key_info_stop_cond, PSI_mutex_key *param_key_info_sleep_cond, uint param_id, const char *param_channel, bool is_rli_fake)
Definition: rpl_rli.cc:113
bool workers_array_initialized
Definition: rpl_rli.h:1182
bool write_info(Rpl_info_handler *to) override
Definition: rpl_rli.cc:2326
time_t sql_delay_end
During a delay, specifies the point in time when the delay ends.
Definition: rpl_rli.h:1828
void set_ignore_write_set_memory_limit(bool ignore_limit)
Definition: rpl_rli.h:2011
bool mts_wq_oversize
Definition: rpl_rli.h:1191
bool m_privilege_checks_user_corrupted
Tells whether or not the internal data regarding PRIVILEGE_CHECKS_USER is corrupted.
Definition: rpl_rli.h:807
ulong worker_queue_mem_exceeded_count
Number of times queue memory is exceeded.
Definition: rpl_rli.h:1280
enum_state_flag
Flags for the state of the replication.
Definition: rpl_rli.h:261
@ IN_STMT
The replication thread is inside a statement.
Definition: rpl_rli.h:263
@ STATE_FLAGS_COUNT
Flag counter.
Definition: rpl_rli.h:266
ulong mts_recovery_group_cnt
Definition: rpl_rli.h:1238
time_t row_stmt_start_timestamp
Definition: rpl_rli.h:1930
static constexpr int RLI_FLUSH_IGNORE_GTID_ONLY
Flush disresgarding the value of GTID_ONLY.
Definition: rpl_rli.h:1544
void set_group_master_log_name(const char *log_file_name)
Definition: rpl_rli.h:1591
void clear_flag(enum_state_flag flag)
Clear the value of a replication state flag.
Definition: rpl_rli.h:1445
enum Relay_log_info::@164 commit_timestamps_status
the status of the commit timestamps for the relay log
bool belongs_to_client()
Definition: rpl_rli.h:302
void set_future_event_relay_log_pos(ulonglong log_pos)
Definition: rpl_rli.h:1573
bool curr_group_isolated
Definition: rpl_rli.h:1207
void set_long_find_row_note_printed()
Definition: rpl_rli.h:1697
void set_privilege_checks_user_corrupted(bool is_corrupted)
Sets the flag that tells whether or not the data regarding the PRIVILEGE_CHECKS_USER is corrupted.
Definition: rpl_rli.cc:2987
char group_relay_log_name[FN_REFLEN]
Event group means a group of events of a transaction.
Definition: rpl_rli.h:701
time_t get_row_stmt_start_timestamp()
Definition: rpl_rli.h:1687
ulonglong get_future_event_relay_log_pos()
Definition: rpl_rli.h:1570
time_t get_sql_delay_end()
Definition: rpl_rli.h:1659
void cleanup_context(THD *, bool)
Definition: rpl_rli.cc:1275
char new_group_master_log_name[FN_REFLEN]
Storage for holding newly computed values for the last executed event group coordinates while the cur...
Definition: rpl_rli.h:1290
Slave_worker * get_worker(size_t n)
Definition: rpl_rli.h:1307
mysql_mutex_t log_space_lock
Definition: rpl_rli.h:939
ulong adapt_to_master_version(Format_description_log_event *fdle)
adaptation for the slave applier to specific master versions.
Definition: rpl_rli.cc:2529
static const int APPLIER_METADATA_LINES_WITH_DELAY
Definition: rpl_rli.h:1840
bool is_engine_ha_data_detached()
Checks whether engine ha data is detached from THD.
Definition: rpl_rli.h:2078
bool is_mts_recovery() const
returns true if there is any gap-group of events to execute at slave starting phase.
Definition: rpl_rli.h:1341
void notify_group_master_log_name_update()
The same as notify_group_relay_log_name_update but for group_master_log_name.
Definition: rpl_rli.h:1022
enum_require_row_status
Definition: rpl_rli.h:247
@ PRIV_CHECKS_USER_NOT_NULL
Value for privilege_checks_user is not empty.
@ SUCCESS
Function ended successfully.
Assign_gtids_to_anonymous_transactions_info m_assign_gtids_to_anonymous_transactions_info
Stores the information related to the ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS parameter of CHANGE REPL...
Definition: rpl_rli.h:293
virtual Relay_log_info * get_c_rli()
Get coordinator's RLI.
Definition: rpl_rli.h:1781
void clear_sql_delay()
Reset the delay.
Definition: rpl_rli.h:929
Log_event * current_event
Reference to being applied event.
Definition: rpl_rli.h:1995
std::atomic< long > mts_wq_excess_cnt
Definition: rpl_rli.h:1220
my_off_t get_until_log_pos()
Definition: rpl_rli.cc:2698
Mts_submode * current_mts_submode
Definition: rpl_rli.h:1329
time_t set_row_stmt_start_timestamp()
Definition: rpl_rli.h:1689
Slave_committed_queue * gaq
Definition: rpl_rli.h:1198
bool is_relay_log_truncated()
Definition: rpl_rli.h:840
bool m_ignore_write_set_memory_limit
If the SQL thread should or not ignore the set limit for write set collection.
Definition: rpl_rli.h:1967
my_off_t new_group_master_log_pos
Definition: rpl_rli.h:1291
static const int APPLIER_METADATA_LINES_WITH_PRIV_CHECKS_HOSTNAME
Definition: rpl_rli.h:1875
bool clear_info()
Clears from this Relay_log_info object all attribute values that are not to be kept.
Definition: rpl_rli.cc:2010
void clear_until_option()
Definition: rpl_rli.h:1765
bool is_privilege_checks_user_null() const
Returns whether or not there is no user configured for PRIVILEGE_CHECKS_USER.
Definition: rpl_rli.cc:2969
void set_sql_delay(time_t _sql_delay)
Definition: rpl_rli.h:1658
Checkable_rwlock * get_tsid_lock()
Definition: rpl_rli.h:844
std::atomic< ulonglong > log_space_total
Definition: rpl_rli.h:907
static const int PRIV_CHECKS_HOSTNAME_LENGTH
Definition: rpl_rli.h:1880
bool is_applier_source_position_info_invalid() const
Returns if the applier positions are marked as being invalid or not.
Definition: rpl_rli.cc:3307
bool is_group_master_log_pos_invalid
Flag that the group_master_log_pos is invalid.
Definition: rpl_rli.h:902
void reset_row_stmt_start_timestamp()
Definition: rpl_rli.h:1695
MYSQL_BIN_LOG relay_log
Definition: rpl_rli.h:334
bool m_require_row_format
Tells if the slave is only accepting events logged with row based logging.
Definition: rpl_rli.h:816
void reset_notified_checkpoint(ulong count, time_t new_ts, bool update_timestamp=false)
While a group is executed by a Worker the relay log can change.
Definition: rpl_rli.cc:373
int rli_init_info(bool skip_received_gtid_set_and_relaylog_recovery=false)
Initialize the relay log info.
Definition: rpl_rli.cc:1492
bool m_allow_drop_write_set
Even if a component says all transactions require write sets, this variable says the SQL thread trans...
Definition: rpl_rli.h:1973
uint rli_checkpoint_seqno
Definition: rpl_rli.h:1233
static const int APPLIER_METADATA_LINES_WITH_WORKERS
Definition: rpl_rli.h:1845
bool is_until_satisfied_at_start_slave()
Definition: rpl_rli.h:2027
std::pair< const char *, const char * > print_applier_security_context_user_host() const
Returns a printable representation of the username and hostname currently being used in the applier s...
Definition: rpl_rli.cc:3100
void set_group_master_log_pos(ulonglong log_pos)
Definition: rpl_rli.h:1595
volatile my_off_t group_master_log_pos
Definition: rpl_rli.h:752
long mts_worker_underrun_level
Definition: rpl_rli.h:1222
bool is_until_satisfied_before_dispatching_event(const Log_event *ev)
Definition: rpl_rli.h:2031
ulonglong get_group_relay_log_pos()
Definition: rpl_rli.h:1602
void set_group_relay_log_name(const char *log_file_name, size_t len)
Definition: rpl_rli.h:1607
int inc_group_relay_log_pos(ulonglong log_pos, bool need_data_lock, bool force=false)
Last executed event group coordinates are updated and optionally forcibly flushed to a repository.
Definition: rpl_rli.cc:928
bool is_group_relay_log_name_invalid(const char **errmsg)
Check if group_relay_log_name is in index file.
Definition: rpl_rli.cc:525
Relay_log_info & operator=(const Relay_log_info &info)
const char * get_rpl_log_name() const
Definition: rpl_rli.h:1628
void set_until_option(Until_option *option)
Definition: rpl_rli.h:1759
void finished_processing()
When the processing of a transaction is completed, that timestamp is recorded, the information is cop...
Definition: rpl_rli.h:419
enum_priv_checks_status set_privilege_checks_user(char const *param_privilege_checks_username, char const *param_privilege_checks_hostname)
Initializes data related to PRIVILEGE_CHECKS_USER, specifically the user name and the user hostname.
Definition: rpl_rli.cc:2993
@ MTS_KILLED_GROUP
Definition: rpl_rli.h:1265
@ MTS_NOT_IN_GROUP
Definition: rpl_rli.h:1261
@ MTS_IN_GROUP
Definition: rpl_rli.h:1263
@ MTS_END_GROUP
Definition: rpl_rli.h:1264
int purge_relay_logs(THD *thd, const char **errmsg, bool delete_only=false)
Purges relay logs.
Definition: rpl_rli.cc:1032
cs::apply::instruments::Applier_metrics m_coordinator_metrics
The applier metrics aggregator.
Definition: rpl_rli.h:1270
bool is_privilege_checks_user_corrupted() const
Returns whether or not the internal data regarding PRIVILEGE_CHECKS_USER is corrupted.
Definition: rpl_rli.cc:2976
int init_until_option(THD *thd, const LEX_SOURCE_INFO *master_param)
Initialize until option object when starting slave.
Definition: rpl_rli.cc:2707
bool is_until_satisfied_after_dispatching_event()
Definition: rpl_rli.h:2035
enum_priv_checks_status initialize_security_context(THD *thd)
Initializes the security context associated with the PRIVILEGE_CHECKS_USER user that is to be used by...
Definition: rpl_rli.cc:3242
void set_group_relay_log_pos(ulonglong log_pos)
Definition: rpl_rli.h:1610
const char * get_group_relay_log_name()
Definition: rpl_rli.h:1601
enum_priv_checks_status check_privilege_checks_user()
Checks the validity and integrity of the data related to PRIVILEGE_CHECKS_USER, specifically the user...
Definition: rpl_rli.cc:3023
const char * get_event_relay_log_name()
Definition: rpl_rli.h:1614
virtual int set_rli_description_event(Format_description_log_event *fdle)
Delete the existing event and set a new one.
Definition: rpl_rli.cc:2409
Gtid_monitoring_info * gtid_monitoring_info
Stores information on the last processed transaction or the transaction that is currently being proce...
Definition: rpl_rli.h:783
std::atomic< ulong > abort_pos_wait
Definition: rpl_rli.h:938
const char * add_channel_to_relay_log_name(char *buff, uint buff_size, const char *base_name)
sets the suffix required for relay log names in multisource replication.
Definition: rpl_rli.cc:1179
size_t get_worker_count()
Definition: rpl_rli.h:1296
ulonglong get_group_master_log_pos() const
Definition: rpl_rli.h:1584
const char * get_group_master_log_name_info() const
Definition: rpl_rli.h:1580
void report_privilege_check_error(enum loglevel level, enum_priv_checks_status status_code, bool to_client, char const *channel_name=nullptr, char const *user_name=nullptr, char const *host_name=nullptr) const
Outputs the error message associated with applier thread user privilege checks error error_code.
Definition: rpl_rli.cc:3118
enum_require_table_primary_key
Identifies what is the replica policy on primary keys in tables.
Definition: rpl_rli.h:272
@ PK_CHECK_ON
The replica enforces tables to have primary keys for a given channel.
Definition: rpl_rli.h:281
@ PK_CHECK_STREAM
The replica sets the value of sql_require_primary_key according to the source replicated value.
Definition: rpl_rli.h:279
@ PK_CHECK_OFF
The replica does not enforce any policy around primary keys.
Definition: rpl_rli.h:283
@ PK_CHECK_GENERATE
The replica generates GIPKs for incoming keyless tables.
Definition: rpl_rli.h:285
@ PK_CHECK_NONE
No policy, used on PFS.
Definition: rpl_rli.h:274
void started_processing(Gtid gtid_arg, ulonglong original_ts_arg, ulonglong immediate_ts_arg, bool skipped=false)
Stores the details of the transaction which has just started processing.
Definition: rpl_rli.h:388
bool pre_commit()
The method implements a pre-commit hook to add up a new statement typically to a DDL transaction to u...
Definition: rpl_rli.h:2100
void retried_processing(uint transient_errno_arg, const char *transient_err_message_arg, ulong trans_retries_arg)
When a transaction is retried, the error number and message, and total number of retries are stored.
Definition: rpl_rli.h:448
static constexpr int RLI_FLUSH_NO_OPTION
No flush options given to relay log flush.
Definition: rpl_rli.h:1540
bool sql_thread_kill_accepted
Definition: rpl_rli.h:1685
static const int PRIV_CHECKS_USERNAME_LENGTH
Definition: rpl_rli.h:1868
void slave_close_thread_tables(THD *)
Definition: rpl_rli.cc:1404
enum_priv_checks_status
Set of possible return values for the member methods related to PRIVILEGE_CHECKS_USER management.
Definition: rpl_rli.h:213
@ USERNAME_NULL_HOSTNAME_NOT_NULL
Value for the username part of the user is NULL but the value for the hostname is not NULL.
@ USER_DOES_NOT_HAVE_PRIVILEGES
Provided user doesn't have the necessary privileges to execute the needed operations.
@ USER_ANONYMOUS
Value for user is anonymous (''@'...')
@ USERNAME_TOO_LONG
Value for the username part of the user is larger than 32 characters.
@ HOSTNAME_TOO_LONG
Value for the hostname part of the user is larger than 255 characters.
@ LOAD_DATA_EVENT_NOT_ALLOWED
Provided user doesn't have FILE privileges during the execution of a LOAD DATAevent.
@ USER_DATA_CORRUPTED
Values provided for the internal variables are corrupted.
@ USER_DOES_NOT_EXIST
Provided user doesn't exists.
@ SUCCESS
Function ended successfully.
@ HOSTNAME_SYNTAX_ERROR
Value for the hostname part of the user has illegal characters.
bool ddl_not_atomic
Raised when slave applies and writes to its binary log statement which is not atomic DDL and has no X...
Definition: rpl_rli.h:2005
bool get_flag(enum_state_flag flag)
Get the value of a replication state flag.
Definition: rpl_rli.h:1438
static const int APPLIER_METADATA_LINES_WITH_REQUIRE_TABLE_PRIMARY_KEY_CHECK
Definition: rpl_rli.h:1891
static const int MAXIMUM_APPLIER_METADATA_LINES
Definition: rpl_rli.h:1917
void inc_event_relay_log_pos()
Definition: rpl_rli.h:1027
bool read_info(Rpl_info_handler *from) override
Definition: rpl_rli.cc:2074
void started_processing(Gtid_log_event *gtid_log_ev_arg)
Stores the details of the transaction which has just started processing.
Definition: rpl_rli.h:402
mysql_mutex_t exit_count_lock
Definition: rpl_rli.h:1187
void notify_relay_log_truncated()
Receiver thread notifies that it truncated some data from relay log.
Definition: rpl_rli.cc:2932
time_t last_event_start_time
Definition: rpl_rli.h:1130
ulonglong get_event_relay_log_pos()
Definition: rpl_rli.h:1615
ulong adapt_to_master_version_updown(ulong master_version, ulong current_version)
The method compares two supplied versions and carries out down- or up- grade customization of executi...
Definition: rpl_rli.cc:2609
std::atomic_bool is_receiver_waiting_for_rl_space
Definition: rpl_rli.h:912
enum_priv_checks_status initialize_applier_security_context()
Initializes the security context associated with the PRIVILEGE_CHECKS_USER user that is to be used by...
Definition: rpl_rli.cc:3278
ulonglong mts_pending_jobs_size
Definition: rpl_rli.h:1189
Format_description_log_event * rli_description_event
Definition: rpl_rli.h:1793
bool mts_finalize_recovery()
Called when gaps execution is ended so it is crash-safe to reset the last session Workers info.
Definition: rpl_rli.cc:430
void set_group_relay_log_name(const char *log_file_name)
Definition: rpl_rli.h:1603
int thd_tx_priority
Definition: rpl_rli.h:1961
ulonglong group_source_log_end_pos
Definition: rpl_rli.h:734
my_off_t new_group_relay_log_pos
Definition: rpl_rli.h:1293
enum Relay_log_info::@165 until_condition
void clear_relay_log_truncated()
Applier clears the flag after it handled the situation.
Definition: rpl_rli.cc:2938
Replication_transaction_boundary_parser transaction_parser
Definition: rpl_rli.h:652
char slave_patternload_file[FN_REFLEN]
Definition: rpl_rli.h:989
ulong mts_recovery_index
Definition: rpl_rli.h:1239
void unset_long_find_row_note_printed()
Definition: rpl_rli.h:1699
mysql_mutex_t mts_temp_table_LOCK
Definition: rpl_rli.h:314
bool deferred_events_collecting
Definition: rpl_rli.h:1147
bool m_relay_log_truncated
It will be set to true when receiver truncated relay log for some reason.
Definition: rpl_rli.h:790
bool is_mts_in_group()
returns true if Coordinator is scheduling events belonging to the same group and has not reached yet ...
Definition: rpl_rli.h:1366
time_t last_master_timestamp
Definition: rpl_rli.h:923
bool is_parallel_exec() const
returns true if events are to be executed in parallel
Definition: rpl_rli.h:1354
int wait_for_gtid_set(THD *thd, const char *gtid, double timeout, bool update_THD_status=true)
Wait for a GTID set to be executed.
Definition: rpl_rli.cc:769
std::string coordinator_log_after_purge
Definition: rpl_rli.h:921
@ COMMIT_TS_FOUND
Definition: rpl_rli.h:367
@ COMMIT_TS_NOT_FOUND
Definition: rpl_rli.h:365
@ COMMIT_TS_UNKNOWN
Definition: rpl_rli.h:363
static const int APPLIER_METADATA_LINES_WITH_ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_VALUE
Definition: rpl_rli.h:1907
bool error_on_rli_init_info
Definition: rpl_rli.h:460
std::string get_privilege_checks_username() const
Retrieves the username part of the PRIVILEGE_CHECKS_USER option of CHANGE MASTER TO statement.
Definition: rpl_rli.cc:2961
Master_info * mi
Definition: rpl_rli.h:352
std::string m_privilege_checks_username
The user name part of the user passed on to PRIVILEGE_CHECKS_USER.
Definition: rpl_rli.h:795
bool is_processing_trx()
Definition: rpl_rli.h:424
bool is_row_format_required() const
Returns whether the slave is running in row mode only.
Definition: rpl_rli.cc:3283
const Gtid_set * get_gtid_set() const
Definition: rpl_rli.h:862
void cleanup_after_session()
Definition: rpl_rli.h:1405
PSI_mutex_key m_key_mta_temp_table_LOCK
Definition: rpl_rli.h:308
virtual bool commit_positions()
The method implements updating a slave info table.
Definition: rpl_rli.cc:2801
char event_relay_log_name[FN_REFLEN]
Definition: rpl_rli.h:703
enum_require_table_primary_key get_require_table_primary_key_check() const
Returns what is the slave policy concerning primary keys on replicated tables.
Definition: rpl_rli.cc:3293
Slave_worker_array workers
Definition: rpl_rli.h:1158
bool get_allow_drop_write_set()
Definition: rpl_rli.h:2023
ulonglong future_event_relay_log_pos
Definition: rpl_rli.h:705
Commit_order_manager * commit_order_mngr
Definition: rpl_rli.h:1801
std::string get_privilege_checks_hostname() const
Retrieves the host part of the PRIVILEGE_CHECKS_USER option of CHANGE MASTER TO statement.
Definition: rpl_rli.cc:2965
void set_group_source_log_start_end_pos(const Log_event *ev)
Process an event and based on its type () set group beginning and end.
Definition: rpl_rli.cc:2905
Gtid_monitoring_info * get_gtid_monitoring_info()
Definition: rpl_rli.h:373
char new_group_relay_log_name[FN_REFLEN]
Definition: rpl_rli.h:1292
void set_event_relay_log_name(const char *log_file_name)
Definition: rpl_rli.h:1616
void set_applier_source_position_info_invalid(bool invalid)
Marks the applier position information as being invalid or not.
Definition: rpl_rli.cc:3303
int wait_for_pos(THD *thd, String *log_name, longlong log_pos, double timeout)
Waits until the SQL thread reaches (has executed up to) the log/position or timed out.
Definition: rpl_rli.cc:591
void set_require_row_format(bool require_row)
Sets the flag that tells whether or not the slave is running in row mode only.
Definition: rpl_rli.cc:3287
void reattach_engine_ha_data(THD *thd)
Reattaches the engine ha_data to THD.
Definition: rpl_rli.cc:2790
time_t sql_delay
Delay slave SQL thread by this amount of seconds.
Definition: rpl_rli.h:1818
Relay_log_info(const Relay_log_info &info)
Slave_worker * last_assigned_worker
Definition: rpl_rli.h:1193
ulong recovery_parallel_workers
Definition: rpl_rli.h:1232
ulonglong mts_pending_jobs_size_max
Definition: rpl_rli.h:1190
bool get_table_data(TABLE *table_arg, table_def **tabledef_var, TABLE **conv_table_var) const
Definition: rpl_rli.h:1094
enum_mts_parallel_type channel_mts_submode
Definition: rpl_rli.h:1327
static const int APPLIER_METADATA_LINES_WITH_CHANNEL
Definition: rpl_rli.h:1856
mysql_mutex_t mts_gaq_LOCK
Definition: rpl_rli.h:319
This is the class for verifying transaction boundaries in a replication event stream.
Definition: rpl_trx_boundary_parser.h:51
Common base class for all row-containing log events.
Definition: log_event.h:2780
It is used to record the original query for the rows events in RBR.
Definition: log_event.h:3771
Rpl_filter.
Definition: rpl_filter.h:214
Definition: rpl_info_factory.h:41
Definition: rpl_info_handler.h:58
Definition: rpl_info.h:43
mysql_mutex_t data_lock
Definition: rpl_info.h:58
bool is_transactional() const
Definition: rpl_info.h:107
THD * info_thd
Definition: rpl_info.h:78
A set of THD members describing the current authenticated user.
Definition: sql_security_ctx.h:54
Group Assigned Queue whose first element identifies first gap in committed sequence.
Definition: rpl_rli_pdb.h:321
Definition: rpl_rli_pdb.h:468
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:169
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Gtid owned_gtid
The GTID of the currently owned transaction.
Definition: sql_class.h:3827
bool slave_thread
Definition: sql_class.h:2791
Relay_log_info * rli_slave
Definition: sql_class.h:1092
enum enum_thread_type system_thread
Definition: sql_class.h:2584
System_variables variables
Definition: sql_lexer_thd.h:64
bool is_commit_in_middle_of_statement
Definition: sql_class.h:3985
bool is_operating_substatement_implicitly
Definition: sql_class.h:2405
Definition: table.h:2933
Table_ref * next_global
Definition: table.h:3641
Represents a bidirectional map between TSID and SIDNO.
Definition: rpl_gtid.h:750
Checkable_rwlock * get_tsid_lock() const
Return the tsid_lock.
Definition: rpl_gtid.h:873
This is the abstract base class for slave start until options.
Definition: rpl_replica_until_options.h:56
bool is_satisfied_after_dispatching_event()
check if the until option is satisfied after applied or dispatched a event.
Definition: rpl_replica_until_options.h:97
bool is_satisfied_before_dispatching_event(const Log_event *ev)
check if the until option is satisfied before applying or dispatching a event.
Definition: rpl_replica_until_options.h:83
bool is_satisfied_at_start_slave()
Check if the until option is already satisfied at coordinator starting.
Definition: rpl_replica_until_options.h:67
bool is_satisfied_all_transactions_read_from_relay_log()
check if the until option is waiting for more transactions to be read from the relay log.
Definition: rpl_replica_until_options.h:111
This abstract class is an interface for classes that contain replication applier data as counters and...
Definition: applier_metrics_interface.h:36
Class that intends to be a dummy end point for applier metrics.
Definition: applier_metrics_stub.h:33
This class contains metrics related to event and transaction scheduling activities in the replica MTA...
Definition: applier_metrics.h:35
uint64_t immediate_commit_timestamp
Timestamp when the transaction was committed on the nearest source.
Definition: control_events.h:1037
uint64_t original_commit_timestamp
Timestamp when the transaction was committed on the originating source.
Definition: control_events.h:1035
uint16_t error_code
Definition: statement_events.h:561
A table definition from the master.
Definition: rpl_utility.h:249
Maps table id's (integers) to table pointers.
Definition: rpl_tblmap.h:51
#define mysql_mutex_lock(M)
Definition: mysql_mutex.h:50
#define mysql_mutex_unlock(M)
Definition: mysql_mutex.h:57
ALWAYS_INLINE const char * base_name(const char *A)
Definition: my_sys.h:711
uint sql_replica_skip_counter
a copy of active_mi->rli->slave_skip_counter, for showing in SHOW GLOBAL VARIABLES,...
Definition: rpl_replica.cc:8744
bool is_atomic_ddl(THD *thd, bool using_trans_arg)
The function lists all DDL instances that are supported for crash-recovery (WL9175).
Definition: log_event.cc:3512
unsigned int PSI_mutex_key
Instrumented mutex key.
Definition: psi_mutex_bits.h:52
static int flag
Definition: hp_test1.cc:40
std::string log_file_name(const Log_files_context &ctx, Log_file_id file_id)
Provides name of the log file with the given file id, e.g.
Definition: log0files_io.cc:716
Binary log event definitions.
void bitmap_free(MY_BITMAP *map)
Definition: my_bitmap.cc:158
#define DBUG_PRINT(keyword, arglist)
Definition: my_dbug.h:181
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
ulonglong my_off_t
Definition: my_inttypes.h:72
unsigned char uchar
Definition: my_inttypes.h:52
long long int longlong
Definition: my_inttypes.h:55
uint64_t uint64
Definition: my_inttypes.h:69
uint32_t uint32
Definition: my_inttypes.h:67
Common #defines and includes for file and socket I/O.
#define FN_REFLEN
Definition: my_io.h:87
Definition of the global "loglevel" enumeration.
loglevel
Definition: my_loglevel.h:41
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
#define HAVE_PSI_INTERFACE
Definition: my_psi_config.h:39
Common header for many mysys elements.
static int count
Definition: myisam_ftdump.cc:45
Instrumentation helpers for conditions.
ABI for instrumented mutexes.
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
const std::string charset("charset")
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:498
@ QUERY_EVENT
Definition: binlog_event.h:292
std::vector< T, ut::allocator< T > > vector
Specialization of vector which uses allocator.
Definition: ut0new.h:2880
Instrumentation helpers for mutexes.
Instrumentation helpers for mutexes.
#define OPTION_BEGIN
Definition: query_options.h:75
required uint32 status
Definition: replication_asynchronous_connection_failover.proto:61
required uint32 priority
Definition: replication_group_member_actions.proto:35
required string event
Definition: replication_group_member_actions.proto:32
mysql::gtid::gno_t rpl_gno
GNO, the second (numeric) component of a GTID, is an alias of mysql::gtid::gno_t.
Definition: rpl_gtid.h:113
enum_return_status
Generic return type for many functions that can succeed or fail.
Definition: rpl_gtid.h:138
@ ASSIGNED_GTID
Specifies that the transaction has been assigned a GTID (UUID:NUMBER).
Definition: rpl_gtid.h:3907
cs::index::rpl_sidno rpl_sidno
Type of SIDNO (source ID number, first component of GTID)
Definition: rpl_gtid.h:109
enum_return_check
Definition: rpl_info_handler.h:51
enum_mts_parallel_type
Definition: rpl_mta_submode.h:47
bool operator!(Relay_log_info::enum_priv_checks_status status)
Negation operator for enum_priv_checks_status, to facilitate validation against SUCCESS.
Definition: rpl_rli.cc:2953
Prealloced_array< Slave_worker *, 4 > Slave_worker_array
Definition: rpl_rli.h:81
struct slave_job_item Slave_job_item
bool is_mts_worker(const THD *thd)
Definition: rpl_rli.h:2146
bool is_committed_ddl(Log_event *ev)
Checks whether the supplied event encodes a (2pc-aware) DDL that has been already committed.
Definition: rpl_rli.h:2157
bool is_atomic_ddl_commit_on_slave(THD *thd)
Checks whether the transaction identified by the argument is executed by a slave applier thread is an...
Definition: rpl_rli.h:2189
bool mysql_show_relaylog_events(THD *thd)
Execute a SHOW RELAYLOG EVENTS statement.
Definition: rpl_rli.cc:1447
Replication transaction boundary parser.
enum_mdl_type
Type of metadata lock request.
Definition: sql_lexer_yacc_state.h:106
char * strmake(char *dst, const char *src, size_t length)
Definition: strmake.cc:42
TODO: Move this structure to mysql/binlog/event/control_events.h when we start using C++11.
Definition: rpl_gtid.h:1101
rpl_sidno sidno
SIDNO of this Gtid.
Definition: rpl_gtid.h:1105
Structure to hold parameters for CHANGE REPLICATION SOURCE, START REPLICA, and STOP REPLICA.
Definition: sql_lex.h:370
enum_mdl_namespace
Object namespaces.
Definition: mdl.h:402
const char * str
Definition: mysql_lex_string.h:41
Definition: my_bitmap.h:43
Extend the normal Table_ref with a few new fields needed by the slave thread, but nowhere else.
Definition: rpl_utility.h:537
LEX_CSTRING table_name
Definition: table.h:795
LEX_CSTRING db
Definition: table.h:794
Definition: table.h:1435
TABLE_SHARE * s
Definition: table.h:1436
An instrumented cond structure.
Definition: mysql_cond_bits.h:50
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:50
Definition: rpl_rli.h:83
Log_event * data
Definition: rpl_rli.h:84
my_off_t relay_pos
Definition: rpl_rli.h:85
char event_relay_log_name[FN_REFLEN+1]
Definition: rpl_rli.h:86
bool m_is_after_metrics_breakpoint
Definition: rpl_rli.h:87
static bool update_timestamp(THD *thd, set_var *var)
Definition: sys_vars.cc:5487
@ SYSTEM_THREAD_SLAVE_WORKER
Definition: thread_type.h:42
@ SYSTEM_THREAD_SLAVE_SQL
Definition: thread_type.h:37
Include file for Sun RPC to compile out of the box.
int n
Definition: xcom_base.cc:509