MySQL 9.3.0
Source Code Documentation
context.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2018, 2025, 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 designed to work 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 either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24*/
25
26#ifndef ROUTING_CONTEXT_INCLUDED
27#define ROUTING_CONTEXT_INCLUDED
28
29#include <atomic>
30#include <chrono>
31#include <memory>
32#include <mutex>
33#include <string>
34
35#include "blocked_endpoints.h"
37#include "mysql/harness/filesystem.h" // Path
39#include "mysql_router_thread.h"
43#include "mysqlrouter/routing.h"
45#include "routing_config.h"
47
48/**
49 * @brief MySQLRoutingContext holds data used by MySQLRouting (1 per plugin
50 * instances) and MySQLRoutingConnection instances (many instances). It is
51 * created and owned by MySQLRouting while MySQLRoutingConnection objects hold
52 * reference to it.
53 */
55 public:
57 const RoutingConfig &routing_config, std::string name,
58 TlsServerContext *client_ssl_ctx, DestinationTlsContext *dest_tls_context,
59 std::shared_ptr<routing_guidelines::Routing_guidelines_engine>
61 : routing_config_(routing_config),
62 name_(std::move(name)),
63 client_ssl_ctx_{client_ssl_ctx},
64 destination_tls_context_{dest_tls_context},
69 }
70
73 return blocked_endpoints_;
74 }
75
79
82 uint64_t get_max_connect_errors() const {
84 }
85
87
88 const std::string &get_name() const { return name_; }
89
90 /**
91 * identifier part of the name.
92 *
93 * name has the form 'routing:{id}'
94 */
95 std::string get_id() const {
96 auto pos = name_.find(':');
97
98 if (pos == name_.npos) return {};
99
100 return name_.substr(pos + 1);
101 }
102
103 unsigned int get_net_buffer_length() const {
105 }
106
109 }
110
113 1000};
114 }
115
118 }
119
122 }
123
126 }
127
128 SslMode source_ssl_mode() const noexcept {
130 }
131 SslMode dest_ssl_mode() const noexcept {
133 }
134
135 /**
136 * get the SSL context for the client side of the route.
137 */
139
142 }
143
144 /**
145 * get the SSL context for the server side of the route.
146 *
147 * @param dest_id unique id of the destination
148 * @param hostname name of the destination host
149 *
150 * @returns a TlsClientContext for the destination.
151 * @retval nullptr if creating tls-context failed.
152 */
153 TlsClientContext *dest_ssl_ctx(const std::string &dest_id,
154 const std::string &hostname) {
155 if (destination_tls_context_ == nullptr) return nullptr;
156
157 return destination_tls_context_->get(dest_id, hostname);
158 }
159
162 }
163
166 }
167
169
170 void connection_sharing(const std::optional<bool> &is_enabled) {
171 connection_sharing_ = is_enabled.has_value()
172 ? *is_enabled
174 }
175
178 }
179
182 }
183
185
188 }
189
190 std::string dest_ssl_key() const { return routing_config_.dest_ssl_key; }
191 std::string dest_ssl_cert() const { return routing_config_.dest_ssl_cert; }
192
195 }
196
197 std::shared_ptr<routing_guidelines::Routing_guidelines_engine>
199 return routing_guidelines_;
200 }
201
203 std::lock_guard<std::mutex> l{router_info_mtx_};
204 router_info_ = std::move(router_info);
207 }
208
210 std::lock_guard<std::mutex> l{router_info_mtx_};
211 return router_info_;
212 }
213
214 private:
216
217 /** @brief Descriptive name of the connection routing */
218 const std::string name_;
219
220 mutable std::mutex mutex_conn_errors_;
221
222 /** @brief memory in kilobytes allocated for thread's stack */
224
226
228
229 /**
230 * Routing guidelines engine used for the routing.
231 */
232 std::shared_ptr<routing_guidelines::Routing_guidelines_engine>
234
235 mutable std::mutex router_info_mtx_;
237
238 // Connection sharing could be configured in routing plugin config, but it
239 // could be overwritten by routing guidelines
240 std::atomic<bool> connection_sharing_;
241
242 /**
243 * Callbacks for communicating with quarantined destination candidates
244 * instance.
245 */
247
249
250 public:
251 /** @brief Number of active routes */
252 std::atomic<uint16_t> info_active_routes_{0};
253 /** @brief Number of handled routes, not used at the moment */
254 std::atomic<uint64_t> info_handled_routes_{0};
255};
256#endif /* ROUTING_CONTEXT_INCLUDED */
Type
supported protocols
Definition: base_protocol.h:32
Definition: blocked_endpoints.h:34
uint64_t max_connect_errors() const
Definition: blocked_endpoints.h:39
TlsClientContext per destination.
Definition: destination_ssl_context.h:42
TlsClientContext * get(const std::string &dest_id, const std::string &hostname)
get a TlsClientContent for a destination.
Definition: destination_ssl_context.cc:93
MySQLRoutingContext holds data used by MySQLRouting (1 per plugin instances) and MySQLRoutingConnecti...
Definition: context.h:54
const std::string & get_name() const
Definition: context.h:88
std::string dest_ssl_key() const
Definition: context.h:190
const SharedQuarantineHandler & shared_quarantine() const
Definition: context.h:164
std::string get_id() const
identifier part of the name.
Definition: context.h:95
bool router_require_enforce() const
Definition: context.h:193
void connection_sharing(const std::optional< bool > &is_enabled)
Definition: context.h:170
std::chrono::milliseconds get_client_connect_timeout() const
Definition: context.h:111
std::atomic< uint64_t > info_handled_routes_
Number of handled routes, not used at the moment.
Definition: context.h:254
std::mutex router_info_mtx_
Definition: context.h:235
const mysql_harness::Path & get_bind_named_socket() const
Definition: context.h:124
const BlockedEndpoints & blocked_endpoints() const
Definition: context.h:72
TlsClientContext * dest_ssl_ctx(const std::string &dest_id, const std::string &hostname)
get the SSL context for the server side of the route.
Definition: context.h:153
routing_guidelines::Router_info get_router_info() const
Definition: context.h:209
size_t thread_stack_size_
memory in kilobytes allocated for thread's stack
Definition: context.h:223
uint64_t get_handled_routes()
Definition: context.h:81
void increase_info_handled_routes()
Definition: context.cc:36
SharedQuarantineHandler shared_quarantine_handler_
Callbacks for communicating with quarantined destination candidates instance.
Definition: context.h:246
SharedQuarantineHandler & shared_quarantine()
Definition: context.h:160
std::atomic< bool > connection_sharing_
Definition: context.h:240
bool connection_sharing() const
Definition: context.h:168
routing_guidelines::Router_info router_info_
Definition: context.h:236
unsigned int get_net_buffer_length() const
Definition: context.h:103
routing::AccessMode access_mode() const
Definition: context.h:180
uint64_t get_max_connect_errors() const
Definition: context.h:82
std::atomic< uint16_t > info_active_routes_
Number of active routes.
Definition: context.h:252
BaseProtocol::Type get_protocol() const
Definition: context.h:86
std::shared_ptr< routing_guidelines::Routing_guidelines_engine > get_routing_guidelines() const
Definition: context.h:198
BlockedEndpoints blocked_endpoints_
Definition: context.h:248
const mysql_harness::TcpDestination & get_bind_address() const
Definition: context.h:120
std::chrono::seconds wait_for_my_writes_timeout() const
Definition: context.h:186
SslMode source_ssl_mode() const noexcept
Definition: context.h:128
std::chrono::milliseconds get_destination_connect_timeout() const
Definition: context.h:107
BlockedEndpoints & blocked_endpoints()
Definition: context.h:71
TlsServerContext * source_ssl_ctx() const
get the SSL context for the client side of the route.
Definition: context.h:138
DestinationTlsContext * destination_tls_context_
Definition: context.h:227
std::chrono::milliseconds connect_retry_timeout() const
Definition: context.h:116
std::mutex mutex_conn_errors_
Definition: context.h:220
const RoutingConfig routing_config_
Definition: context.h:215
std::string dest_ssl_cert() const
Definition: context.h:191
void increase_info_active_routes()
Definition: context.cc:28
void set_router_info(routing_guidelines::Router_info router_info)
Definition: context.h:202
MySQLRoutingContext(const RoutingConfig &routing_config, std::string name, TlsServerContext *client_ssl_ctx, DestinationTlsContext *dest_tls_context, std::shared_ptr< routing_guidelines::Routing_guidelines_engine > routing_guidelines)
Definition: context.h:56
TlsServerContext * client_ssl_ctx_
Definition: context.h:225
SslMode dest_ssl_mode() const noexcept
Definition: context.h:131
std::shared_ptr< routing_guidelines::Routing_guidelines_engine > routing_guidelines_
Routing guidelines engine used for the routing.
Definition: context.h:233
std::chrono::milliseconds connection_sharing_delay() const
Definition: context.h:176
uint16_t get_active_routes()
Definition: context.h:80
DestinationTlsContext * destination_ssl_config() const
Definition: context.h:140
bool wait_for_my_writes() const
Definition: context.h:184
void decrease_info_active_routes()
Definition: context.cc:32
const std::string name_
Descriptive name of the connection routing.
Definition: context.h:218
route specific configuration.
Definition: routing_config.h:40
std::chrono::seconds wait_for_my_writes_timeout
how long to wait for writes to be applied before reads.
Definition: routing_config.h:107
mysql_harness::Path named_socket
unix domain socket path to bind to
Definition: routing_config.h:47
bool wait_for_my_writes
Definition: routing_config.h:105
bool router_require_enforce
Definition: routing_config.h:117
SslMode dest_ssl_mode
SslMode of the server side connection.
Definition: routing_config.h:71
mysql_harness::TcpDestination bind_address
IP address to bind to.
Definition: routing_config.h:46
unsigned int client_connect_timeout
client connect timeout in seconds
Definition: routing_config.h:53
SslMode source_ssl_mode
SslMode of the client side connection.
Definition: routing_config.h:57
int connect_timeout
connect-timeout in seconds
Definition: routing_config.h:48
Protocol::Type protocol
protocol (classic, x)
Definition: routing_config.h:42
std::string dest_ssl_cert
Cert file.
Definition: routing_config.h:72
routing::AccessMode access_mode
read_write,read_only,auto
Definition: routing_config.h:102
unsigned int net_buffer_length
Size of buffer to receive packets.
Definition: routing_config.h:54
bool connection_sharing
if connection sharing is allowed.
Definition: routing_config.h:85
std::chrono::milliseconds connect_retry_timeout
timeout of retrying after a transient connect-failure.
Definition: routing_config.h:100
std::string dest_ssl_key
Key file.
Definition: routing_config.h:73
std::chrono::milliseconds connection_sharing_delay
delay before an idling connection is moved to the pool and connection sharing is allowed.
Definition: routing_config.h:87
Definition: shared_quarantine_handler.h:35
Client TLS Context.
Definition: tls_client_context.h:43
TLS Context for the server side.
Definition: tls_server_context.h:51
Class representing a path in a file system.
Definition: filesystem.h:63
Definition: destination.h:40
const std::string & hostname() const
Definition: destination.h:57
ulong max_connect_errors
Definition: mysqld.cc:1396
bool is_enabled()
Check if doublewrite is enabled.
Definition: buf0dblwr.h:390
std::chrono::seconds seconds
Definition: authorize_manager.cc:69
std::chrono::milliseconds milliseconds
Definition: authorize_manager.cc:68
static const size_t kDefaultStackSizeInKiloBytes
Definition: mysql_router_thread.h:44
Definition: routing_guidelines_datatypes.h:31
AccessMode
Definition: routing.h:265
Definition: gcs_xcom_synode.h:64
SslMode
Definition: ssl_mode.h:29
case opt name
Definition: sslopt-case.h:29
Information about this Router instance.
Definition: routing_guidelines.h:59
std::string bind_address
address on which router is listening
Definition: routing_guidelines.h:71
std::string route_name
name of the plugin which handles the connection
Definition: routing_guidelines.h:74