MySQL 8.1.0
Source Code Documentation
rpl_info.h
Go to the documentation of this file.
1/* Copyright (c) 2010, 2023, 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 also distributed 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 included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23#ifndef RPL_INFO_H
24#define RPL_INFO_H
25
26#include <sys/types.h>
27#include <atomic>
28
29#include "my_inttypes.h"
30#include "my_psi_config.h"
34#include "mysql_com.h" // NAME_LEN
35#include "sql/rpl_info_handler.h" // Rpl_info_handler
36#include "sql/rpl_reporting.h" // Slave_reporting_capability
37
38class THD;
39
40#define CHANNEL_NAME_LENGTH NAME_LEN
41
43 public:
44 ~Rpl_info() override;
45
46 /*
47 standard lock acquisition order to avoid deadlocks:
48 run_lock, data_lock, relay_log.LOCK_log, relay_log.LOCK_index
49 run_lock, sleep_lock
50 run_lock, info_thd_lock
51
52 info_thd_lock is to protect operations on info_thd:
53 - before *reading* info_thd we must hold *either* info_thd_lock or
54 run_lock;
55 - before *writing* we must hold *both* run_lock and info_thd_lock.
56 */
58 /*
59 start_cond is broadcast when SQL thread is started
60 stop_cond - when stopped
61 data_cond - when data protected by data_lock changes
62 sleep_cond - when killed
63
64 'data_cond' is only being used in class Relay_log_info and not in the
65 class Master_info. So 'data_cond' could be moved to Relay_log_info.
66 */
68
69#ifdef HAVE_PSI_INTERFACE
72
75#endif
76
78
79 bool inited;
80 std::atomic<bool> abort_slave;
81 std::atomic<uint> slave_running;
82 std::atomic<ulong> slave_run_id;
83
84#ifndef NDEBUG
86#endif
87
88 /**
89 Sets the persistency component/handler.
90
91 @param[in] param_handler Pointer to the handler.
92 */
94 handler = param_handler;
95 }
96
97 /**
98 Gets the persistency component/handler.
99
100 @return the handler if there is one.
101 */
103
104 enum_return_check check_info() const { return (handler->check_info()); }
105
106 int remove_info() { return (handler->remove_info()); }
107
108 int clean_info() { return (handler->clean_info()); }
109
110 bool is_transactional() const { return (handler->is_transactional()); }
111
113 return (handler->update_is_transactional());
114 }
115
116 char *get_description_info() const {
117 return (handler->get_description_info());
118 }
119
121 if (read_info(from) || write_info(to)) return (true);
122
123 return (false);
124 }
125
126 uint get_internal_id() const { return internal_id; }
127
128 char *get_channel() const { return const_cast<char *>(channel); }
129
130 /**
131 To search in the slave repositories, each slave info object
132 (mi, rli or worker) should use a primary key. This function
133 sets the field values of the slave info objects with
134 the search information, which is nothing but PK in mysql slave
135 info tables.
136 Ex: field_value[23]="channel_name" in the master info
137 object.
138
139 Currently, used only for TABLE repository.
140 */
141
143
144 protected:
145 /**
146 Pointer to the repository's handler.
147 */
149
150 /**
151 Uniquely and internally identifies an info entry (.e.g. a row or
152 file). This information is completely transparent to users and
153 is used only during startup to retrieve information from the
154 repositories.
155
156 @todo, This is not required any longer for Master_info and
157 Relay_log_info, since Channel can be used to uniquely
158 identify this. To preserve backward compatibility,
159 we keep this for Master_info and Relay_log_info.
160 However, {id, channel} is still required for a worker info.
161 */
163
164 /**
165 Every slave info object acts on a particular channel in Multisource
166 Replication.
167 */
169
170 Rpl_info(const char *type,
172 PSI_mutex_key *param_key_info_run_lock,
173 PSI_mutex_key *param_key_info_data_lock,
174 PSI_mutex_key *param_key_info_sleep_lock,
175 PSI_mutex_key *param_key_info_thd_lock,
176 PSI_mutex_key *param_key_info_data_cond,
177 PSI_mutex_key *param_key_info_start_cond,
178 PSI_mutex_key *param_key_info_stop_cond,
179 PSI_mutex_key *param_key_info_sleep_cond,
180#endif
181 uint param_id, const char *param_channel);
182
183 private:
184 virtual bool read_info(Rpl_info_handler *from) = 0;
185 virtual bool write_info(Rpl_info_handler *to) = 0;
186
189
190 public:
191 /* True when the thread is still running, but started the stop procedure */
192 std::atomic<bool> atomic_is_stopping{false};
193};
194#endif /* RPL_INFO_H */
Definition: rpl_info_handler.h:57
Definition: rpl_info.h:42
PSI_mutex_key * key_info_sleep_cond
Definition: rpl_info.h:74
virtual bool set_info_search_keys(Rpl_info_handler *to)=0
To search in the slave repositories, each slave info object (mi, rli or worker) should use a primary ...
char * get_description_info() const
Definition: rpl_info.h:116
Rpl_info_handler * handler
Pointer to the repository's handler.
Definition: rpl_info.h:148
Rpl_info(const char *type, 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_info.cc:30
~Rpl_info() override
Definition: rpl_info.cc:87
Rpl_info & operator=(const Rpl_info &info)
std::atomic< bool > abort_slave
Definition: rpl_info.h:80
void set_rpl_info_handler(Rpl_info_handler *param_handler)
Sets the persistency component/handler.
Definition: rpl_info.h:93
PSI_mutex_key * key_info_sleep_lock
Definition: rpl_info.h:70
uint internal_id
Uniquely and internally identifies an info entry (.e.g.
Definition: rpl_info.h:162
virtual bool read_info(Rpl_info_handler *from)=0
bool inited
Definition: rpl_info.h:79
mysql_cond_t sleep_cond
Definition: rpl_info.h:67
mysql_mutex_t info_thd_lock
Definition: rpl_info.h:57
char * get_channel() const
Definition: rpl_info.h:128
bool copy_info(Rpl_info_handler *from, Rpl_info_handler *to)
Definition: rpl_info.h:120
mysql_cond_t start_cond
Definition: rpl_info.h:67
std::atomic< bool > atomic_is_stopping
Definition: rpl_info.h:192
int remove_info()
Definition: rpl_info.h:106
PSI_mutex_key * key_info_run_lock
Definition: rpl_info.h:70
std::atomic< ulong > slave_run_id
Definition: rpl_info.h:82
Rpl_info(const Rpl_info &info)
PSI_mutex_key * key_info_stop_cond
Definition: rpl_info.h:73
Rpl_info_handler * get_rpl_info_handler()
Gets the persistency component/handler.
Definition: rpl_info.h:102
mysql_mutex_t sleep_lock
Definition: rpl_info.h:57
bool update_is_transactional()
Definition: rpl_info.h:112
mysql_cond_t data_cond
Definition: rpl_info.h:67
PSI_mutex_key * key_info_start_cond
Definition: rpl_info.h:73
mysql_mutex_t run_lock
Definition: rpl_info.h:57
uint get_internal_id() const
Definition: rpl_info.h:126
mysql_mutex_t data_lock
Definition: rpl_info.h:57
bool is_transactional() const
Definition: rpl_info.h:110
mysql_cond_t stop_cond
Definition: rpl_info.h:67
PSI_mutex_key * key_info_data_lock
Definition: rpl_info.h:70
PSI_mutex_key * key_info_thd_lock
Definition: rpl_info.h:71
char channel[CHANNEL_NAME_LENGTH+1]
Every slave info object acts on a particular channel in Multisource Replication.
Definition: rpl_info.h:168
PSI_mutex_key * key_info_data_cond
Definition: rpl_info.h:73
std::atomic< uint > slave_running
Definition: rpl_info.h:81
int events_until_exit
Definition: rpl_info.h:85
THD * info_thd
Definition: rpl_info.h:77
int clean_info()
Definition: rpl_info.h:108
enum_return_check check_info() const
Definition: rpl_info.h:104
virtual bool write_info(Rpl_info_handler *to)=0
Mix-in to handle the message logging and reporting for relay log info and master log info structures.
Definition: rpl_reporting.h:52
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:33
The handler class is the interface for dynamically loadable storage engines.
Definition: handler.h:4460
unsigned int PSI_mutex_key
Instrumented mutex key.
Definition: psi_mutex_bits.h:51
Some integer typedefs for easier portability.
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
#define HAVE_PSI_INTERFACE
Definition: my_psi_config.h:38
Common definition between mysql server & client.
Instrumentation helpers for conditions.
ABI for instrumented mutexes.
Log info(cout, "NOTE")
Instrumentation helpers for mutexes.
required string type
Definition: replication_group_member_actions.proto:33
#define CHANNEL_NAME_LENGTH
Definition: rpl_info.h:40
enum_return_check
Definition: rpl_info_handler.h:50
Definition: task.h:426
An instrumented cond structure.
Definition: mysql_cond_bits.h:49
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:49