MySQL 26.10.0
Source Code Documentation
mysql_cache_manager.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2021, 2026, 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 ROUTER_SRC_REST_MRS_SRC_CONNECTION_CACHE_MANAGER_H_
27#define ROUTER_SRC_REST_MRS_SRC_CONNECTION_CACHE_MANAGER_H_
28
29#include <cassert>
30
32#include "mrs/configuration.h"
33
36
37#include "secure_string.h" // NOLINT(build/include_subdir)
38
39namespace collector {
40
46};
47
50
52 public:
54
57 : type_{type},
58 provider_{is_rw() ? configuration.provider_rw_.get()
59 : configuration.provider_ro_.get()} {
60 switch (type) {
63 mysql_user_ = configuration.mysql_user_;
64 mysql_password_ = configuration.mysql_user_password_;
65 break;
68 mysql_user_ = configuration.mysql_user_data_access_;
69 mysql_password_ = configuration.mysql_user_data_access_password_;
70 break;
71 }
72 }
73
74 bool is_rw() const { return is_rw_connection(type_); }
75
78 std::string mysql_user_;
80};
81
83 public:
88 using Callbacks = MySqlCacheManager::Callbacks;
90
92 public:
96
97 bool object_before_cache(Object, bool dirty) override;
99 void object_remove(Object) override;
100 Object object_allocate(bool wait) override;
101 bool is_default_user(Object &) const;
102
103 const ConnectionConfiguration &get_connection_configuration() const;
104
105 private:
106 void object_restore_defaults(Object &, bool dirty);
107 bool is_default_server(Object &) const;
108
110
111 private:
114 };
115
116 public:
122 callbacks_userdata_ro_{{
125 }},
126 callbacks_metadata_rw_{
128 callbacks_userdata_rw_{{
131 }} {}
132 MysqlCacheManager(Callbacks *callbacks_meta, Callbacks *callbacks_user)
133 : default_mysql_cache_instances_{10},
134 cache_manager_metadata_ro_{callbacks_meta},
135 cache_manager_userdata_ro_{callbacks_user} {}
136
137 virtual ~MysqlCacheManager() = default;
138
140 switch (type) {
142 return CachedObject(&cache_manager_metadata_ro_, wait);
144 return CachedObject(&cache_manager_userdata_ro_, wait);
146 return CachedObject(&cache_manager_metadata_rw_, wait);
148 return CachedObject(&cache_manager_userdata_rw_, wait);
149 default:
150 assert(nullptr && "Shouldn't happen");
151 return {};
152 }
153 }
154
156 if (obj.parent_ == &cache_manager_metadata_ro_)
158 else if (obj.parent_ == &cache_manager_metadata_ro_)
160 else if (obj.parent_ == &cache_manager_metadata_rw_)
162 else if (obj.parent_ == &cache_manager_userdata_rw_)
164
166 }
167
169 bool wait) {
170 switch (type) {
172 return cache_manager_metadata_ro_.get_instance(wait);
174 return cache_manager_userdata_ro_.get_instance(wait);
176 return cache_manager_metadata_rw_.get_instance(wait);
178 return cache_manager_userdata_rw_.get_instance(wait);
179 default:
180 assert(nullptr && "Shouldn't happen");
181 return {};
182 }
183 }
184
185 // Bootstrap and metadata monitoring only. Embedded implementations may
186 // bypass max_connections while retaining the selected SQL identity.
189 return get_instance(type, true);
190 }
191
192 virtual std::unique_ptr<collector::CountedMySQLSession> clone_instance(
194
195 virtual void change_instance(CachedObject &instance,
197 switch (type) {
199 change_to(instance, &cache_manager_metadata_ro_);
200 break;
202 change_to(instance, &cache_manager_userdata_ro_);
203 break;
205 change_to(instance, &cache_manager_metadata_rw_);
206 break;
208 change_to(instance, &cache_manager_userdata_rw_);
209 break;
210 }
211 }
212
215 switch (type) {
217 return callbacks_metadata_ro_.get_connection_configuration();
219 return callbacks_userdata_ro_.get_connection_configuration();
221 return callbacks_metadata_rw_.get_connection_configuration();
223 return callbacks_userdata_rw_.get_connection_configuration();
224 default:
225 assert(nullptr && "Shouldn't happen");
226 throw std::logic_error("internal error");
227 }
228 }
229
230 virtual void return_instance(CachedObject &object) {
231 if (object.parent_) object.parent_->return_instance(object);
232 }
233
234 virtual void change_cache_object_limit(uint32_t limit) {
235 cache_manager_metadata_ro_.change_cache_object_limit(limit);
236 cache_manager_userdata_ro_.change_cache_object_limit(limit);
237 cache_manager_metadata_rw_.change_cache_object_limit(limit);
238 cache_manager_userdata_rw_.change_cache_object_limit(limit);
239 }
240
241 void configure(const std::string &json_object);
242
243 private:
244 static void change_to(CachedObject &instance, MySqlCacheManager *m) {
245 if (instance.parent_ != m) {
246 instance.parent_ = m;
247 if (instance.get()) {
248 auto cb = dynamic_cast<MysqlCacheCallbacks *>(m->get_callbacks());
249
250 instance.get()->change_user(
251 cb->get_connection_configuration().mysql_user_,
252 cb->get_connection_configuration().mysql_password_, "");
253 }
254 }
255 }
256
262 MySqlCacheManager cache_manager_metadata_ro_{&callbacks_metadata_ro_,
263 default_mysql_cache_instances_};
264 MySqlCacheManager cache_manager_userdata_ro_{&callbacks_userdata_ro_,
265 default_mysql_cache_instances_};
266 MySqlCacheManager cache_manager_metadata_rw_{&callbacks_metadata_rw_,
267 default_mysql_cache_instances_};
268 MySqlCacheManager cache_manager_userdata_rw_{&callbacks_userdata_rw_,
269 default_mysql_cache_instances_};
270};
271
272} // namespace collector
273
274#endif // ROUTER_SRC_REST_MRS_SRC_CONNECTION_CACHE_MANAGER_H_
Definition: cache_manager.h:41
Object get()
Definition: cache_manager.h:79
CacheManager * parent_
Definition: cache_manager.h:108
Definition: cache_manager.h:116
CacheManager::Object Object
Definition: cache_manager.h:118
CountedMySQLSession * Object
Definition: cache_manager.h:38
Callbacks * get_callbacks() const
Definition: cache_manager.h:172
Definition: mysql_cache_manager.h:51
std::string mysql_user_
Definition: mysql_cache_manager.h:78
DestinationProvider * provider_
Definition: mysql_cache_manager.h:77
ConnectionConfiguration(MySQLConnection type, const mrs::Configuration &configuration)
Definition: mysql_cache_manager.h:55
mysql_harness::SecureString mysql_password_
Definition: mysql_cache_manager.h:79
MySQLConnection type_
Definition: mysql_cache_manager.h:76
bool is_rw() const
Definition: mysql_cache_manager.h:74
Definition: counted_mysql_session.h:39
std::vector< std::string > Sqls
Definition: counted_mysql_session.h:41
Definition: destination_provider.h:37
Definition: mysql_cache_manager.h:91
bool object_retrived_from_cache(Object) override
Definition: mysql_cache_manager.cc:190
bool is_default_server(Object &) const
Definition: mysql_cache_manager.cc:217
ConnectionParameters new_connection_params(bool wait)
Definition: mysql_cache_manager.cc:245
bool object_before_cache(Object, bool dirty) override
Definition: mysql_cache_manager.cc:173
void object_remove(Object) override
Definition: mysql_cache_manager.cc:168
int node_rount_robin_
Definition: mysql_cache_manager.h:113
void object_restore_defaults(Object &, bool dirty)
Definition: mysql_cache_manager.cc:202
bool is_default_user(Object &) const
Definition: mysql_cache_manager.cc:228
MysqlCacheCallbacks(const ConnectionConfiguration &configuration=ConnectionConfiguration{})
Definition: mysql_cache_manager.h:93
Object object_allocate(bool wait) override
Definition: mysql_cache_manager.cc:158
const ConnectionConfiguration & get_connection_configuration() const
Definition: mysql_cache_manager.cc:240
ConnectionConfiguration connection_configuration_
Definition: mysql_cache_manager.h:112
Definition: mysql_cache_manager.h:82
virtual CachedObject get_instance(collector::MySQLConnection type, bool wait)
Definition: mysql_cache_manager.h:168
uint32_t default_mysql_cache_instances_
Definition: mysql_cache_manager.h:257
virtual void change_instance(CachedObject &instance, collector::MySQLConnection type)
Definition: mysql_cache_manager.h:195
static void change_to(CachedObject &instance, MySqlCacheManager *m)
Definition: mysql_cache_manager.h:244
virtual collector::MySQLConnection get_type(const CachedObject &obj)
Definition: mysql_cache_manager.h:155
MysqlCacheCallbacks callbacks_userdata_ro_
Definition: mysql_cache_manager.h:259
MySqlCacheManager::Object Object
Definition: mysql_cache_manager.h:89
virtual void change_cache_object_limit(uint32_t limit)
Definition: mysql_cache_manager.h:234
virtual CachedObject get_control_plane_instance(collector::MySQLConnection type)
Definition: mysql_cache_manager.h:187
virtual ~MysqlCacheManager()=default
MysqlCacheCallbacks callbacks_metadata_ro_
Definition: mysql_cache_manager.h:258
const ConnectionConfiguration & get_connection_configuration(collector::MySQLConnection type) const
Definition: mysql_cache_manager.h:213
MysqlCacheManager(const mrs::Configuration &configuration)
Definition: mysql_cache_manager.h:117
virtual void return_instance(CachedObject &object)
Definition: mysql_cache_manager.h:230
MysqlCacheManager(Callbacks *callbacks_meta, Callbacks *callbacks_user)
Definition: mysql_cache_manager.h:132
virtual CachedObject get_empty(collector::MySQLConnection type, bool wait)
Definition: mysql_cache_manager.h:139
MysqlCacheCallbacks callbacks_metadata_rw_
Definition: mysql_cache_manager.h:260
MySQLSession::ConnectionParameters ConnectionParameters
Definition: mysql_cache_manager.h:85
MysqlCacheCallbacks callbacks_userdata_rw_
Definition: mysql_cache_manager.h:261
Definition: configuration.h:49
Null-terminated string which is securely wiped on destruction.
Definition: secure_string.h:59
Definition: mrs_component_embedded_mysql_cache.h:33
MySQLConnection
Definition: mysql_cache_manager.h:41
@ kMySQLConnectionUserdataRW
Definition: mysql_cache_manager.h:45
@ kMySQLConnectionMetadataRO
Definition: mysql_cache_manager.h:42
@ kMySQLConnectionMetadataRW
Definition: mysql_cache_manager.h:44
@ kMySQLConnectionUserdataRO
Definition: mysql_cache_manager.h:43
CountedMySQLSession::Sqls build_mysql_cache_initial_sqls(MySQLConnection type)
Definition: mysql_cache_manager.cc:147
bool is_rw_connection(MySQLConnection type)
Definition: mysql_cache_manager.cc:132
static bool cb(unsigned long long new_value)
Definition: option_usage.cc:45
collector::CountedMySQLSession::ConnectionParameters ConnectionParameters
Definition: query_retry_on_ro.cc:38
collector::MysqlCacheManager::CachedObject CachedObject
Definition: handler_db_object_function.cc:55
collector::CountedMySQLSession CountedMySQLSession
Definition: mrs_component_embedded_mysql_cache.cc:43
static int wait(mysql_cond_t *that, mysql_mutex_t *mutex_arg, const char *, unsigned int)
Definition: mysql_cond_v1_native.cc:62
static mysql_service_status_t get(THD **thd) noexcept
Definition: mysql_current_thread_reader_all_empty.cc:31
required string configuration
Definition: replication_asynchronous_connection_failover.proto:49
required string type
Definition: replication_group_member_actions.proto:34
Definition: counted_mysql_session.h:42