MySQL 9.3.0
Source Code Documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
cluster_metadata.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2016, 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 METADATA_CACHE_CLUSTER_METADATA_INCLUDED
27#define METADATA_CACHE_CLUSTER_METADATA_INCLUDED
28
31
38#include "router_options.h"
39
40#include <chrono>
41#include <memory>
42#include <optional>
43#include <string>
44#include <vector>
45
47
48namespace mysqlrouter {
49class MySQLSession;
50} // namespace mysqlrouter
51
52namespace xcl {
53class XSession;
54} // namespace xcl
55
57 std::function<bool(mysqlrouter::MySQLSession &connection,
59
60/** @class ClusterMetadata
61 *
62 * The `ClusterMetadata` class encapsulates a connection to the Metadata server.
63 * It uses the mysqlrouter::MySQLSession to setup, manage and retrieve results.
64 *
65 */
67 public:
68 /** @brief Constructor
69 *
70 * @param session_config Metadata MySQL session configuration
71 * @param ssl_options SSL related options to use for MySQL connections)
72 */
75 const mysqlrouter::SSLOptions &ssl_options);
76
77 // disable copy as it isn't needed right now. Feel free to enable
78 // must be explicitly defined though.
79 explicit ClusterMetadata(const ClusterMetadata &) = delete;
81
82 /** @brief Destructor
83 *
84 * Disconnect and release the connection to the metadata node.
85 */
86 ~ClusterMetadata() override;
87
88 /** @brief Connects with the Metadata server and sets up the session
89 * parameters
90 *
91 *
92 * @param metadata_server the server instance for which the connection
93 * should be attempted.
94 *
95 * @return a boolean to indicate if the connection and session parameters
96 * setup was successful.
97 */
99 &metadata_server) noexcept override;
100
101 /** @brief Disconnects from the Metadata server
102 *
103 */
104 void disconnect() noexcept override { metadata_connection_.reset(); }
105
106 /**
107 * check if the metadata_connection_ connection is connected to
108 * metadata_server and alive.
109 */
110 [[nodiscard]] bool is_connected_to(
111 const metadata_cache::metadata_server_t &metadata_server) const;
112
113 /**
114 * make a connection to metadata_server.
115 *
116 * if the metadata_connection_ already is connected to metadata_server, return
117 * that instead.
118 */
120 make_connection_shared(
121 const metadata_cache::metadata_server_t &metadata_server);
122
123 /** @brief Gets the object representing the session to the metadata server
124 */
125 std::shared_ptr<mysqlrouter::MySQLSession> get_connection() override {
126 return metadata_connection_;
127 }
128
130 const metadata_cache::metadata_server_t &rw_server,
131 const unsigned router_id,
132 const metadata_cache::RouterAttributes &router_attributes) override;
133
135 const metadata_cache::metadata_server_t &rw_server,
136 const unsigned router_id) override;
137
138 void report_guideline_name(const std::string &guideline_name,
139 const metadata_cache::metadata_server_t &rw_server,
140 const unsigned router_id) override;
141
142 auth_credentials_t fetch_auth_credentials(
143 const metadata_cache::metadata_server_t &md_server,
144 const mysqlrouter::TargetCluster &target_cluster) override;
145
146 std::optional<routing_guidelines::Router_info> fetch_router_info(
147 const uint16_t router_id) override;
148
150 fetch_routing_guidelines_document(const uint16_t router_id) override;
151
152 std::optional<metadata_cache::metadata_server_t> find_rw_server(
153 const std::vector<metadata_cache::ManagedInstance> &instances);
154
155 std::optional<metadata_cache::metadata_server_t> find_rw_server(
156 const std::vector<metadata_cache::ManagedCluster> &clusters);
157
158 std::optional<std::chrono::seconds>
160 return router_options_.get_stats_updates_frequency();
161 }
162
163 protected:
164 /** Connects a MYSQL connection to the given instance
165 */
166 bool do_connect(mysqlrouter::MySQLSession &connection,
168
169 // throws metadata_cache::metadata_error and
170 // MetadataUpgradeInProgressException
171 mysqlrouter::MetadataSchemaVersion get_and_check_metadata_schema_version(
173
176 const mysqlrouter::MetadataSchemaVersion &schema_version,
177 const uint16_t router_id) {
179 return R"(SELECT guideline FROM
180mysql_innodb_cluster_metadata.routing_guidelines WHERE guideline_id = (
181 SELECT COALESCE(RO.router_options->>'$.guideline',
182 CS.router_options->>'$.guideline',
183 CL.router_options->>'$.guideline')
184 FROM
185 mysql_innodb_cluster_metadata.v2_router_options AS RO
186 LEFT JOIN
187 mysql_innodb_cluster_metadata.clustersets AS CS ON RO.clusterset_id = CS.clusterset_id
188 LEFT JOIN
189 mysql_innodb_cluster_metadata.clusters AS CL ON RO.cluster_id = CL.cluster_id
190 WHERE RO.router_id = )" +
191 std::to_string(router_id) + ")";
192 } else {
195 }
196 }
197
198 // Metadata node generic information
201
203
204#if 0 // not used so far
205 // The number of times we should try connecting to the metadata server if a
206 // connection attempt fails.
207 int connection_attempts_;
208#endif
209
210 // connection to metadata server (it may also be shared with GR status queries
211 // for optimisation purposes)
212 std::shared_ptr<mysqlrouter::MySQLSession> metadata_connection_;
213
215};
216
217std::string as_string(const char *input_str);
218
221 const size_t classic_port_column,
222 const size_t x_port_column);
223
225 const std::string &attributes);
226
227#endif // METADATA_CACHE_CLUSTER_METADATA_INCLUDED
The ClusterMetadata class encapsulates a connection to the Metadata server.
Definition: cluster_metadata.h:66
~ClusterMetadata() override
Destructor.
ClusterMetadata(const ClusterMetadata &)=delete
std::optional< std::chrono::seconds > get_periodic_stats_update_frequency() noexcept override
Definition: cluster_metadata.h:159
ClusterMetadata & operator=(const ClusterMetadata &)=delete
mysql_ssl_mode ssl_mode_
Definition: cluster_metadata.h:199
void disconnect() noexcept override
Disconnects from the Metadata server.
Definition: cluster_metadata.h:104
RouterOptions router_options_
Definition: cluster_metadata.h:214
mysqlrouter::SSLOptions ssl_options_
Definition: cluster_metadata.h:200
std::shared_ptr< mysqlrouter::MySQLSession > metadata_connection_
Definition: cluster_metadata.h:212
stdx::expected< std::string, std::error_code > get_select_routing_guidelines_query(const mysqlrouter::MetadataSchemaVersion &schema_version, const uint16_t router_id)
Definition: cluster_metadata.h:175
metadata_cache::MetadataCacheMySQLSessionConfig session_config_
Definition: cluster_metadata.h:202
std::shared_ptr< mysqlrouter::MySQLSession > get_connection() override
Gets the object representing the session to the metadata server.
Definition: cluster_metadata.h:125
The metadata class is used to create a pluggable transport layer from which the metadata is fetched f...
Definition: metadata.h:52
virtual bool update_router_last_check_in(const metadata_cache::metadata_server_t &rw_server, const unsigned router_id)=0
virtual bool connect_and_setup_session(const metadata_cache::metadata_server_t &metadata_server)=0
virtual std::optional< routing_guidelines::Router_info > fetch_router_info(const uint16_t router_id)=0
virtual bool update_router_attributes(const metadata_cache::metadata_server_t &rw_server, const unsigned router_id, const metadata_cache::RouterAttributes &router_attributes)=0
virtual auth_credentials_t fetch_auth_credentials(const metadata_cache::metadata_server_t &md_server, const mysqlrouter::TargetCluster &target_cluster)=0
virtual stdx::expected< std::string, std::error_code > fetch_routing_guidelines_document(const uint16_t router_id)=0
virtual void report_guideline_name(const std::string &guideline_name, const metadata_cache::metadata_server_t &rw_server, const unsigned router_id)=0
Represents the Router options in v2_routers view in the metadata schema.
Definition: router_options.h:58
Class ManagedInstance represents a server managed by the topology.
Definition: metadata_cache_datatypes.h:105
Definition: destination.h:40
Definition: mysql_session.h:157
std::vector< const char * > Row
Definition: mysql_session.h:161
Definition: cluster_metadata.h:173
Definition: expected.h:286
void set_instance_attributes(metadata_cache::ManagedInstance &instance, const std::string &attributes)
Definition: cluster_metadata.cc:630
std::function< bool(mysqlrouter::MySQLSession &connection, const metadata_cache::ManagedInstance &mi)> ConnectCallback
Definition: cluster_metadata.h:58
std::string as_string(const char *input_str)
Return a string representation of the input character string.
Definition: cluster_metadata.cc:68
bool set_instance_ports(metadata_cache::ManagedInstance &instance, const mysqlrouter::MySQLSession::Row &row, const size_t classic_port_column, const size_t x_port_column)
Definition: cluster_metadata.cc:225
#define METADATA_CACHE_EXPORT
Definition: metadata_cache_export.h:15
mysql_ssl_mode
Definition: mysql.h:272
static void do_connect(struct st_command *command)
Definition: mysqltest.cc:6679
std::error_code make_error_code(DynamicLoaderErrc ec)
make error_code from a DynamicLoaderErrc.
Definition: dynamic_loader.cc:79
Definition: base64.h:43
constexpr MetadataSchemaVersion kRoutingGuidelinesMetadataVersion
Definition: cluster_metadata.h:100
std::string ROUTER_CLUSTER_EXPORT to_string(const TargetCluster::InvalidatedClusterRoutingPolicy)
Definition: cluster_metadata.cc:1403
unexpected(E) -> unexpected< E >
Definition: cluster_metadata.h:52
Definition: group_replication_metadata.h:38
Metadata MySQL session configuration.
Definition: metadata_cache_datatypes.h:248
Definition: metadata_cache_datatypes.h:264
Definition: cluster_metadata.h:45
SSL connection related options.
Definition: datatypes.h:34