MySQL  8.0.18
Source Code Documentation
rpl_info.h
Go to the documentation of this file.
1 /* Copyright (c) 2010, 2019, Oracle and/or its affiliates. All rights reserved.
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 
38 class THD;
39 
40 #define CHANNEL_NAME_LENGTH NAME_LEN
41 
43  public:
44  virtual ~Rpl_info();
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 DBUG_OFF
86 #endif
87 
88  /**
89  Sets the persistency component/handler.
90 
91  @param[in] param_handler Pointer to the handler.
92  */
93  void set_rpl_info_handler(Rpl_info_handler *param_handler) {
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 
142  virtual bool set_info_search_keys(Rpl_info_handler *to) = 0;
143 
144  protected:
145  /**
146  Pointer to the repository's handler.
147  */
149 
150  /**
151  Uniquely and internaly 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 anymore required 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  */
168  char channel[CHANNEL_NAME_LENGTH + 1] = {0};
169 
170  Rpl_info(const char *type,
171 #ifdef HAVE_PSI_INTERFACE
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 
187  Rpl_info(const Rpl_info &info);
188  Rpl_info &operator=(const Rpl_info &info);
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 */
PSI_mutex_key * key_info_sleep_cond
Definition: rpl_info.h:73
bool copy_info(Rpl_info_handler *from, Rpl_info_handler *to)
Definition: rpl_info.h:120
mysql_cond_t stop_cond
Definition: rpl_info.h:67
virtual bool read_info(Rpl_info_handler *from)=0
bool is_transactional() const
Definition: rpl_info.h:110
An instrumented cond structure.
Definition: mysql_cond_bits.h:49
int clean_info()
Definition: rpl_info.h:108
Definition: rpl_info_handler.h:56
Some integer typedefs for easier portability.
mysql_mutex_t run_lock
Definition: rpl_info.h:57
mysql_cond_t data_cond
Definition: rpl_info.h:67
std::atomic< ulong > slave_run_id
Definition: rpl_info.h:82
Mix-in to handle the message logging and reporting for relay log info and master log info structures...
Definition: rpl_reporting.h:52
int events_until_exit
Definition: rpl_info.h:85
uint internal_id
Uniquely and internaly identifies an info entry (.e.g.
Definition: rpl_info.h:162
Rpl_info & operator=(const Rpl_info &info)
Definition: task.h:430
The handler class is the interface for dynamically loadable storage engines.
Definition: handler.h:4009
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
THD * info_thd
Definition: rpl_info.h:77
std::atomic< bool > atomic_is_stopping
Definition: rpl_info.h:192
PSI_mutex_key * key_info_sleep_lock
Definition: rpl_info.h:70
Instrumentation helpers for conditions.
char * get_channel() const
Definition: rpl_info.h:128
unsigned int PSI_mutex_key
Instrumented mutex key.
Definition: psi_mutex_bits.h:49
Common definition between mysql server & client.
bool inited
Definition: rpl_info.h:79
Definition: rpl_info.h:42
PSI_mutex_key * key_info_start_cond
Definition: rpl_info.h:73
mysql_cond_t sleep_cond
Definition: rpl_info.h:67
Rpl_info_handler * handler
Pointer to the repository&#39;s handler.
Definition: rpl_info.h:148
virtual ~Rpl_info()
Definition: rpl_info.cc:87
mysql_mutex_t sleep_lock
Definition: rpl_info.h:57
char channel[CHANNEL_NAME_LENGTH+1]
Every slave info object acts on a particular channel in Multisource Replication.
Definition: rpl_info.h:168
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
unsigned int uint
Definition: uca-dump.cc:29
mysql_mutex_t data_lock
Definition: rpl_info.h:57
virtual bool write_info(Rpl_info_handler *to)=0
PSI_mutex_key * key_info_stop_cond
Definition: rpl_info.h:73
Instrumentation helpers for mutexes.
PSI_mutex_key * key_info_data_cond
Definition: rpl_info.h:73
void set_rpl_info_handler(Rpl_info_handler *param_handler)
Sets the persistency component/handler.
Definition: rpl_info.h:93
#define HAVE_PSI_INTERFACE
Definition: my_psi_config.h:38
char * get_description_info() const
Definition: rpl_info.h:116
std::atomic< bool > abort_slave
Definition: rpl_info.h:80
int type
Definition: http_common.h:411
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:49
mysql_cond_t start_cond
Definition: rpl_info.h:67
enum_return_check
Definition: rpl_info_handler.h:50
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 ...
PSI_mutex_key * key_info_run_lock
Definition: rpl_info.h:70
ABI for instrumented mutexes.
int remove_info()
Definition: rpl_info.h:106
PSI_mutex_key * key_info_thd_lock
Definition: rpl_info.h:70
mysql_mutex_t info_thd_lock
Definition: rpl_info.h:57
uint get_internal_id() const
Definition: rpl_info.h:126
Log info(cout, "NOTE")
#define CHANNEL_NAME_LENGTH
Definition: rpl_info.h:40
Rpl_info_handler * get_rpl_info_handler()
Gets the persistency component/handler.
Definition: rpl_info.h:102
std::atomic< uint > slave_running
Definition: rpl_info.h:81
PSI_mutex_key * key_info_data_lock
Definition: rpl_info.h:70
enum_return_check check_info() const
Definition: rpl_info.h:104
bool update_is_transactional()
Definition: rpl_info.h:112
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_class.h:778