MySQL  8.0.22
Source Code Documentation
clone_handler.h
Go to the documentation of this file.
1 /* Copyright (c) 2017, 2020, 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 /**
24 @file clone_handler.h
25 Clone handler interface to access clone plugin
26 */
27 
28 #ifndef CLONE_HANDLER_INCLUDED
29 #define CLONE_HANDLER_INCLUDED
30 
31 #include <atomic>
32 #include <string>
33 
34 #include "my_io.h"
35 #include "mysql.h"
36 #include "sql/sql_plugin_ref.h" // plugin_ref
37 
38 class THD;
39 class Srv_session;
40 struct Mysql_clone;
41 struct MYSQL_SOCKET;
42 
43 /**
44  Number of PSI_statement_info instruments
45  for clone statements.
46 */
47 
48 #define CLONE_PSI_STATEMENT_COUNT 5
49 
50 /**
51  Clone plugin handler to convenient way to. Takes
52 */
54  public:
55  /** Constructor: Initialize plugin name */
56  Clone_handler(const char *plugin_name_arg) : m_plugin_handle(nullptr) {
57  m_plugin_name.assign(plugin_name_arg);
58  }
59 
60  /** Initialize plugin handle
61  @return error code */
62  int init();
63 
64  /** Clone handler interface for local clone.
65  @param[in] thd server thread handle
66  @param[in] data_dir cloned data directory
67  @return error code */
68  int clone_local(THD *thd, const char *data_dir);
69 
70  /** Clone handler interface for remote clone client.
71  @param[in] thd server thread handle
72  @param[in] remote_host remote host IP address
73  @param[in] remote_port remote server port
74  @param[in] remote_user remote user name
75  @param[in] remote_passwd remote user's password
76  @param[in] data_dir cloned data directory
77  @param[in] ssl_mode remote connection ssl mode
78  @return error code */
79  int clone_remote_client(THD *thd, const char *remote_host, uint remote_port,
80  const char *remote_user, const char *remote_passwd,
81  const char *data_dir, enum mysql_ssl_mode ssl_mode);
82 
83  /** Clone handler interface for remote clone server.
84  @param[in] thd server thread handle
85  @param[in] socket network socket to remote client
86  @return error code */
88 
89  /** Get donor error and message for ER_CLONE_DONOR error.
90  @param[in] session server session
91  @param[out] error donor error number
92  @param[out] message error message
93  @return true, iff successful. */
94  static bool get_donor_error(Srv_session *session, int &error,
95  const char *&message);
96 
97  /** @return false only if no user data is dropped yet. */
98  static bool is_data_dropped() { return (s_is_data_dropped); }
99 
100  /** Must set before dropping any user data. */
101  static void set_drop_data() { s_is_data_dropped.store(true); }
102 
103  /** @return true, if clone provisioning in progress. */
104  static bool is_provisioning() { return (s_provision_in_progress > 0); }
105 
106  /** @return true, if ordered commit should be forced. Currently
107  clone would force ordered commit at end while blocking XA operations */
108  static bool need_commit_order() { return (s_xa_block_op.load()); }
109 
110  /* Initialize XA counters and mutex. */
111  static void init_xa();
112 
113  /* Destroy XA mutex. */
114  static void uninit_xa();
115 
116  /* RAII guard for XA operation synchronization with clone. */
117  struct XA_Operation {
118  /** Constructor: mark XA operation begin.
119  @param[in] thd session thread */
120  explicit XA_Operation(THD *thd);
121 
122  /** Destructor: mark XA operation end. */
123  ~XA_Operation();
124 
125  /** Disable copy construction */
126  XA_Operation(XA_Operation const &) = delete;
127 
128  /** Disable assignment */
129  XA_Operation &operator=(XA_Operation const &) = delete;
130 
131  private:
132  /** Session thread holding the guard. */
134  };
135 
136  /* RAII guard for blocking and unblocking XA operations. */
137  struct XA_Block {
138  /** Constructor: Block all XA operations.
139  @param[in] thd session thread */
140  explicit XA_Block(THD *thd);
141 
142  /** Destructor: unblock XA operations. */
143  ~XA_Block();
144 
145  /** Disable copy construction */
146  XA_Block(XA_Block const &) = delete;
147 
148  /** Disable assignment */
149  XA_Block &operator=(XA_Block const &) = delete;
150 
151  /** @return true, if XA blocking is unsuccessful. */
152  bool failed() const;
153 
154  private:
155  /** If blocking is successful and there is no XA operations. */
156  bool m_success;
157  };
158 
159  private:
160  /** Block new active XA operations and wait for existing ones to complete.
161  @param[in] thd session thread */
162  static bool block_xa_operation(THD *thd);
163 
164  /** Unblock waiting XA operations. */
165  static void unblock_xa_operation();
166 
167  /** Increment XA operation count and wait if blocked by clone.
168  @param[in] thd session thread */
169  static void begin_xa_operation(THD *thd);
170 
171  /** Decrement XA operation count. */
172  static void end_xa_operation();
173 
174  /** Validate clone data directory and convert to os format
175  @param[in] in_dir user specified clone directory
176  @param[out] out_dir data directory in native os format
177  @return error code */
178  int validate_dir(const char *in_dir, char *out_dir);
179 
180  private:
181  /** Number of XA operations (prepare/commit/rollback) in progress. */
182  static std::atomic<int> s_xa_counter;
183 
184  /** Set when clone blocks XA operations. XA operations currently are
185  not ordered between binlog and SE and needs to be synchronized for clone. */
186  static std::atomic<bool> s_xa_block_op;
187 
188  /** True if clone provisioning in progress. */
189  static std::atomic<int> s_provision_in_progress;
190 
191  /** True, if any user data is dropped by clone. */
192  static std::atomic<bool> s_is_data_dropped;
193 
194  /** Mutex to synchronize blocking XA operation. */
196 
197  /** Clone plugin name */
198  std::string m_plugin_name;
199 
200  /** Clone plugin handle */
202 };
203 
204 /** Check if the clone plugin is installed and lock. If the plugin is ready,
205 return the handler to caller.
206 @param[in] thd server thread handle
207 @param[out] plugin plugin reference
208 @return clone handler on success otherwise NULL */
210 
211 /** Unlock the clone plugin.
212 @param[in] thd server thread handle
213 @param[out] plugin plugin reference */
215 
216 #endif /* CLONE_HANDLER_INCLUDED */
static bool is_provisioning()
Definition: clone_handler.h:104
Definition: sql_plugin_ref.h:44
static std::atomic< bool > s_xa_block_op
Set when clone blocks XA operations.
Definition: clone_handler.h:186
int clone_local(THD *thd, const char *data_dir)
Clone handler interface for local clone.
Definition: clone_handler.cc:128
Definition: clone_handler.h:117
static bool is_data_dropped()
Definition: clone_handler.h:98
static void set_drop_data()
Must set before dropping any user data.
Definition: clone_handler.h:101
MYSQL_SESSION session[9]
Definition: test_sql_9_sessions.cc:65
static std::atomic< int > s_provision_in_progress
True if clone provisioning in progress.
Definition: clone_handler.h:189
static struct st_mysql_daemon plugin
Definition: test_services_host_application_signal.cc:130
THD * m_thd
Session thread holding the guard.
Definition: clone_handler.h:133
std::string m_plugin_name
Clone plugin name.
Definition: clone_handler.h:198
Clone plugin handler to convenient way to.
Definition: clone_handler.h:53
Definition: srv_session.h:55
void clone_plugin_unlock(THD *thd, plugin_ref plugin)
Unlock the clone plugin.
Definition: clone_handler.cc:329
static std::atomic< bool > s_is_data_dropped
True, if any user data is dropped by clone.
Definition: clone_handler.h:192
This file defines the client API to MySQL and also the ABI of the dynamically linked libmysqlclient...
static void unblock_xa_operation()
Unblock waiting XA operations.
Definition: clone_handler.cc:454
The descriptor structure for the plugin, that is referred from st_mysql_plugin.
Definition: plugin_clone.h:42
XA_Operation(THD *thd)
Constructor: mark XA operation begin.
Definition: clone_handler.cc:349
XA_Operation & operator=(XA_Operation const &)=delete
Disable assignment.
mysql_ssl_mode
Definition: mysql.h:268
static int ssl_mode
Definition: xcom_ssl_transport.cc:163
static void init_xa()
Definition: clone_handler.cc:340
int init()
Initialize plugin handle.
Definition: clone_handler.cc:186
~XA_Operation()
Destructor: mark XA operation end.
Definition: clone_handler.cc:356
static bool get_donor_error(Srv_session *session, int &error, const char *&message)
Get donor error and message for ER_CLONE_DONOR error.
Definition: clone_handler.cc:62
static bool need_commit_order()
Definition: clone_handler.h:108
Definition: clone_handler.h:137
static void end_xa_operation()
Decrement XA operation count.
Definition: clone_handler.cc:402
unsigned int uint
Definition: uca-dump.cc:29
int clone_remote_client(THD *thd, const char *remote_host, uint remote_port, const char *remote_user, const char *remote_passwd, const char *data_dir, enum mysql_ssl_mode ssl_mode)
Clone handler interface for remote clone client.
Definition: clone_handler.cc:141
static mysql_mutex_t s_xa_mutex
Mutex to synchronize blocking XA operation.
Definition: clone_handler.h:195
Clone_handler * clone_plugin_lock(THD *thd, plugin_ref *plugin)
Check if the clone plugin is installed and lock.
Definition: clone_handler.cc:309
An instrumented socket.
Definition: mysql_socket_bits.h:34
static bool block_xa_operation(THD *thd)
Block new active XA operations and wait for existing ones to complete.
Definition: clone_handler.cc:413
int validate_dir(const char *in_dir, char *out_dir)
Validate clone data directory and convert to os format.
Definition: clone_handler.cc:214
Clone_handler(const char *plugin_name_arg)
Constructor: Initialize plugin name.
Definition: clone_handler.h:56
static void begin_xa_operation(THD *thd)
Increment XA operation count and wait if blocked by clone.
Definition: clone_handler.cc:361
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:49
stdx::expected< native_handle_type, error_type > socket(int family, int sock_type, int protocol)
Definition: socket.h:56
int clone_remote_server(THD *thd, MYSQL_SOCKET socket)
Clone handler interface for remote clone server.
Definition: clone_handler.cc:181
static std::atomic< int > s_xa_counter
Number of XA operations (prepare/commit/rollback) in progress.
Definition: clone_handler.h:182
static bool failed
Definition: log_sink_test.cc:53
Common #defines and includes for file and socket I/O.
bool m_success
If blocking is successful and there is no XA operations.
Definition: clone_handler.h:156
Mysql_clone * m_plugin_handle
Clone plugin handle.
Definition: clone_handler.h:201
static void uninit_xa()
Definition: clone_handler.cc:347
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_class.h:803
Dialog Client Authentication nullptr
Definition: dialog.cc:353