26#ifndef ROUTING_MYSQLROUTING_INCLUDED
27#define ROUTING_MYSQLROUTING_INCLUDED
48#include <netinet/in.h>
49#include <netinet/tcp.h>
50#include <sys/socket.h>
67#include "mysql/harness/plugin.h"
91 const std::string &parent_routing_name)
92 : io_ctx_(io_ctx), parent_routing_name_(parent_routing_name) {}
103 virtual std::string
name() = 0;
116 const std::string &parent_routing_name,
117 const std::string &address, uint16_t
port);
121 bool is_open()
const override;
126 std::string
name()
override;
140 const std::string &parent_routing_name,
141 const std::string &socket_name);
145 bool is_open()
const override;
150 std::string
name()
override;
180 std::shared_ptr<routing_guidelines::Routing_guidelines_engine> guidelines,
181 const std::string &route_name = {},
195 void set_destinations(
const std::string &dests);
202 void set_destinations_from_dests(
203 const std::vector<mysql_harness::Destination> &dests);
212 return context_.get_destination_connect_timeout();
223 void validate_destination_connect_timeout(std::chrono::milliseconds
timeout);
235 int set_max_connections(
int maximum);
250 template <
class ClientProtocol>
251 void create_connection(
253 const typename ClientProtocol::endpoint &client_endpoint);
257 return routing_strategy_;
260 std::vector<mysql_harness::Destination> get_destination_candidates()
263 std::vector<MySQLRoutingAPI::ConnData> get_connections()
override;
268 return destination_manager_.get();
271 void disconnect_all();
278 void stop_socket_acceptors(
const bool shutting_down)
override;
285 bool is_accepting_connections()
const override;
310 void on_routing_guidelines_update(
312 &affected_routing_sources);
321 update_routing_guidelines(
const std::string &routing_guidelines_document);
328 void on_router_info_update(
340 static void set_unix_socket_permissions(
const char *socket_file);
379 std::unique_ptr<DestinationManager> destination_manager_{
nullptr};
381 bool is_destination_standalone_{
false};
404 std::atomic<bool> is_running_{
true};
411 FRIEND_TEST(RoutingTests, bug_24841281);
413 FRIEND_TEST(ClassicProtocolRoutingTest, NoValidDestinations);
414 FRIEND_TEST(TestSetupTcpService, single_addr_ok);
415 FRIEND_TEST(TestSetupTcpService, getaddrinfo_fails);
416 FRIEND_TEST(TestSetupTcpService, socket_fails_for_all_addr);
417 FRIEND_TEST(TestSetupTcpService, socket_fails);
418 FRIEND_TEST(TestSetupTcpService, bind_fails);
419 FRIEND_TEST(TestSetupTcpService, listen_fails);
421 FRIEND_TEST(TestSetupTcpService, setsockopt_fails);
422 FRIEND_TEST(TestSetupNamedSocketService, unix_socket_permissions_failure);
Definition: mysql_routing.h:113
std::string address_
Definition: mysql_routing.h:132
uint16_t port_
Definition: mysql_routing.h:133
net::ip::tcp::acceptor service_
Definition: mysql_routing.h:129
net::ip::tcp::endpoint service_endpoint_
Definition: mysql_routing.h:130
Definition: mysql_routing.h:137
local::stream_protocol::acceptor service_
Definition: mysql_routing.h:153
std::string socket_name_
Definition: mysql_routing.h:156
local::stream_protocol::endpoint service_endpoint_
Definition: mysql_routing.h:154
Definition: mysql_routing.h:88
virtual ~AcceptingEndpoint()
Definition: mysql_routing.h:105
virtual stdx::expected< void, std::error_code > setup()=0
virtual void start(MySQLRouting *r, std::list< IoThread > &, WaitableMonitor< Nothing > &waitable)=0
virtual std::string name()=0
std::string parent_routing_name_
Definition: mysql_routing.h:110
net::io_context & io_ctx_
Definition: mysql_routing.h:108
AcceptingEndpoint(const AcceptingEndpoint &)=delete
virtual bool is_open() const =0
AcceptingEndpoint(net::io_context &io_ctx, const std::string &parent_routing_name)
Definition: mysql_routing.h:90
virtual stdx::expected< void, std::error_code > cancel()=0
container for connections to MySQL Server.
Definition: connection_container.h:164
Manage destinations for a Connection Routing.
Definition: destination.h:163
TlsClientContext per destination.
Definition: destination_ssl_context.h:42
Facade to avoid a tight coupling between Routing component and actual routing endpoint implementation...
Definition: mysql_routing_base.h:41
Definition: connection.h:47
MySQLRoutingContext holds data used by MySQLRouting (1 per plugin instances) and MySQLRoutingConnecti...
Definition: context.h:54
Manage Connections from clients to MySQL servers.
Definition: mysql_routing.h:167
std::chrono::milliseconds get_destination_connect_timeout() const noexcept
Returns timeout when connecting to destination.
Definition: mysql_routing.h:211
bool is_standalone() const override
Definition: mysql_routing.h:331
MySQLRoutingContext & get_context() override
Definition: mysql_routing.h:346
std::optional< routing::RoutingStrategy > routing_strategy_
Routing strategy to use when getting next destination.
Definition: mysql_routing.h:384
ConnectionContainer connection_container_
container for connections
Definition: mysql_routing.h:401
routing::AccessMode access_mode_
access_mode of the servers in the routing
Definition: mysql_routing.h:387
std::optional< routing::RoutingStrategy > get_routing_strategy() const override
Definition: mysql_routing.h:255
AllowedNodesChangeCallbacksListIterator allowed_nodes_list_iterator_
used to unregister from subscription on allowed nodes changes
Definition: mysql_routing.h:398
std::vector< std::unique_ptr< AcceptingEndpoint > > accepting_endpoints_
Definition: mysql_routing.h:426
MySQLRoutingContext context_
wrapper for data used by all connections
Definition: mysql_routing.h:374
net::io_context & io_ctx_
Definition: mysql_routing.h:376
int max_connections_
Maximum active connections.
Definition: mysql_routing.h:395
bool is_running() const override
Definition: mysql_routing.h:348
DestinationManager * destination_manager()
Definition: mysql_routing.h:267
int get_max_connections() const noexcept override
Returns maximum active connections.
Definition: mysql_routing.h:241
route specific configuration.
Definition: routing_config.h:40
TLS Context for the server side.
Definition: tls_server_context.h:51
Monitor can be waited for.
Definition: monitor.h:62
PluginFuncEnv object.
Definition: loader.h:673
Parse and create URIs according to RFC3986.
Definition: uri.h:66
Definition: socket.h:1293
Definition: io_context.h:61
Definition: internet.h:678
Definition: expected.h:286
static int get_connection(MEM_ROOT *mem_root, FEDERATED_SHARE *share)
Definition: ha_federated.cc:608
static void start(mysql_harness::PluginFuncEnv *env)
Definition: http_auth_backend_plugin.cc:180
static void run(mysql_harness::PluginFuncEnv *)
Definition: io_plugin.cc:199
mysql_harness::Plugin ROUTING_PLUGIN_EXPORT harness_plugin_routing
Definition: routing_plugin.cc:644
std::string get_routing_thread_name(const std::string &config_name, const std::string &prefix)
return a short string suitable to be used as a thread name
Definition: mysql_routing_common.cc:30
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:498
ServerMode
Definition: datatypes.h:50
stdx::expected< native_handle_type, error_type > socket(int family, int sock_type, int protocol)
Definition: socket.h:63
AccessMode
Definition: routing.h:259
const mysql_service_registry_t * r
Definition: pfs_example_plugin_employee.cc:86
required uint64 port
Definition: replication_asynchronous_connection_failover.proto:33
AllowedNodesChangeCallbacksList::iterator AllowedNodesChangeCallbacksListIterator
Definition: destination.h:64
#define ROUTING_EXPORT
Definition: routing_export.h:15
#define ROUTING_PLUGIN_EXPORT
Definition: routing_plugin_export.h:15
case opt name
Definition: sslopt-case.h:29
Definition: mysql_routing.h:85
Information about this Router instance.
Definition: routing_guidelines.h:57
Type for names of Routes changed during routing guidelines document update.
Definition: routing_guidelines.h:322