MySQL 9.0.0
Source Code Documentation
rpl_mta_submode.h
Go to the documentation of this file.
1/* Copyright (c) 2013, 2024, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23#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 */
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 DB partitioned submode
104 For significance of each method check definition of Mts_submode
105*/
107 public:
109 int schedule_next_event(Relay_log_info *rli, Log_event *ev) override;
110 void attach_temp_tables(THD *thd, const Relay_log_info *rli,
111 Query_log_event *ev) override;
112 void detach_temp_tables(THD *thd, const Relay_log_info *rli,
113 Query_log_event *ev) override;
116 Log_event *) override;
117 ~Mts_submode_database() override = default;
119 Slave_worker *ignore = nullptr) override;
121 Log_event &ev) override;
122
123 private:
126 Transaction_payload_log_event &tple, std::vector<Log_event *> &events);
127};
128
129/**
130 Parallelization using Master parallelization information
131 For significance of each method check definition of Mts_submode
132 */
134 private:
138 /* "instant" value of committed transactions low-water-mark */
139 std::atomic<longlong> last_lwm_timestamp;
140 /* GAQ index corresponding to the min commit point */
144
145 public:
148 /*
149 the logical timestamp of the olderst transaction that is being waited by
150 before to resume scheduling.
151 */
152 std::atomic<longlong> min_waited_timestamp;
153 /*
154 Committed transactions and those that are waiting for their commit parents
155 comprise sequences whose items are identified as GAQ index.
156 An empty sequence is described by the following magic value which can't
157 be in the GAQ legitimate range.
158 todo: an alternative could be to pass a magic value to the constructor.
159 E.g GAQ.size as a good candidate being outside of the valid range.
160 That requires further wl6314 refactoring in activation/deactivation
161 of the scheduler.
162 */
163 static const ulong INDEX_UNDEF = (ulong)-1;
164
165 protected:
166 std::pair<uint, my_thread_id> get_server_and_thread_id(TABLE *table);
168
169 public:
171 int schedule_next_event(Relay_log_info *rli, Log_event *ev) override;
172 void attach_temp_tables(THD *thd, const Relay_log_info *rli,
173 Query_log_event *ev) override;
174 void detach_temp_tables(THD *thd, const Relay_log_info *rli,
175 Query_log_event *) override;
178 Log_event *ev) override;
179 /* Sets the force new group variable */
180 inline void start_new_group() { force_new_group = true; }
181
182 /// @brief Sets a flag to indicate that we are starting a new binlog file,
183 /// therefore we need to skip the check for logical clock to not compare
184 /// against sequence_number from previous event (previous file)
185 void indicate_start_of_new_file() override { first_event = true; }
186 /**
187 Withdraw the delegated_job increased by the group.
188 */
191 Slave_worker *ignore = nullptr) override;
193 longlong last_committed_arg);
194 /*
195 LEQ comparison of two logical timestamps follows regular rules for
196 integers. SEQ_UNINIT is regarded as the least value in the clock domain.
197
198 @param a the lhs logical timestamp value
199 @param b the rhs logical timestamp value
200
201 @return true when a "<=" b,
202 false otherwise
203 */
204 static bool clock_leq(longlong a, longlong b) {
205 if (a == SEQ_UNINIT)
206 return true;
207 else if (b == SEQ_UNINIT)
208 return false;
209 else
210 return a <= b;
211 }
212
213 longlong get_lwm_timestamp(Relay_log_info *rli, bool need_lock);
215 ~Mts_submode_logical_clock() override = default;
216};
217
218#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
DB partitioned submode For significance of each method check definition of Mts_submode.
Definition: rpl_mta_submode.h:106
Mts_submode_database()
Definition: rpl_mta_submode.h:108
void detach_temp_tables(THD *thd, const Relay_log_info *rli, Query_log_event *ev) override
Logic to detach the temporary tables from the worker threads upon event execution.
Definition: rpl_mta_submode.cc:276
bool unfold_transaction_payload_event(mysql::binlog::event::Format_description_event &fde, Transaction_payload_log_event &tple, std::vector< Log_event * > &events)
void attach_temp_tables(THD *thd, const Relay_log_info *rli, Query_log_event *ev) override
Logic to attach temporary tables.
Definition: rpl_mta_submode.cc:78
~Mts_submode_database() override=default
int wait_for_workers_to_finish(Relay_log_info *rli, Slave_worker *ignore=nullptr) override
Function is called by Coordinator when it identified an event requiring sequential execution.
Definition: rpl_mta_submode.cc:120
Slave_worker * get_least_occupied_worker(Relay_log_info *, Slave_worker_array *ws, Log_event *) override
Logic to get least occupied worker when the sql mts_submode= database.
Definition: rpl_mta_submode.cc:350
bool set_multi_threaded_applier_context(const Relay_log_info &rli, Log_event &ev) override
Sets additional context before the event is set to execute.
Definition: rpl_mta_submode.cc:190
int schedule_next_event(Relay_log_info *rli, Log_event *ev) override
Does necessary arrangement before scheduling next event.
Definition: rpl_mta_submode.cc:70
Parallelization using Master parallelization information For significance of each method check defini...
Definition: rpl_mta_submode.h:133
Slave_worker * get_free_worker(Relay_log_info *rli)
Protected method to fetch a worker having no events assigned.
Definition: rpl_mta_submode.cc:969
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:865
ulong last_lwm_index
Definition: rpl_mta_submode.h:141
bool first_event
Definition: rpl_mta_submode.h:135
longlong sequence_number
Definition: rpl_mta_submode.h:143
std::atomic< longlong > last_lwm_timestamp
Definition: rpl_mta_submode.h:139
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:185
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:519
bool is_error
Definition: rpl_mta_submode.h:147
~Mts_submode_logical_clock() override=default
uint jobs_done
Definition: rpl_mta_submode.h:146
longlong last_committed
Definition: rpl_mta_submode.h:142
static const ulong INDEX_UNDEF
Definition: rpl_mta_submode.h:163
int schedule_next_event(Relay_log_info *rli, Log_event *ev) override
Does necessary arrangement before scheduling next event.
Definition: rpl_mta_submode.cc:578
static bool clock_leq(longlong a, longlong b)
Definition: rpl_mta_submode.h:204
longlong estimate_lwm_timestamp()
Definition: rpl_mta_submode.h:214
std::atomic< longlong > min_waited_timestamp
Definition: rpl_mta_submode.h:152
bool force_new_group
Definition: rpl_mta_submode.h:135
uint delegated_jobs
Definition: rpl_mta_submode.h:137
void withdraw_delegated_job()
Withdraw the delegated_job increased by the group.
Definition: rpl_mta_submode.h:189
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:786
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:839
Mts_submode_logical_clock()
Definition: rpl_mta_submode.cc:380
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:1034
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:437
bool is_new_group
Definition: rpl_mta_submode.h:136
void start_new_group()
Definition: rpl_mta_submode.h:180
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:987
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:1285
Definition: rpl_rli.h:203
Definition: rpl_rli_pdb.h:498
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Definition: log_event.h:3869
For binlog version 4.
Definition: control_events.h:239
const int64_t SEQ_UNINIT
Uninitialized timestamp value (for either last committed or sequence number).
Definition: binlog_event.h:158
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
@ MTS_PARALLEL_TYPE_DB_NAME
Definition: rpl_mta_submode.h:49
Definition: table.h:1407