MySQL 9.4.0
Source Code Documentation
mysql_cache_manager.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2021, 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 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
49 public:
51
54 : type_{type},
55 provider_{is_rw() ? configuration.provider_rw_.get()
56 : configuration.provider_ro_.get()} {
57 switch (type) {
60 mysql_user_ = configuration.mysql_user_;
61 mysql_password_ = configuration.mysql_user_password_;
62 break;
65 mysql_user_ = configuration.mysql_user_data_access_;
66 mysql_password_ = configuration.mysql_user_data_access_password_;
67 break;
68 }
69 }
70
71 bool is_rw() const {
72 switch (type_) {
75 return true;
76 default:
77 return false;
78 }
79 }
80
83 std::string mysql_user_;
85};
86
88 public:
93 using Callbacks = MySqlCacheManager::Callbacks;
95
97 public:
100 const std::string &role = {})
102
103 bool object_before_cache(Object, bool dirty) override;
104 bool object_retrived_from_cache(Object) override;
105 void object_remove(Object) override;
106 Object object_allocate(bool wait) override;
107 bool is_default_user(Object &) const;
108
109 const ConnectionConfiguration &get_connection_configuration() const;
110
111 private:
112 void object_restore_defaults(Object &, bool dirty);
113 bool is_default_server(Object &) const;
114
116
117 private:
119 std::string role_;
121 };
122
123 public:
129 "mysql_rest_service_meta_provider"},
130 callbacks_userdata_ro_{{
133 },
134 "mysql_rest_service_data_provider"},
135 callbacks_metadata_rw_{
137 "mysql_rest_service_meta_provider"},
138 callbacks_userdata_rw_{{
141 },
142 "mysql_rest_service_data_provider"} {}
143 MysqlCacheManager(Callbacks *callbacks_meta, Callbacks *callbacks_user)
144 : default_mysql_cache_instances_{10},
145 cache_manager_metadata_ro_{callbacks_meta},
146 cache_manager_userdata_ro_{callbacks_user} {}
147
148 virtual ~MysqlCacheManager() = default;
149
151 switch (type) {
153 return CachedObject(&cache_manager_metadata_ro_, wait);
155 return CachedObject(&cache_manager_userdata_ro_, wait);
157 return CachedObject(&cache_manager_metadata_rw_, wait);
159 return CachedObject(&cache_manager_userdata_rw_, wait);
160 default:
161 assert(nullptr && "Shouldn't happen");
162 return {};
163 }
164 }
165
167 if (obj.parent_ == &cache_manager_metadata_ro_)
169 else if (obj.parent_ == &cache_manager_metadata_ro_)
171 else if (obj.parent_ == &cache_manager_metadata_rw_)
173 else if (obj.parent_ == &cache_manager_userdata_rw_)
175
177 }
178
180 bool wait) {
181 switch (type) {
183 return cache_manager_metadata_ro_.get_instance(wait);
185 return cache_manager_userdata_ro_.get_instance(wait);
187 return cache_manager_metadata_rw_.get_instance(wait);
189 return cache_manager_userdata_rw_.get_instance(wait);
190 default:
191 assert(nullptr && "Shouldn't happen");
192 return {};
193 }
194 }
195
196 std::unique_ptr<collector::CountedMySQLSession> clone_instance(
198
199 virtual void change_instance(CachedObject &instance,
201 switch (type) {
203 change_to(instance, &cache_manager_metadata_ro_);
204 break;
206 change_to(instance, &cache_manager_userdata_ro_);
207 break;
209 change_to(instance, &cache_manager_metadata_rw_);
210 break;
212 change_to(instance, &cache_manager_userdata_rw_);
213 break;
214 }
215 }
216
219 switch (type) {
221 return callbacks_metadata_ro_.get_connection_configuration();
223 return callbacks_userdata_ro_.get_connection_configuration();
225 return callbacks_metadata_rw_.get_connection_configuration();
227 return callbacks_userdata_rw_.get_connection_configuration();
228 default:
229 assert(nullptr && "Shouldn't happen");
230 throw std::logic_error("internal error");
231 }
232 }
233
234 virtual void return_instance(CachedObject &object) {
235 if (object.parent_) object.parent_->return_instance(object);
236 }
237
238 virtual void change_cache_object_limit(uint32_t limit) {
239 cache_manager_metadata_ro_.change_cache_object_limit(limit);
240 cache_manager_userdata_ro_.change_cache_object_limit(limit);
241 cache_manager_metadata_rw_.change_cache_object_limit(limit);
242 cache_manager_userdata_rw_.change_cache_object_limit(limit);
243 }
244
245 void configure(const std::string &json_object);
246
247 private:
248 static void change_to(CachedObject &instance, MySqlCacheManager *m) {
249 if (instance.parent_ != m) {
250 instance.parent_ = m;
251 if (instance.get()) {
252 auto cb = dynamic_cast<MysqlCacheCallbacks *>(m->get_callbacks());
253
254 instance.get()->change_user(
255 cb->get_connection_configuration().mysql_user_,
256 cb->get_connection_configuration().mysql_password_, "");
257 }
258 }
259 }
260
266 MySqlCacheManager cache_manager_metadata_ro_{&callbacks_metadata_ro_,
267 default_mysql_cache_instances_};
268 MySqlCacheManager cache_manager_userdata_ro_{&callbacks_userdata_ro_,
269 default_mysql_cache_instances_};
270 MySqlCacheManager cache_manager_metadata_rw_{&callbacks_metadata_rw_,
271 default_mysql_cache_instances_};
272 MySqlCacheManager cache_manager_userdata_rw_{&callbacks_userdata_rw_,
273 default_mysql_cache_instances_};
274};
275
276} // namespace collector
277
278#endif // ROUTER_SRC_REST_MRS_SRC_CONNECTION_CACHE_MANAGER_H_
Definition: cache_manager.h:41
Object get()
Definition: cache_manager.h:77
CacheManager * parent_
Definition: cache_manager.h:106
Definition: cache_manager.h:114
CacheManager::Object Object
Definition: cache_manager.h:116
CountedMySQLSession * Object
Definition: cache_manager.h:38
Callbacks * get_callbacks() const
Definition: cache_manager.h:170
Definition: mysql_cache_manager.h:48
std::string mysql_user_
Definition: mysql_cache_manager.h:83
DestinationProvider * provider_
Definition: mysql_cache_manager.h:82
ConnectionConfiguration(MySQLConnection type, const mrs::Configuration &configuration)
Definition: mysql_cache_manager.h:52
mysql_harness::SecureString mysql_password_
Definition: mysql_cache_manager.h:84
MySQLConnection type_
Definition: mysql_cache_manager.h:81
bool is_rw() const
Definition: mysql_cache_manager.h:71
Definition: counted_mysql_session.h:38
Definition: destination_provider.h:37
Definition: mysql_cache_manager.h:96
bool object_retrived_from_cache(Object) override
Definition: mysql_cache_manager.cc:143
bool is_default_server(Object &) const
Definition: mysql_cache_manager.cc:170
ConnectionParameters new_connection_params(bool wait)
Definition: mysql_cache_manager.cc:198
bool object_before_cache(Object, bool dirty) override
Definition: mysql_cache_manager.cc:126
void object_remove(Object) override
Definition: mysql_cache_manager.cc:121
int node_rount_robin_
Definition: mysql_cache_manager.h:120
void object_restore_defaults(Object &, bool dirty)
Definition: mysql_cache_manager.cc:155
bool is_default_user(Object &) const
Definition: mysql_cache_manager.cc:181
MysqlCacheCallbacks(const ConnectionConfiguration &configuration=ConnectionConfiguration{}, const std::string &role={})
Definition: mysql_cache_manager.h:98
Object object_allocate(bool wait) override
Definition: mysql_cache_manager.cc:103
const ConnectionConfiguration & get_connection_configuration() const
Definition: mysql_cache_manager.cc:193
ConnectionConfiguration connection_configuration_
Definition: mysql_cache_manager.h:118
std::string role_
Definition: mysql_cache_manager.h:119
Definition: mysql_cache_manager.h:87
virtual CachedObject get_instance(collector::MySQLConnection type, bool wait)
Definition: mysql_cache_manager.h:179
uint32_t default_mysql_cache_instances_
Definition: mysql_cache_manager.h:261
virtual void change_instance(CachedObject &instance, collector::MySQLConnection type)
Definition: mysql_cache_manager.h:199
static void change_to(CachedObject &instance, MySqlCacheManager *m)
Definition: mysql_cache_manager.h:248
virtual collector::MySQLConnection get_type(const CachedObject &obj)
Definition: mysql_cache_manager.h:166
MysqlCacheCallbacks callbacks_userdata_ro_
Definition: mysql_cache_manager.h:263
MySqlCacheManager::Object Object
Definition: mysql_cache_manager.h:94
virtual void change_cache_object_limit(uint32_t limit)
Definition: mysql_cache_manager.h:238
virtual ~MysqlCacheManager()=default
MysqlCacheCallbacks callbacks_metadata_ro_
Definition: mysql_cache_manager.h:262
const ConnectionConfiguration & get_connection_configuration(collector::MySQLConnection type) const
Definition: mysql_cache_manager.h:217
MysqlCacheManager(const mrs::Configuration &configuration)
Definition: mysql_cache_manager.h:124
virtual void return_instance(CachedObject &object)
Definition: mysql_cache_manager.h:234
MysqlCacheManager(Callbacks *callbacks_meta, Callbacks *callbacks_user)
Definition: mysql_cache_manager.h:143
virtual CachedObject get_empty(collector::MySQLConnection type, bool wait)
Definition: mysql_cache_manager.h:150
MysqlCacheCallbacks callbacks_metadata_rw_
Definition: mysql_cache_manager.h:264
MySQLSession::ConnectionParameters ConnectionParameters
Definition: mysql_cache_manager.h:90
MysqlCacheCallbacks callbacks_userdata_rw_
Definition: mysql_cache_manager.h:265
Definition: configuration.h:49
Null-terminated string which is securely wiped on destruction.
Definition: secure_string.h:59
Definition: cache_manager.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
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
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:41