MySQL 9.5.0
Source Code Documentation
rpl_rli_pdb.h
Go to the documentation of this file.
1/* Copyright (c) 2011, 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_PDB_H
25#define RPL_RLI_PDB_H
26
27#include <stdarg.h>
28#include <sys/types.h>
29#include <time.h>
30#include <atomic>
31#include <tuple>
32
33#include "my_bitmap.h"
34#include "my_compiler.h"
35#include "my_dbug.h"
36#include "my_inttypes.h"
37#include "my_io.h"
38#include "my_psi_config.h"
44#include "mysql/my_loglevel.h"
46#include "prealloced_array.h" // Prealloced_array
50#include "sql/log_event.h" // Format_description_log_event
51#include "sql/rpl_gtid.h"
52#include "sql/rpl_mta_submode.h" // enum_mts_parallel_type
53#include "sql/rpl_replica.h" // MTS_WORKER_UNDEF
54#include "sql/rpl_rli.h" // Relay_log_info
55#include "sql/sql_class.h"
57
59class Slave_worker;
60struct TABLE;
61
62#ifndef NDEBUG
63extern ulong w_rr;
64#endif
65/**
66 Legends running throughout the module:
67
68 C - Coordinator
69 CP - checkpoint
70 W - Worker
71
72 B-event event that Begins a group (a transaction)
73 T-event event that Terminates a group (a transaction)
74*/
75
77 Slave_worker_array *workers,
78 Log_event *ev);
79
81 Slave_job_group() = default;
82
83 /*
84 We need a custom copy constructor and assign operator because std::atomic<T>
85 is not copy-constructible.
86 */
92 worker_id(other.worker_id),
93 worker(other.worker),
101 done(other.done.load()),
102 shifted(other.shifted),
103 ts(other.ts),
104#ifndef NDEBUG
105 notified(other.notified),
106#endif
110 }
111
117 worker_id = other.worker_id;
118 worker = other.worker;
119 total_seqno = other.total_seqno;
126 done.store(other.done.load());
127 shifted = other.shifted;
128 ts = other.ts;
129#ifndef NDEBUG
130 notified = other.notified;
131#endif
135 return *this;
136 }
137
138 char *group_master_log_name; // (actually redundant)
139 /*
140 T-event lop_pos filled by Worker for CheckPoint (CP)
141 */
143
144 /*
145 When relay-log name changes allocates and fill in a new name of relay-log,
146 otherwise it fills in NULL.
147 Coordinator keeps track of each Worker has been notified on the updating
148 to make sure the routine runs once per change.
149
150 W checks the value at commit and memorizes a not-NULL.
151 Freeing unless NULL is left to Coordinator at CP.
152 */
153 char *group_relay_log_name; // The value is last seen relay-log
158
159 my_off_t master_log_pos; // B-event log_pos
160 /* checkpoint coord are reset by periodical and special (Rotate event) CP:s */
162 my_off_t checkpoint_log_pos; // T-event lop_pos filled by W for CheckPoint
165 checkpoint_relay_log_pos; // T-event lop_pos filled by W for CheckPoint
167 std::atomic<int32> done; // Flag raised by W, read and reset by Coordinator
168 ulong shifted; // shift the last CP bitmap at receiving a new CP
169 time_t ts; // Group's timestamp to update Seconds_behind_source
170#ifndef NDEBUG
171 bool notified{false}; // to debug group_master_log_name change notification
172#endif
173 /* Clock-based scheduler requirement: */
174 longlong last_committed; // commit parent timestamp
175 longlong sequence_number; // transaction's logical timestamp
176 /*
177 After Coordinator has seen a new FD event, it sets this member to
178 point to the new event, once per worker. Coordinator does so
179 when it schedules a first group following the FD event to a worker.
180 It checks Slave_worker::fd_change_notified flag to decide whether
181 to do this or not.
182 When the worker executes the group, it replaces its currently
183 active FD by the new FD once it takes on the group first event. It
184 checks this member and resets it after the FD replacement is done.
185
186 The member is kind of lock-free. It's updated by Coordinator and
187 read by Worker without holding any mutex. That's still safe thanks
188 to Slave_worker::jobs_lock that works as synchronizer, Worker
189 can't read any stale info.
190 The member is updated by Coordinator when it decides which Worker
191 an event following a new FD is to be scheduled.
192 After Coordinator has chosen a Worker, it queues the event to it
193 with necessarily taking Slave_worker::jobs_lock. The Worker grabs
194 the mutex lock later at pulling the event from the queue and
195 releases the lock before to read from this member.
196
197 This sequence of actions shows the write operation always precedes
198 the read one, and ensures no stale FD info is passed to the
199 Worker.
200 */
202 /*
203 Coordinator fills the struct with defaults and options at starting of
204 a group distribution.
205 */
209 group_master_log_name = nullptr; // todo: remove
210 group_relay_log_name = nullptr;
212 total_seqno = seqno;
213 checkpoint_log_name = nullptr;
217 checkpoint_seqno = (uint)-1;
218 done = 0;
219 ts = 0;
220#ifndef NDEBUG
221 notified = false;
222#endif
225 new_fd_event = nullptr;
226 }
227};
228
229/**
230 The class defines a type of queue with a predefined max capacity that is
231 implemented using the circular memory buffer.
232 That is items of the queue are accessed as indexed elements of
233 the array buffer in a way that when the index value reaches
234 a max value it wraps around to point to the first buffer element.
235*/
236template <typename Element_type>
238 public:
240 /**
241 The capacity and maximum length of the queue in terms of element.
242 */
243 size_t capacity;
244 /**
245 Its value modulo `capacity` is index of the element where the next element
246 will be enqueued. It's entry+length. It may be bigger than capacity, but
247 will be smaller than 2*capacity.
248 */
249 size_t avail;
250 /**
251 The head index of the queue. It is an index of next element that will be
252 dequeued. It is less than capacity, so it is an actual index (in contrast
253 to `avail`), don't need to be calculated modulo `capacity`.
254 */
255 size_t entry;
256 /**
257 Actual length. It can be read while not protected by any mutex.
258 */
259 std::atomic<size_t> len;
261
264 capacity(max),
265 avail(0),
266 entry(0),
267 len(0),
268 inited_queue(false) {
269 if (!m_Q.reserve(capacity)) inited_queue = true;
270 m_Q.resize(capacity);
271 }
274
275 /**
276 Content of the being dequeued item is copied to the arg-pointer
277 location.
278
279 @param [out] item A pointer to the being dequeued item.
280 @return true if an element was returned, false if the queue was empty.
281 */
282 bool de_queue(Element_type *item);
283 /**
284 Similar to de_queue but extracting happens from the tail side.
285
286 @param [out] item A pointer to the being dequeued item.
287 @return true if an element was returned, false if the queue was empty.
288 */
289 bool de_tail(Element_type *item);
290
291 /**
292 return the index where the arg item locates
293 or an error encoded as a value `circular_buffer_queue::error_result`.
294 */
295 size_t en_queue(Element_type *item);
296 /**
297 return the value of @c data member of the head of the queue.
298 */
299 Element_type *head_queue() {
300 if (empty()) return nullptr;
301 return &m_Q[entry];
302 }
303
304 /* index is within the valid range */
305 bool in(size_t i) {
306 return (avail >= capacity) ? (entry <= i || i < avail - capacity)
307 : (entry <= i && i < avail);
308 }
309 size_t get_length() const { return len.load(std::memory_order_relaxed); }
310 bool empty() const { return get_length() == 0; }
311 bool full() const { return get_length() == capacity; }
312
314};
315
316/**
317 Group Assigned Queue whose first element identifies first gap
318 in committed sequence. The head of the queue is therefore next to
319 the low-water-mark.
320*/
321class Slave_committed_queue : public circular_buffer_queue<Slave_job_group> {
322 public:
323 bool inited;
324
325 /* master's Rot-ev exec */
326 void update_current_binlog(const char *post_rotate);
327
328 /*
329 The last checkpoint time Low-Water-Mark
330 */
332
333 /* last time processed indexes for each worker */
335
336 /* the being assigned group index in GAQ */
338
339 Slave_committed_queue(size_t max, uint n);
340
342 if (inited) {
344 free_dynamic_items(); // free possibly left allocated strings in GAQ list
345 }
346 }
347
348#ifndef NDEBUG
349 bool count_done(Relay_log_info *rli);
350#endif
351
352 /* Checkpoint routine refreshes the queue */
354 /* Method is for slave shutdown time cleanup */
355 void free_dynamic_items();
356 /*
357 returns a pointer to Slave_job_group struct instance as indexed by arg
358 in the circular buffer dyn-array
359 */
361 assert(ind < capacity);
362 return &m_Q[ind];
363 }
364
365 /**
366 Assigns @c assigned_group_index to an index of enqueued item
367 and returns it.
368 */
369 size_t en_queue(Slave_job_group *item) {
370 return assigned_group_index =
372 }
373
374 /**
375 Dequeue from head.
376
377 @param [out] item A pointer to the being dequeued item.
378 @return true if an element was returned, false if the queue was empty.
379 */
382 }
383
384 /**
385 Similar to de_queue() but removing an item from the tail side.
386
387 @param [out] item A pointer to the being dequeued item.
388 @return true if an element was returned, false if the queue was empty.
389 */
392 }
393
394 size_t find_lwm(Slave_job_group **, size_t);
395};
396
397/**
398 @return the index where the arg item has been located
399 or an error encoded as a value
400 `circular_buffer_queue::error_result`.
401*/
402template <typename Element_type>
404 if (full()) {
405 return error_result;
406 }
407
408 const auto ret = (avail++) % capacity;
409 m_Q[ret] = *item;
410 len++;
411 assert(len == avail - entry);
412 assert(entry < avail);
413
414 return ret;
415}
416
417/**
418 Dequeue from head.
419
420 @param [out] item A pointer to the being dequeued item.
421 @return true if an element was returned, false if the queue was empty.
422*/
423template <typename Element_type>
425 if (empty()) {
426 return false;
427 }
428 *item = m_Q[entry++];
429 len--;
430 assert(len == avail - entry);
431 assert(entry <= avail);
432
433 // The start of the queue just have returned to the first index. Normalize
434 // indexes so they are small again.
435 if (entry == capacity) {
436 entry = 0;
437 avail -= capacity;
438 assert(avail < capacity);
439 assert(avail == len);
440 }
441 return true;
442}
443
444template <typename Element_type>
446 if (empty()) {
447 return false;
448 }
449
450 assert(avail > entry);
451 *item = m_Q[(--avail) % capacity];
452 len--;
453 assert(len == avail - entry);
454 return true;
455}
456
457class Slave_jobs_queue : public circular_buffer_queue<Slave_job_item> {
458 public:
460 /*
461 Coordinator marks with true, Worker signals back at queue back to
462 available
463 */
466};
467
469 public:
472 PSI_mutex_key *param_key_info_run_lock,
473 PSI_mutex_key *param_key_info_data_lock,
474 PSI_mutex_key *param_key_info_sleep_lock,
475 PSI_mutex_key *param_key_info_thd_lock,
476 PSI_mutex_key *param_key_info_data_cond,
477 PSI_mutex_key *param_key_info_start_cond,
478 PSI_mutex_key *param_key_info_stop_cond,
479 PSI_mutex_key *param_key_info_sleep_cond,
480#endif
481 uint param_id, const char *param_channel);
482
483 ~Slave_worker() override;
484
485 Slave_jobs_queue jobs; // assignment queue containing events to execute
486 mysql_mutex_t jobs_lock; // mutex for the jobs queue
487 mysql_cond_t jobs_cond; // condition variable for the jobs queue
488 Relay_log_info *c_rli; // pointer to Coordinator's rli
489
490#ifndef NDEBUG
491 bool curr_group_seen_sequence_number; // is set to true about starts_group()
492#endif
493 ulong id; // numeric identifier of the Worker
494
495 /*
496 Worker runtime statistics
497 */
498 /// Number of transaction handled - incremented at slave_worker_ends_group
500
501 // the index in GAQ of the last processed group by this Worker
502 volatile ulong last_group_done_index;
504 last_groups_assigned_index; // index of previous group assigned to worker
505 std::atomic<int> curr_jobs; // number of active assignments
506
507 volatile bool relay_log_change_notified; // Coord sets and resets, W can read
508 volatile bool checkpoint_notified; // Coord sets and resets, W can read
509 volatile bool
510 master_log_change_notified; // Coord sets and resets, W can read
511 /*
512 The variable serves to Coordinator as a memo to itself
513 to notify a Worker about the fact that a new FD has been read.
514 Normally, the value is true, to mean the Worker is notified.
515 When Coordinator reads a new FD it changes the value to false.
516 When Coordinator schedules to a Worker the first event following the new FD,
517 it propagates the new FD to the Worker through
518 Slave_job_group::new_fd_event. Afterwards Coordinator returns the value back
519 to the regular true, to denote things done. Worker will adapt to the new FD
520 once it takes on a first event of the marked group.
521 */
523 ulong bitmap_shifted; // shift the last bitmap at receiving new CP
524
525 private:
526 /// @brief worker statistics
528 /// @brief Placehold for stats when metric collection is disabled
530
531 /// @brief Is worker metric collection enabled
533
534 public:
535 /// @brief Sets the metric collection as on or off
536 /// This should be done at the worker start
537 /// @param status if metrics are enabled or not
540 }
541
542 /// @brief gets a reference to the worker statistics.
543 /// @return a reference to the worker statistics.
545
546 /// @brief Copies data and sets the metric collection flag
547 /// @param other the instance to be copied
552 }
553
554 /// The number of events applied in an ongoing transaction, used to collect
555 /// statistics when the transaction ends.
557
558 /// True if this transaction occurred after the _metrics breakpoint_ in the
559 /// relay log.
560 ///
561 /// @see Applier_metrics_interface::is_received_initialized.
563
564 /// Update per-event worker metrics.
565 ///
566 /// This includes:
567 ///
568 /// - APPLYING_TRANSACTION_APPLIED_SIZE_BYTES
569 ///
570 /// - The the number of events in the transaction. This is an internal
571 /// counter, not directly user visible, but used to increment
572 /// EVENTS_COMMITTED_COUNT at commit time. This is set to 1 for the GTID
573 /// event, and incremented for all other events. It does not need to be reset
574 /// at rollback, since the value is only used at commits, and the next GTID
575 /// event will reset the value before the next commit.
578 event.common_header->data_written);
580 event.get_type_code()))
582 else
584 }
585
586 // WQ current excess above the overrun level
588 /*
589 number of events starting from which Worker queue is regarded as
590 close to full. The number of the excessive events yields a weight factor
591 to compute Coordinator's nap.
592 */
594 /*
595 reverse to overrun: the number of events below which Worker is
596 considered under-running
597 */
599 /*
600 Total of increments done to rli->mts_wq_excess_cnt on behalf of this worker.
601 When WQ length is dropped below overrun the counter is reset.
602 */
604 /*
605 Coordinates of the last CheckPoint (CP) this Worker has
606 acknowledged; part of is persistent data
607 */
612 MY_BITMAP group_executed; // bitmap describes groups executed after last CP
613 MY_BITMAP group_shifted; // temporary bitmap to compute group_executed
614 ulong
615 worker_checkpoint_seqno; // the most significant ON bit in group_executed
616 /* Initial value of FD-for-execution version until it's gets known. */
621 ERROR_LEAVING = 2, // is set by Worker
622 STOP = 3, // is set by Coordinator upon receiving STOP
624 4 // is set by worker upon completing job when STOP REPLICA is issued
625 };
626
627 /*
628 This function is used to make a copy of the worker object before we
629 destroy it on STOP REPLICA. This new object is then used to report the
630 worker status until next START REPLICA following which the new worker
631 objects will be used.
632 */
634 THD *worker_thd, const Error &last_error,
635 Gtid_monitoring_info *monitoring_info_arg);
636
637 /*
638 The running status is guarded by jobs_lock mutex that a writer
639 Coordinator or Worker itself needs to hold when write a new value.
640 */
642 /*
643 exit_incremented indicates whether worker has contributed to max updated
644 index. By default it is set to false. When the worker contributes for the
645 first time this variable is set to true.
646 */
648
649 int init_worker(Relay_log_info *, ulong);
650 int rli_init_info(bool);
651 int flush_info(bool force = false);
652 static size_t get_number_worker_fields();
653 /**
654 Sets bits for columns that are allowed to be `NULL`.
655
656 @param nullable_fields the bitmap to hold the nullable fields.
657 */
658 static void set_nullable_fields(MY_BITMAP *nullable_fields);
660 const char *get_master_log_name();
662 ulonglong set_master_log_pos(ulong val) { return master_log_pos = val; }
663 bool commit_positions(Log_event *evt, Slave_job_group *ptr_g, bool force);
664 /**
665 The method is a wrapper to provide uniform interface with STS and is
666 to be called from Relay_log_info and Slave_worker pre_commit() methods.
667 */
668 bool commit_positions() override {
669 assert(current_event);
670
671 return commit_positions(
674 }
675 /**
676 See the comments for STS version of this method.
677 */
678 void post_commit(bool on_rollback) override {
679 if (on_rollback) {
680 if (is_transactional())
683 } else if (!is_transactional())
686 true);
687 }
688 /*
689 When commit fails clear bitmap for executed worker group. Revert back the
690 positions to the old positions that existed before commit using the
691 checkpoint.
692
693 @param Slave_job_group a pointer to Slave_job_group struct instance which
694 holds group master log pos, group relay log pos and checkpoint positions.
695 */
697 bool reset_recovery_info();
698 /**
699 The method runs at Worker initialization, at runtime when
700 Coordinator supplied a new FD event for execution context, and at
701 the Worker pool shutdown.
702 Similarly to the Coordinator's
703 Relay_log_info::set_rli_description_event() the possibly existing
704 old FD is destroyed, carefully; each worker decrements
705 Format_description_log_event::atomic_usage_counter and when it is made
706 zero the destructor runs.
707 Unlike to Coordinator's role, the usage counter of the new FD is *not*
708 incremented, see @c Log_event::get_slave_worker() where and why it's done
709 there.
710
711 Notice, the method is run as well by Coordinator per each Worker at MTS
712 shutdown time.
713
714 Todo: consider to merge logics of the method with that of
715 Relay_log_info class.
716
717 @param fdle pointer to a new Format_description_log_event
718
719 @return 1 if an error was encountered, 0 otherwise.
720 */
723
724 if (fdle) {
725 /*
726 When the master rotates its binary log, set gtid_next to
727 NOT_YET_DETERMINED. This tells the slave thread that:
728
729 - If a Gtid_log_event is read subsequently, gtid_next will be set to the
730 given GTID (this is done in gtid_pre_statement_checks()).
731
732 - If a statement is executed before any Gtid_log_event, then gtid_next
733 is set to anonymous (this is done in Gtid_log_event::do_apply_event().
734
735 It is important to not set GTID_NEXT=NOT_YET_DETERMINED in the middle of
736 a transaction. If that would happen when GTID_MODE=ON, the next
737 statement would fail because it implicitly sets GTID_NEXT=ANONYMOUS,
738 which is disallowed when GTID_MODE=ON. So then there would be no way to
739 end the transaction; any attempt to do so would result in this error.
740
741 There are three possible states when reaching this execution flow point
742 (see further below for a more detailed explanation on each):
743
744 - **No active transaction, and not in a group**: set `gtid_next` to
745 `NOT_YET_DETERMINED`.
746
747 - **No active transaction, and in a group**: do nothing regarding
748 `gtid_next`.
749
750 - **An active transaction exists**: impossible to set `gtid_next` and no
751 reason to process the `Format_description` event so, trigger an error.
752
753 For the sake of correctness, let's defined the meaning of having a
754 transaction "active" or "in a group".
755
756 A transaction is "active" if either BEGIN was executed or autocommit=0
757 and a DML statement was executed (@see
758 THD::in_active_multi_stmt_transaction).
759
760 A transaction is "in a group" if it is applied by the replication
761 applier, and the relay log position is between Gtid_log_event and the
762 committing event (@see Relay_log_info::is_in_group).
763
764 The three different states explained further:
765
766 **No active transaction, and not in a group**: It is normal to have
767 gtid_next=automatic/undefined and have a Format_description_log_event in
768 this condition. We are outside transaction context and should set
769 gtid_next to not_yet_determined.
770
771 **No active transaction, and in a group**: Having
772 gtid_next=automatic/undefined in a group is impossible if master is 5.7
773 or later, because the group always starts with a Gtid_log_event or an
774 Anonymous_gtid_log_event, which will set gtid_next to anonymous or
775 gtid. But it is possible to have gtid_next=undefined when replicating
776 from a 5.6 master with gtid_mode=off, because it does not generate any
777 such event. And then, it is possible to have no active transaction in a
778 group if the master has logged a DDL as a User_var_log_event followed by
779 a Query_log_event. The User_var_log_event will start a group, but not
780 start an active transaction or change gtid_next. In this case, it is
781 possible that a Format_description_log_event occurs, if the group
782 (transaction) is broken on two relay logs, so that User_var_log_event
783 appears at the end of one relay log and Query_log_event at the beginning
784 of the next one. In such cases, we should not set gtid_next.
785
786 **An active transaction exists**: It is possible to have
787 gtid_next=automatic/undefined in an active transaction, only if
788 gtid_next=automatic, which is only possible in a client connection using
789 gtid_next=automatic. In this scenario, there is no reason to execute a
790 Format_description_log_event. So we generate an error.
791 */
792 if (info_thd->variables.gtid_next.is_automatic() ||
793 info_thd->variables.gtid_next.is_undefined()) {
794 bool in_active_multi_stmt =
796
797 if (!is_in_group() && !in_active_multi_stmt) {
798 DBUG_PRINT("info",
799 ("Setting gtid_next.type to NOT_YET_DETERMINED_GTID"));
800 info_thd->variables.gtid_next.set_not_yet_determined();
801 } else if (in_active_multi_stmt) {
802 my_error(ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION, MYF(0),
803 "gtid_next");
804 return 1;
805 }
806 }
809 }
812
814 /* The being deleted by Worker FD can't be the latest one */
816
818 }
819 }
821
822 return 0;
823 }
824
826 inline void set_gaq_index(ulong val) {
827 if (gaq_index == c_rli->gaq->capacity) gaq_index = val;
828 }
829
831
832 /**
833 Make the necessary changes to both the `Slave_worker` and current
834 `Log_event` objects, before retrying to apply the transaction.
835
836 Since the event is going to be re-read from the relay-log file, there
837 may be actions needed to be taken to reset the state both of `this`
838 instance, as well as of the current `Log_event` being processed.
839
840 @param event The `Log_event` object currently being processed.
841 */
843
844 /**
845 Checks if the transaction can be retried, and if not, reports an error.
846
847 @param[in] thd The THD object of current thread.
848
849 @returns std::tuple<bool, bool, uint> where each element has
850 following meaning:
851
852 first element of tuple is function return value and determines:
853 false if the transaction should be retried
854 true if the transaction should not be retried
855
856 second element of tuple determines:
857 the function will set the value to true, in case the retry
858 should be "silent". Silent means that the caller should not
859 report it in performance_schema tables, write to the error log,
860 or sleep. Currently, silent is used by NDB only.
861
862 third element of tuple determines:
863 If the caller should report any other error than that stored in
864 thd->get_stmt_da()->mysql_errno(), then this function will store
865 that error in this third element of the tuple.
866
867 */
868 std::tuple<bool, bool, uint> check_and_report_end_of_retries(THD *thd);
869
870 /**
871 It is called after an error happens. It checks if that is an temporary
872 error and if the transaction should be retried. Then it will retry the
873 transaction if it is allowed. Retry policy and logic is similar to
874 single-threaded slave.
875
876 @param[in] start_relay_pos The offset of the transaction's first event.
877 @param[in] start_event_relay_log_name The name of the relay log which
878 includes the first event of the transaction.
879
880 @param[in] end_relay_pos The offset of the last event it should retry.
881 @param[in] end_event_relay_log_name The name of the relay log which
882 includes the last event it should retry.
883
884 @retval false if transaction succeeds (possibly after a number of retries)
885 @retval true if transaction fails
886 */
887 bool retry_transaction(my_off_t start_relay_pos,
888 const char *start_event_relay_log_name,
889 my_off_t end_relay_pos,
890 const char *end_event_relay_log_name);
891
892 bool set_info_search_keys(Rpl_info_handler *to) override;
893
894 /**
895 Get coordinator's RLI. Especially used get the rli from
896 a slave thread, like this: thd->rli_slave->get_c_rli();
897 thd could be a SQL thread or a worker thread.
898 */
899 Relay_log_info *get_c_rli() override { return c_rli; }
900
901 /**
902 return an extension "for channel channel_name"
903 for error messages per channel
904 */
905 const char *get_for_channel_str(bool upper_case = false) const override;
906
909 return ptr_g->sequence_number;
910 }
911
912 /**
913 Return true if replica-preserve-commit-order is enabled and an
914 earlier transaction is waiting for a row-level lock held by this
915 transaction.
916 */
918
919 /**
920 Called when replica-preserve-commit-order is enabled, by the worker
921 processing an earlier transaction that waits on a row-level lock
922 held by this worker's transaction.
923 */
925
926 /**
927 @return either the master server version as extracted from the last
928 installed Format_description_log_event, or when it was not
929 installed then the slave own server version.
930 */
935 }
936
937 protected:
938 void do_report(loglevel level, int err_code, const char *msg,
939 va_list v_args) const override
940 MY_ATTRIBUTE((format(printf, 4, 0)));
941
942 void do_report(loglevel level, int err_code,
943 const Gtid_specification *gtid_next, const char *msg,
944 va_list v_args) const override
945 MY_ATTRIBUTE((format(printf, 5, 0)));
946
947 private:
948 ulong gaq_index; // GAQ index of the current assignment
949 ulonglong master_log_pos; // event's cached log_pos for possible error report
950 void end_info();
951 bool read_info(Rpl_info_handler *from) override;
952 bool write_info(Rpl_info_handler *to) override;
953 std::atomic<bool> m_commit_order_deadlock;
954
955 /// This flag indicates whether positions were already modified during the
956 /// event processing, if yes, positions are not updated in the
957 /// slave_worker_ends_group function
959
962 bool worker_sleep(ulong seconds);
963 bool read_and_apply_events(my_off_t start_relay_pos,
964 const char *start_event_relay_log_name,
965 my_off_t end_relay_pos,
966 const char *end_event_relay_log_name);
967
968 public:
969 /**
970 Set the flag the signals a deadlock to false
971 */
973
974 /**
975 Returns an array with the expected column numbers of the primary key
976 fields of the table repository.
977 */
978 static const uint *get_table_pk_field_indexes();
979 /**
980 Returns the index of the Channel_name field of the table repository.
981 */
982 static uint get_channel_field_index();
983};
984
987 Slave_job_item *job_item);
988
990// Auxiliary function
992
994 Relay_log_info *rli);
995
996inline Slave_worker *get_thd_worker(const THD *thd) {
997 return static_cast<Slave_worker *>(thd->rli_slave);
998}
999
1001
1002#endif
Contains the classes representing events occurring in the replication stream.
Class representing an error.
Definition: error.h:48
For binlog version 4.
Definition: log_event.h:1531
std::atomic< int32 > atomic_usage_counter
Definition: log_event.h:1549
Stores information to monitor a transaction during the different replication stages.
Definition: rpl_gtid.h:1413
This is the abstract base class for binary log events.
Definition: log_event.h:538
ulong mts_group_idx
Index in rli->gaq array to indicate a group that this event is purging.
Definition: log_event.h:693
Definition: rpl_rli.h:205
Format_description_log_event * get_rli_description_event() const
Return the current Format_description_log_event.
Definition: rpl_rli.h:1717
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
Log_event * current_event
Reference to being applied event.
Definition: rpl_rli.h:1995
Slave_committed_queue * gaq
Definition: rpl_rli.h:1198
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
Format_description_log_event * rli_description_event
Definition: rpl_rli.h:1793
Definition: rpl_info_handler.h:58
bool is_transactional() const
Definition: rpl_info.h:107
THD * info_thd
Definition: rpl_info.h:78
Group Assigned Queue whose first element identifies first gap in committed sequence.
Definition: rpl_rli_pdb.h:321
void free_dynamic_items()
Method should be executed at slave system stop to cleanup dynamically allocated items that remained a...
Definition: rpl_rli_pdb.cc:1090
bool de_queue(Slave_job_group *item)
Dequeue from head.
Definition: rpl_rli_pdb.h:380
Slave_committed_queue(size_t max, uint n)
Definition: rpl_rli_pdb.cc:889
bool inited
Definition: rpl_rli_pdb.h:323
bool count_done(Relay_log_info *rli)
Definition: rpl_rli_pdb.cc:907
ulong assigned_group_index
Definition: rpl_rli_pdb.h:337
bool de_tail(Slave_job_group *item)
Similar to de_queue() but removing an item from the tail side.
Definition: rpl_rli_pdb.h:390
size_t move_queue_head(Slave_worker_array *ws)
The queue is processed from the head item by item to purge items representing committed groups.
Definition: rpl_rli_pdb.cc:951
Prealloced_array< ulonglong, 1 > last_done
Definition: rpl_rli_pdb.h:334
Slave_job_group * get_job_group(size_t ind)
Definition: rpl_rli_pdb.h:360
~Slave_committed_queue()
Definition: rpl_rli_pdb.h:341
void update_current_binlog(const char *post_rotate)
size_t find_lwm(Slave_job_group **, size_t)
Finds low-water mark of committed jobs in GAQ.
Definition: rpl_rli_pdb.cc:1053
size_t en_queue(Slave_job_group *item)
Assigns assigned_group_index to an index of enqueued item and returns it.
Definition: rpl_rli_pdb.h:369
Slave_job_group lwm
Definition: rpl_rli_pdb.h:331
Definition: rpl_rli_pdb.h:457
Slave_jobs_queue()
Definition: rpl_rli_pdb.h:459
bool overfill
Definition: rpl_rli_pdb.h:464
ulonglong waited_overfill
Definition: rpl_rli_pdb.h:465
Error const & last_error() const
Definition: rpl_reporting.h:143
Definition: rpl_rli_pdb.h:468
ulonglong get_master_log_pos()
Definition: rpl_rli_pdb.h:661
ulong underrun_level
Definition: rpl_rli_pdb.h:598
char checkpoint_relay_log_name[FN_REFLEN]
Definition: rpl_rli_pdb.h:608
ulong excess_cnt
Definition: rpl_rli_pdb.h:603
bool m_is_worker_metric_collection_enabled
Is worker metric collection enabled.
Definition: rpl_rli_pdb.h:532
bool read_and_apply_events(my_off_t start_relay_pos, const char *start_event_relay_log_name, my_off_t end_relay_pos, const char *end_event_relay_log_name)
Read events from relay logs and apply them.
Definition: rpl_rli_pdb.cc:1505
bool curr_group_seen_sequence_number
Definition: rpl_rli_pdb.h:491
void reset_gaq_index()
Definition: rpl_rli_pdb.h:825
ulong overrun_level
Definition: rpl_rli_pdb.h:593
bool commit_positions() override
The method is a wrapper to provide uniform interface with STS and is to be called from Relay_log_info...
Definition: rpl_rli_pdb.h:668
ulong bitmap_shifted
Definition: rpl_rli_pdb.h:523
longlong sequence_number()
Definition: rpl_rli_pdb.h:907
void reset_commit_order_deadlock()
Set the flag the signals a deadlock to false.
Definition: rpl_rli_pdb.cc:1329
int flush_info(bool force=false)
Definition: rpl_rli_pdb.cc:466
int set_rli_description_event(Format_description_log_event *fdle) override
The method runs at Worker initialization, at runtime when Coordinator supplied a new FD event for exe...
Definition: rpl_rli_pdb.h:721
ulonglong checkpoint_master_log_pos
Definition: rpl_rli_pdb.h:611
Slave_jobs_queue jobs
Definition: rpl_rli_pdb.h:485
volatile bool relay_log_change_notified
Definition: rpl_rli_pdb.h:507
MY_BITMAP group_shifted
Definition: rpl_rli_pdb.h:613
ulong worker_checkpoint_seqno
Definition: rpl_rli_pdb.h:615
bool worker_sleep(ulong seconds)
Sleep for a given amount of seconds or until killed.
Definition: rpl_rli_pdb.cc:1307
void copy_values_for_PFS(ulong worker_id, en_running_state running_status, THD *worker_thd, const Error &last_error, Gtid_monitoring_info *monitoring_info_arg)
Definition: rpl_rli_pdb.cc:549
std::tuple< bool, bool, uint > check_and_report_end_of_retries(THD *thd)
Checks if the transaction can be retried, and if not, reports an error.
Definition: rpl_rli_pdb.cc:1354
ulong gaq_index
Definition: rpl_rli_pdb.h:948
void post_commit(bool on_rollback) override
See the comments for STS version of this method.
Definition: rpl_rli_pdb.h:678
void do_report(loglevel level, int err_code, const char *msg, va_list v_args) const override
Definition: rpl_rli_pdb.cc:1108
const char * get_for_channel_str(bool upper_case=false) const override
return an extension "for channel channel_name" for error messages per channel
Definition: rpl_rli_pdb.cc:2229
void report_commit_order_deadlock()
Called when replica-preserve-commit-order is enabled, by the worker processing an earlier transaction...
Definition: rpl_rli_pdb.cc:1337
Slave_worker(const Slave_worker &info)
std::atomic< int > curr_jobs
Definition: rpl_rli_pdb.h:505
Slave_worker(Relay_log_info *rli, 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)
Definition: rpl_rli_pdb.cc:239
void set_worker_metric_collection_status(bool status)
Sets the metric collection as on or off This should be done at the worker start.
Definition: rpl_rli_pdb.h:538
bool write_info(Rpl_info_handler *to) override
Definition: rpl_rli_pdb.cc:571
int init_worker(Relay_log_info *, ulong)
Method is executed by Coordinator at Worker startup time to initialize members parly with values supp...
Definition: rpl_rli_pdb.cc:310
static uint get_channel_field_index()
Returns the index of the Channel_name field of the table repository.
Definition: rpl_rli_pdb.cc:2237
bool read_info(Rpl_info_handler *from) override
Definition: rpl_rli_pdb.cc:497
const char * get_master_log_name()
Definition: rpl_rli_pdb.cc:621
static void set_nullable_fields(MY_BITMAP *nullable_fields)
Sets bits for columns that are allowed to be NULL.
Definition: rpl_rli_pdb.cc:615
cs::apply::instruments::Dummy_worker_metrics m_disabled_worker_metrics
Placehold for stats when metric collection is disabled.
Definition: rpl_rli_pdb.h:529
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_pdb.cc:560
ulong server_version
Definition: rpl_rli_pdb.h:617
ulong id
Definition: rpl_rli_pdb.h:493
int64_t m_events_applied_in_transaction
The number of events applied in an ongoing transaction, used to collect statistics when the transacti...
Definition: rpl_rli_pdb.h:556
void prepare_for_retry(Log_event &event)
Make the necessary changes to both the Slave_worker and current Log_event objects,...
Definition: rpl_rli_pdb.cc:1343
Slave_worker & operator=(const Slave_worker &info)
ulonglong master_log_pos
Definition: rpl_rli_pdb.h:949
int slave_worker_exec_event(Log_event *ev)
MTS worker main routine.
Definition: rpl_rli_pdb.cc:1245
ulong get_master_server_version()
Definition: rpl_rli_pdb.h:931
bool retry_transaction(my_off_t start_relay_pos, const char *start_event_relay_log_name, my_off_t end_relay_pos, const char *end_event_relay_log_name)
It is called after an error happens.
Definition: rpl_rli_pdb.cc:1411
bool exit_incremented
Definition: rpl_rli_pdb.h:647
volatile ulong last_group_done_index
Definition: rpl_rli_pdb.h:502
Relay_log_info * c_rli
Definition: rpl_rli_pdb.h:488
bool found_commit_order_deadlock()
Return true if replica-preserve-commit-order is enabled and an earlier transaction is waiting for a r...
Definition: rpl_rli_pdb.cc:1333
Relay_log_info * get_c_rli() override
Get coordinator's RLI.
Definition: rpl_rli_pdb.h:899
bool reset_recovery_info()
Clean up a part of Worker info table that is regarded in in gaps collecting at recovery.
Definition: rpl_rli_pdb.cc:602
mysql_mutex_t jobs_lock
Definition: rpl_rli_pdb.h:486
en_running_state
Definition: rpl_rli_pdb.h:618
@ NOT_RUNNING
Definition: rpl_rli_pdb.h:619
@ STOP_ACCEPTED
Definition: rpl_rli_pdb.h:623
@ RUNNING
Definition: rpl_rli_pdb.h:620
@ STOP
Definition: rpl_rli_pdb.h:622
@ ERROR_LEAVING
Definition: rpl_rli_pdb.h:621
void rollback_positions(Slave_job_group *ptr_g)
Definition: rpl_rli_pdb.cc:709
long wq_overrun_cnt
Definition: rpl_rli_pdb.h:587
static const uint * get_table_pk_field_indexes()
Returns an array with the expected column numbers of the primary key fields of the table repository.
Definition: rpl_rli_pdb.cc:2233
void slave_worker_ends_group(Log_event *, int)
Deallocation routine to cancel out few effects of map_db_to_worker().
Definition: rpl_rli_pdb.cc:774
ulonglong set_master_log_pos(ulong val)
Definition: rpl_rli_pdb.h:662
bool m_flag_positions_committed
This flag indicates whether positions were already modified during the event processing,...
Definition: rpl_rli_pdb.h:958
std::atomic< bool > m_commit_order_deadlock
Definition: rpl_rli_pdb.h:953
void set_gaq_index(ulong val)
Definition: rpl_rli_pdb.h:826
void increment_worker_metrics_for_event(const Log_event &event)
Update per-event worker metrics.
Definition: rpl_rli_pdb.h:576
char checkpoint_master_log_name[FN_REFLEN]
Definition: rpl_rli_pdb.h:610
ulonglong last_groups_assigned_index
Definition: rpl_rli_pdb.h:504
void end_info()
Definition: rpl_rli_pdb.cc:452
cs::apply::instruments::Worker_metrics & get_worker_metrics()
gets a reference to the worker statistics.
Definition: rpl_rli_pdb.cc:2239
en_running_state volatile running_status
Definition: rpl_rli_pdb.h:641
void copy_worker_metrics(Slave_worker *other)
Copies data and sets the metric collection flag.
Definition: rpl_rli_pdb.h:548
ulonglong checkpoint_relay_log_pos
Definition: rpl_rli_pdb.h:609
bool fd_change_notified
Definition: rpl_rli_pdb.h:522
volatile bool checkpoint_notified
Definition: rpl_rli_pdb.h:508
bool m_is_after_metrics_breakpoint
True if this transaction occurred after the metrics breakpoint in the relay log.
Definition: rpl_rli_pdb.h:562
mysql_cond_t jobs_cond
Definition: rpl_rli_pdb.h:487
cs::apply::instruments::Mta_worker_metrics m_worker_metrics
worker statistics
Definition: rpl_rli_pdb.h:527
static size_t get_number_worker_fields()
Definition: rpl_rli_pdb.cc:611
~Slave_worker() override
Definition: rpl_rli_pdb.cc:280
MY_BITMAP group_executed
Definition: rpl_rli_pdb.h:612
volatile bool master_log_change_notified
Definition: rpl_rli_pdb.h:510
int rli_init_info(bool)
A part of Slave worker initializer that provides a minimum context for MTS recovery.
Definition: rpl_rli_pdb.cc:405
ulong transactions_handled
Number of transaction handled - incremented at slave_worker_ends_group.
Definition: rpl_rli_pdb.h:499
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Relay_log_info * rli_slave
Definition: sql_class.h:1092
System_variables variables
Definition: sql_lexer_thd.h:64
bool in_active_multi_stmt_transaction() const
true if the session is in a multi-statement transaction mode (
Definition: sql_class.h:3282
The class defines a type of queue with a predefined max capacity that is implemented using the circul...
Definition: rpl_rli_pdb.h:237
bool in(size_t i)
Definition: rpl_rli_pdb.h:305
bool empty() const
Definition: rpl_rli_pdb.h:310
static constexpr size_t error_result
Definition: rpl_rli_pdb.h:313
std::atomic< size_t > len
Actual length.
Definition: rpl_rli_pdb.h:259
size_t en_queue(Element_type *item)
return the index where the arg item locates or an error encoded as a value circular_buffer_queue::err...
Definition: rpl_rli_pdb.h:403
size_t capacity
The capacity and maximum length of the queue in terms of element.
Definition: rpl_rli_pdb.h:243
size_t get_length() const
Definition: rpl_rli_pdb.h:309
circular_buffer_queue()
Definition: rpl_rli_pdb.h:272
Element_type * head_queue()
return the value of data member of the head of the queue.
Definition: rpl_rli_pdb.h:299
size_t avail
Its value modulo capacity is index of the element where the next element will be enqueued.
Definition: rpl_rli_pdb.h:249
circular_buffer_queue(size_t max)
Definition: rpl_rli_pdb.h:262
bool de_queue(Element_type *item)
Content of the being dequeued item is copied to the arg-pointer location.
Definition: rpl_rli_pdb.h:424
size_t entry
The head index of the queue.
Definition: rpl_rli_pdb.h:255
bool full() const
Definition: rpl_rli_pdb.h:311
bool inited_queue
Definition: rpl_rli_pdb.h:260
Prealloced_array< Element_type, 1 > m_Q
Definition: rpl_rli_pdb.h:239
bool de_tail(Element_type *item)
Similar to de_queue but extracting happens from the tail side.
Definition: rpl_rli_pdb.h:445
~circular_buffer_queue()=default
Class that intends to be a dummy end point for worker metrics.
Definition: dummy_worker_metrics.h:34
This class contains metrics transaction execution in replica MTA workers.
Definition: mta_worker_metrics.h:34
Abstract class for classes that contain metrics related to transaction execution in applier workers.
Definition: worker_metrics.h:34
virtual void inc_transaction_ongoing_progress_size(int64_t amount)=0
increment the executed size of the ongoing transaction.
unsigned long get_product_version() const
This method is used to find out the version of server that originated the current FD instance.
Definition: control_events.cpp:167
const int64_t SEQ_UNINIT
Uninitialized timestamp value (for either last committed or sequence number).
Definition: binlog_event.h:150
void my_error(int nr, myf MyFlags,...)
Fill in and print a previously registered error message.
Definition: my_error.cc:217
#define MTS_WORKER_UNDEF
Definition: rpl_replica.h:91
unsigned int PSI_mutex_key
Instrumented mutex key.
Definition: psi_mutex_bits.h:52
static constexpr unsigned PSI_INSTRUMENT_ME
Definition: psi_bits.h:43
Binary log event definitions.
Header for compiler-dependent features.
#define DBUG_PRINT(keyword, arglist)
Definition: my_dbug.h:181
#define DBUG_TRACE
Definition: my_dbug.h:146
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
long long int longlong
Definition: my_inttypes.h:55
#define MYF(v)
Definition: my_inttypes.h:97
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
void my_free(void *ptr)
Frees the memory pointed by the ptr.
Definition: my_memory.cc:81
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
#define HAVE_PSI_INTERFACE
Definition: my_psi_config.h:39
Instrumentation helpers for conditions.
ABI for instrumented mutexes.
struct MasterPos master_pos
std::string format(const routing_guidelines::Session_info &session_info, bool extended_session_info)
Definition: dest_metadata_cache.cc:170
bool load(THD *, const dd::String_type &fname, dd::String_type *buf)
Read an sdi file from disk and store in a buffer.
Definition: sdi_file.cc:308
bool empty(const Histogram &histogram)
Return true if 'histogram' was built on an empty table.
Definition: histogram.h:693
std::chrono::seconds seconds
Definition: authorize_manager.cc:68
ValueType max(X &&first)
Definition: gtid.h:103
Performance schema instrumentation interface.
Instrumentation helpers for mutexes.
required uint32 status
Definition: replication_asynchronous_connection_failover.proto:61
required string event
Definition: replication_group_member_actions.proto:32
enum_mts_parallel_type
Definition: rpl_mta_submode.h:47
TABLE * mts_move_temp_tables_to_thd(THD *, TABLE *)
Relocation of the list of temporary tables to thd->temporary_tables.
Definition: rpl_rli_pdb.cc:728
Slave_worker * get_least_occupied_worker(Relay_log_info *rli, Slave_worker_array *workers, Log_event *ev)
Legends running throughout the module:
Definition: rpl_rli_pdb.cc:758
bool set_max_updated_index_on_stop(Slave_worker *worker, Slave_job_item *job_item)
This function is called by both coordinator and workers.
Definition: rpl_rli_pdb.cc:172
Slave_worker * get_thd_worker(const THD *thd)
Definition: rpl_rli_pdb.h:996
ulong w_rr
Definition: rpl_rli_pdb.cc:81
int slave_worker_exec_job_group(Slave_worker *w, Relay_log_info *rli)
apply one job group.
Definition: rpl_rli_pdb.cc:1961
bool handle_slave_worker_stop(Slave_worker *worker, Slave_job_item *job_item)
This function is called by both coordinator and workers.
Definition: rpl_rli_pdb.cc:108
bool append_item_to_jobs(slave_job_item *job_item, Slave_worker *w, Relay_log_info *rli)
Coordinator enqueues a job item into a Worker private queue.
Definition: rpl_rli_pdb.cc:1616
This struct represents a specification of a GTID for a statement to be executed: either "AUTOMATIC",...
Definition: rpl_gtid.h:3999
Definition: my_bitmap.h:43
Definition: rpl_rli_pdb.h:80
Slave_job_group()=default
my_off_t master_log_pos
Definition: rpl_rli_pdb.h:159
my_off_t checkpoint_log_pos
Definition: rpl_rli_pdb.h:162
Format_description_log_event * new_fd_event
Definition: rpl_rli_pdb.h:201
Slave_job_group(const Slave_job_group &other)
Definition: rpl_rli_pdb.h:87
bool notified
Definition: rpl_rli_pdb.h:171
time_t ts
Definition: rpl_rli_pdb.h:169
longlong last_committed
Definition: rpl_rli_pdb.h:174
std::atomic< int32 > done
Definition: rpl_rli_pdb.h:167
Slave_job_group & operator=(const Slave_job_group &other)
Definition: rpl_rli_pdb.h:112
Slave_worker * worker
Definition: rpl_rli_pdb.h:156
my_off_t checkpoint_relay_log_pos
Definition: rpl_rli_pdb.h:165
ulong worker_id
Definition: rpl_rli_pdb.h:155
uint checkpoint_seqno
Definition: rpl_rli_pdb.h:161
void reset(my_off_t master_pos, ulonglong seqno)
Definition: rpl_rli_pdb.h:206
my_off_t group_master_log_pos
Definition: rpl_rli_pdb.h:142
char * group_master_log_name
Definition: rpl_rli_pdb.h:138
char * checkpoint_log_name
Definition: rpl_rli_pdb.h:163
ulong shifted
Definition: rpl_rli_pdb.h:168
longlong sequence_number
Definition: rpl_rli_pdb.h:175
char * checkpoint_relay_log_name
Definition: rpl_rli_pdb.h:166
char * group_relay_log_name
Definition: rpl_rli_pdb.h:153
ulonglong total_seqno
Definition: rpl_rli_pdb.h:157
my_off_t group_relay_log_pos
Definition: rpl_rli_pdb.h:154
Definition: table.h:1435
Definition: completion_hash.h:35
static bool is_any_gtid_event(const Log_event_type &type)
Helps to identify any GTID event - returns true for GTID_LOG_EVENT, GTID_TAGGED_LOG_EVENT and ANONYMO...
Definition: binlog_event.h:391
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
Include file for Sun RPC to compile out of the box.
int n
Definition: xcom_base.cc:509