MySQL 9.5.0
Source Code Documentation
rpl_mta_submode.h
Go to the documentation of this file.
1/* Copyright (c) 2013, 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#ifndef MTA_SUBMODE_H
24#define MTA_SUBMODE_H
25
26#include <stddef.h>
27#include <sys/types.h>
28#include <atomic>
29#include <set>
30#include <utility>
31
32#include "log_event.h"
33#include "my_inttypes.h"
34#include "my_thread_local.h" // my_thread_id
35#include "mysql/binlog/event/binlog_event.h" // SEQ_UNINIT
36#include "prealloced_array.h" // Prealloced_array
37
38class Log_event;
39class Query_log_event;
40class Relay_log_info;
41class Slave_worker;
42class THD;
43struct TABLE;
44
46
48 /* Parallel slave based on Database name */
49 /* MTS_PARALLEL_TYPE_DB_NAME = 0, */ /* UNUSED, REMOVED */
50 /* Parallel slave based on group information from Binlog group commit */
52};
53
54// Extend the following class as per requirement for each sub mode
56 private:
57 protected:
58 /* Parallel type */
60
61 public:
62 Mts_submode() = default;
64 // pure virtual methods. Should be extended in the derieved class
65
66 /* Logic to schedule the next event. called at the B event for each
67 transaction */
68 virtual int schedule_next_event(Relay_log_info *rli, Log_event *ev) = 0;
69
70 /* logic to attach temp tables Should be extended in the derieved class */
71 virtual void attach_temp_tables(THD *thd, const Relay_log_info *rli,
72 Query_log_event *ev) = 0;
73
74 /* logic to detach temp tables. Should be extended in the derieved class */
75 virtual void detach_temp_tables(THD *thd, const Relay_log_info *rli,
76 Query_log_event *ev) = 0;
77
78 /* returns the least occupied worker. Should be extended in the derieved class
79 */
82 Log_event *ev) = 0;
83 /* wait for slave workers to finish */
85 Slave_worker *ignore = nullptr) = 0;
86
87 /// @brief indicates the start of new file, which may e.g. update internal
88 /// counters in the submode
90
91 /**
92 Sets additional context before the event is set to execute.
93 */
95 Log_event &) {
96 return false;
97 }
98
99 virtual ~Mts_submode() = default;
100};
101
102/**
103 Parallelization using Master parallelization information
104 For significance of each method check definition of Mts_submode
105 */
107 private:
111 /* "instant" value of committed transactions low-water-mark */
112 std::atomic<longlong> last_lwm_timestamp;
113 /* GAQ index corresponding to the min commit point */
117
118 public:
121 /*
122 the logical timestamp of the olderst transaction that is being waited by
123 before to resume scheduling.
124 */
125 std::atomic<longlong> min_waited_timestamp;
126 /*
127 Committed transactions and those that are waiting for their commit parents
128 comprise sequences whose items are identified as GAQ index.
129 An empty sequence is described by the following magic value which can't
130 be in the GAQ legitimate range.
131 todo: an alternative could be to pass a magic value to the constructor.
132 E.g GAQ.size as a good candidate being outside of the valid range.
133 That requires further wl6314 refactoring in activation/deactivation
134 of the scheduler.
135 */
136 static const ulong INDEX_UNDEF = (ulong)-1;
137
138 protected:
139 std::pair<uint, my_thread_id> get_server_and_thread_id(TABLE *table);
141
142 public:
144 int schedule_next_event(Relay_log_info *rli, Log_event *ev) override;
145 void attach_temp_tables(THD *thd, const Relay_log_info *rli,
146 Query_log_event *ev) override;
147 void detach_temp_tables(THD *thd, const Relay_log_info *rli,
148 Query_log_event *) override;
151 Log_event *ev) override;
152 /* Sets the force new group variable */
153 inline void start_new_group() { force_new_group = true; }
154
155 /// @brief Sets a flag to indicate that we are starting a new binlog file,
156 /// therefore we need to skip the check for logical clock to not compare
157 /// against sequence_number from previous event (previous file)
158 void indicate_start_of_new_file() override { first_event = true; }
159 /**
160 Withdraw the delegated_job increased by the group.
161 */
164 Slave_worker *ignore = nullptr) override;
166 longlong last_committed_arg);
167 /*
168 LEQ comparison of two logical timestamps follows regular rules for
169 integers. SEQ_UNINIT is regarded as the least value in the clock domain.
170
171 @param a the lhs logical timestamp value
172 @param b the rhs logical timestamp value
173
174 @return true when a "<=" b,
175 false otherwise
176 */
177 static bool clock_leq(longlong a, longlong b) {
178 if (a == SEQ_UNINIT)
179 return true;
180 else if (b == SEQ_UNINIT)
181 return false;
182 else
183 return a <= b;
184 }
185
186 longlong get_lwm_timestamp(Relay_log_info *rli, bool need_lock);
188 ~Mts_submode_logical_clock() override = default;
189};
190
191#endif /*MTA_SUBMODE_H*/
Contains the classes representing events occurring in the replication stream.
This is the abstract base class for binary log events.
Definition: log_event.h:538
Parallelization using Master parallelization information For significance of each method check defini...
Definition: rpl_mta_submode.h:106
Slave_worker * get_free_worker(Relay_log_info *rli)
Protected method to fetch a worker having no events assigned.
Definition: rpl_mta_submode.cc:653
Slave_worker * get_least_occupied_worker(Relay_log_info *rli, Slave_worker_array *ws, Log_event *ev) override
Logic to get least occupied worker when the sql mts_submode= master_parallel.
Definition: rpl_mta_submode.cc:554
ulong last_lwm_index
Definition: rpl_mta_submode.h:114
bool first_event
Definition: rpl_mta_submode.h:108
longlong sequence_number
Definition: rpl_mta_submode.h:116
std::atomic< longlong > last_lwm_timestamp
Definition: rpl_mta_submode.h:112
void indicate_start_of_new_file() override
Sets a flag to indicate that we are starting a new binlog file, therefore we need to skip the check f...
Definition: rpl_mta_submode.h:158
bool wait_for_last_committed_trx(Relay_log_info *rli, longlong last_committed_arg)
The method implements logical timestamp conflict detection and resolution through waiting by the call...
Definition: rpl_mta_submode.cc:205
bool is_error
Definition: rpl_mta_submode.h:120
~Mts_submode_logical_clock() override=default
uint jobs_done
Definition: rpl_mta_submode.h:119
longlong last_committed
Definition: rpl_mta_submode.h:115
static const ulong INDEX_UNDEF
Definition: rpl_mta_submode.h:136
int schedule_next_event(Relay_log_info *rli, Log_event *ev) override
Does necessary arrangement before scheduling next event.
Definition: rpl_mta_submode.cc:263
static bool clock_leq(longlong a, longlong b)
Definition: rpl_mta_submode.h:177
longlong estimate_lwm_timestamp()
Definition: rpl_mta_submode.h:187
std::atomic< longlong > min_waited_timestamp
Definition: rpl_mta_submode.h:125
bool force_new_group
Definition: rpl_mta_submode.h:108
uint delegated_jobs
Definition: rpl_mta_submode.h:110
void withdraw_delegated_job()
Withdraw the delegated_job increased by the group.
Definition: rpl_mta_submode.h:162
void attach_temp_tables(THD *thd, const Relay_log_info *rli, Query_log_event *ev) override
Logic to attach the temporary tables from the worker threads upon event execution.
Definition: rpl_mta_submode.cc:475
void detach_temp_tables(THD *thd, const Relay_log_info *rli, Query_log_event *) override
Logic to detach the temporary tables from the worker threads upon event execution.
Definition: rpl_mta_submode.cc:528
Mts_submode_logical_clock()
Definition: rpl_mta_submode.cc:66
std::pair< uint, my_thread_id > get_server_and_thread_id(TABLE *table)
Protected method to fetch the server_id and pseudo_thread_id from a temporary table.
Definition: rpl_mta_submode.cc:718
longlong get_lwm_timestamp(Relay_log_info *rli, bool need_lock)
The method finds the minimum logical timestamp (low-water-mark) of committed transactions.
Definition: rpl_mta_submode.cc:123
bool is_new_group
Definition: rpl_mta_submode.h:109
void start_new_group()
Definition: rpl_mta_submode.h:153
int wait_for_workers_to_finish(Relay_log_info *rli, Slave_worker *ignore=nullptr) override
Waits for slave workers to finish off the pending tasks before returning.
Definition: rpl_mta_submode.cc:671
Definition: rpl_mta_submode.h:55
virtual ~Mts_submode()=default
virtual bool set_multi_threaded_applier_context(const Relay_log_info &, Log_event &)
Sets additional context before the event is set to execute.
Definition: rpl_mta_submode.h:94
enum_mts_parallel_type type
Definition: rpl_mta_submode.h:59
virtual void attach_temp_tables(THD *thd, const Relay_log_info *rli, Query_log_event *ev)=0
enum_mts_parallel_type get_type()
Definition: rpl_mta_submode.h:63
virtual void indicate_start_of_new_file()
indicates the start of new file, which may e.g.
Definition: rpl_mta_submode.h:89
virtual int schedule_next_event(Relay_log_info *rli, Log_event *ev)=0
virtual void detach_temp_tables(THD *thd, const Relay_log_info *rli, Query_log_event *ev)=0
virtual int wait_for_workers_to_finish(Relay_log_info *rli, Slave_worker *ignore=nullptr)=0
Mts_submode()=default
virtual Slave_worker * get_least_occupied_worker(Relay_log_info *rli, Slave_worker_array *ws, Log_event *ev)=0
A Query event is written to the binary log whenever the database is modified on the master,...
Definition: log_event.h:1291
Definition: rpl_rli.h:205
Definition: rpl_rli_pdb.h:468
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
const int64_t SEQ_UNINIT
Uninitialized timestamp value (for either last committed or sequence number).
Definition: binlog_event.h:150
Binary log event definitions.
Some integer typedefs for easier portability.
long long int longlong
Definition: my_inttypes.h:55
static bool ignore
Definition: mysqlimport.cc:70
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
Prealloced_array< Slave_worker *, 4 > Slave_worker_array
Definition: rpl_mta_submode.h:43
enum_mts_parallel_type
Definition: rpl_mta_submode.h:47
@ MTS_PARALLEL_TYPE_LOGICAL_CLOCK
Definition: rpl_mta_submode.h:51
Definition: table.h:1435