MySQL 8.3.0
Source Code Documentation
rpl_trx_tracking.h
Go to the documentation of this file.
1#ifndef RPL_TRX_TRACKING_INCLUDED
2/* Copyright (c) 2017, 2023, Oracle and/or its affiliates.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is also distributed with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have included with MySQL.
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#define RPL_TRX_TRACKING_INCLUDED
25
26#include <assert.h>
27#include <sys/types.h>
28#include <atomic>
29#include <map>
30
32
33#include "my_inttypes.h"
34
35class THD;
36
37/**
38 Logical timestamp generator for logical timestamping binlog transactions.
39 A transaction is associated with two sequence numbers see
40 @c Transaction_ctx::last_committed and @c Transaction_ctx::sequence_number.
41 The class provides necessary interfaces including that of
42 generating a next consecutive value for the latter.
43*/
45 private:
46 std::atomic<int64> state;
47 /*
48 Offset is subtracted from the actual "absolute time" value at
49 logging a replication event. That is the event holds logical
50 timestamps in the "relative" format. They are meaningful only in
51 the context of the current binlog.
52 The member is updated (incremented) per binary log rotation.
53 */
55
56 public:
59 : state(other.state.load()), offset(other.offset) {}
60
61 int64 step();
62 int64 set_if_greater(int64 new_val);
64 int64 get_offset() { return offset; }
65 /*
66 Updates the offset.
67 This operation is invoked when binlog rotates and at that time
68 there can't any concurrent step() callers so no need to guard
69 the assignment.
70 */
71 void update_offset(int64 new_offset) {
72 assert(offset <= new_offset);
73
74 offset = new_offset;
75 }
76 ~Logical_clock() = default;
77};
78
79/**
80 Generate logical timestamps for MTS using COMMIT_ORDER
81 in the binlog-transaction-dependency-tracking option.
82*/
84 public:
85 /**
86 Main function that gets the dependencies using the COMMIT_ORDER tracker.
87
88 @param [in] thd THD of the caller.
89 @param [in,out] sequence_number sequence_number initialized and returned.
90 @param [in,out] commit_parent commit_parent to be returned.
91 */
92 void get_dependency(THD *thd, int64 &sequence_number, int64 &commit_parent);
93
94 void update_max_committed(int64 sequence_number);
95
98 }
99
100 int64 step();
101 void rotate();
102
103 private:
104 /* Committed transactions timestamp */
106
107 /* "Prepared" transactions timestamp */
109
110 /*
111 Stores the last sequence_number of the transaction which breaks the rule of
112 lock based logical clock. commit_parent of the following transactions
113 will be set to m_last_blocking_transaction if their last_committed is
114 smaller than m_last_blocking_transaction.
115 */
117};
118
119/**
120 Generate logical timestamps for MTS using WRITESET
121 in the binlog-transaction-dependency-tracking option.
122*/
124 public:
125 Writeset_trx_dependency_tracker(ulong max_history_size)
126 : m_opt_max_history_size(max_history_size), m_writeset_history_start(0) {}
127
128 /**
129 Main function that gets the dependencies using the WRITESET tracker.
130
131 @param [in] thd THD of the caller.
132 @param [in,out] sequence_number sequence_number initialized and returned.
133 @param [in,out] commit_parent commit_parent to be returned.
134 */
135 void get_dependency(THD *thd, int64 &sequence_number, int64 &commit_parent);
136
137 void rotate(int64 start);
138
139 /* Atomic variable - opt_binlog_transaction_dependency_history_size */
140 std::atomic<ulong> m_opt_max_history_size;
141
142 private:
143 /*
144 Monitor the last transaction with write-set to use as the minimal
145 commit parent when logical clock source is WRITE_SET, i.e., the most recent
146 transaction that is not in the history, or 0 when the history is empty.
147
148 The m_writeset_history_start must to be set to 0 initially and whenever the
149 binlog_transaction_dependency_tracking variable is changed or the history
150 is cleared, so that it is updated to the first transaction for which the
151 dependencies are checked.
152 */
154
155 /*
156 Track the last transaction sequence number that changed each row
157 in the database, using row hashes from the writeset as the index.
158 */
159 typedef std::map<uint64, int64> Writeset_history;
161};
162
163/**
164 Generate logical timestamps for MTS using WRITESET_SESSION
165 in the binlog-transaction-dependency-tracking option.
166*/
168 public:
169 /**
170 Main function that gets the dependencies using the WRITESET_SESSION tracker.
171
172 @param [in] thd THD of the caller.
173 @param [in,out] sequence_number sequence_number initialized and returned.
174 @param [in,out] commit_parent commit_parent to be returned.
175 */
176 void get_dependency(THD *thd, int64 &sequence_number, int64 &commit_parent);
177};
178
179/**
180 Modes for parallel transaction dependency tracking
181*/
183 /**
184 Tracks dependencies based on the commit order of transactions.
185 The time intervals during which any transaction holds all its locks are
186 tracked (the interval ends just before storage engine commit, when locks
187 are released. For an autocommit transaction it begins just before storage
188 engine prepare. For BEGIN..COMMIT transactions it begins at the end of the
189 last statement before COMMIT). Two transactions are marked as
190 non-conflicting if their respective intervals overlap. In other words,
191 if trx1 appears before trx2 in the binlog, and trx2 had acquired all its
192 locks before trx1 released its locks, then trx2 is marked such that the
193 slave can schedule it in parallel with trx1.
194 */
196 /**
197 Tracks dependencies based on the set of rows updated. Any two transactions
198 that change disjoint sets of rows, are said concurrent and non-contending.
199 */
201 /**
202 Tracks dependencies based on the set of rows updated per session. Any two
203 transactions that change disjoint sets of rows, on different sessions,
204 are said concurrent and non-contending. Transactions from the same session
205 are always said to be dependent, i.e., are never concurrent and
206 non-contending.
207 */
210
211/**
212 Dependency tracker is a container singleton that dispatches between the three
213 methods associated with the binlog-transaction-dependency-tracking option.
214 There is a singleton instance of each of these classes.
215*/
217 public:
220 m_writeset(25000) {}
221
222 void get_dependency(THD *thd, int64 &sequence_number, int64 &commit_parent);
223
225
226 void update_max_committed(THD *thd);
228
229 int64 step();
230 void rotate();
231
232 public:
233 /* option opt_binlog_transaction_dependency_tracking */
235
237
238 private:
242};
243
244#endif /* RPL_TRX_TRACKING_INCLUDED */
Contains the classes representing events occurring in the replication stream.
Generate logical timestamps for MTS using COMMIT_ORDER in the binlog-transaction-dependency-tracking ...
Definition: rpl_trx_tracking.h:83
Logical_clock get_max_committed_transaction()
Definition: rpl_trx_tracking.h:96
void rotate()
Definition: rpl_trx_tracking.cc:180
int64 step()
Definition: rpl_trx_tracking.cc:176
int64 m_last_blocking_transaction
Definition: rpl_trx_tracking.h:116
void update_max_committed(int64 sequence_number)
Definition: rpl_trx_tracking.cc:187
void get_dependency(THD *thd, int64 &sequence_number, int64 &commit_parent)
Main function that gets the dependencies using the COMMIT_ORDER tracker.
Definition: rpl_trx_tracking.cc:145
Logical_clock m_max_committed_transaction
Definition: rpl_trx_tracking.h:105
Logical_clock m_transaction_counter
Definition: rpl_trx_tracking.h:108
Logical timestamp generator for logical timestamping binlog transactions.
Definition: rpl_trx_tracking.h:44
Logical_clock(const Logical_clock &other)
Definition: rpl_trx_tracking.h:58
int64 step()
Steps the absolute value of the clock (state) to return an updated value.
Definition: rpl_trx_tracking.cc:64
int64 set_if_greater(int64 new_val)
To try setting the clock forward.
Definition: rpl_trx_tracking.cc:82
void update_offset(int64 new_offset)
Definition: rpl_trx_tracking.h:71
std::atomic< int64 > state
Definition: rpl_trx_tracking.h:46
Logical_clock()
Definition: rpl_trx_tracking.cc:43
int64 offset
Definition: rpl_trx_tracking.h:54
int64 get_timestamp()
Atomically fetch the current state.
Definition: rpl_trx_tracking.cc:49
~Logical_clock()=default
int64 get_offset()
Definition: rpl_trx_tracking.h:64
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:35
Dependency tracker is a container singleton that dispatches between the three methods associated with...
Definition: rpl_trx_tracking.h:216
long m_opt_tracking_mode
Definition: rpl_trx_tracking.h:234
Writeset_session_trx_dependency_tracker m_writeset_session
Definition: rpl_trx_tracking.h:241
Transaction_dependency_tracker()
Definition: rpl_trx_tracking.h:218
void rotate()
Definition: rpl_trx_tracking.cc:385
Commit_order_trx_dependency_tracker m_commit_order
Definition: rpl_trx_tracking.h:240
void update_max_committed(THD *thd)
The method is to be executed right before committing time.
Definition: rpl_trx_tracking.cc:370
void get_dependency(THD *thd, int64 &sequence_number, int64 &commit_parent)
Get the dependencies in a transaction, the main entry point for the dependency tracking work.
Definition: rpl_trx_tracking.cc:323
Writeset_trx_dependency_tracker m_writeset
Definition: rpl_trx_tracking.h:239
int64 get_max_committed_timestamp()
Definition: rpl_trx_tracking.cc:395
int64 step()
Definition: rpl_trx_tracking.cc:383
void tracking_mode_changed()
Definition: rpl_trx_tracking.cc:350
Writeset_trx_dependency_tracker * get_writeset()
Definition: rpl_trx_tracking.h:236
Generate logical timestamps for MTS using WRITESET_SESSION in the binlog-transaction-dependency-track...
Definition: rpl_trx_tracking.h:167
void get_dependency(THD *thd, int64 &sequence_number, int64 &commit_parent)
Main function that gets the dependencies using the WRITESET_SESSION tracker.
Definition: rpl_trx_tracking.cc:307
Generate logical timestamps for MTS using WRITESET in the binlog-transaction-dependency-tracking opti...
Definition: rpl_trx_tracking.h:123
void rotate(int64 start)
Definition: rpl_trx_tracking.cc:292
void get_dependency(THD *thd, int64 &sequence_number, int64 &commit_parent)
Main function that gets the dependencies using the WRITESET tracker.
Definition: rpl_trx_tracking.cc:208
Writeset_trx_dependency_tracker(ulong max_history_size)
Definition: rpl_trx_tracking.h:125
std::map< uint64, int64 > Writeset_history
Definition: rpl_trx_tracking.h:159
Writeset_history m_writeset_history
Definition: rpl_trx_tracking.h:160
std::atomic< ulong > m_opt_max_history_size
Definition: rpl_trx_tracking.h:140
int64 m_writeset_history_start
Definition: rpl_trx_tracking.h:153
const int64_t SEQ_UNINIT
Uninitialized timestamp value (for either last committed or sequence number).
Definition: binlog_event.h:157
static void start(mysql_harness::PluginFuncEnv *env)
Definition: http_auth_backend_plugin.cc:176
Some integer typedefs for easier portability.
int64_t int64
Definition: my_inttypes.h:67
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:307
enum_binlog_transaction_dependency_tracking
Modes for parallel transaction dependency tracking.
Definition: rpl_trx_tracking.h:182
@ DEPENDENCY_TRACKING_WRITESET_SESSION
Tracks dependencies based on the set of rows updated per session.
Definition: rpl_trx_tracking.h:208
@ DEPENDENCY_TRACKING_COMMIT_ORDER
Tracks dependencies based on the commit order of transactions.
Definition: rpl_trx_tracking.h:195
@ DEPENDENCY_TRACKING_WRITESET
Tracks dependencies based on the set of rows updated.
Definition: rpl_trx_tracking.h:200