MySQL 8.3.0
Source Code Documentation
persisted_variable.h
Go to the documentation of this file.
1/* Copyright (c) 2016, 2023, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is also distributed with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23#ifndef PERSISTED_VARIABLE_H_INCLUDED
24#define PERSISTED_VARIABLE_H_INCLUDED
25
26#include <stddef.h>
27#include <map>
28#include <string>
29#include <unordered_set>
30
31#include "map_helpers.h"
32#include "my_alloc.h"
33#include "my_inttypes.h"
34#include "my_psi_config.h"
38#include "sql/psi_memory_key.h"
39#include "sql_string.h"
40
41class Json_dom;
42class Json_object;
43class THD;
44class set_var;
45class sys_var;
46struct MYSQL_FILE;
47
48/**
49 STRUCT st_persist_var
50
51 This structure represents information of a variable which is to
52 be persisted in mysql-auto.cnf file.
53*/
54struct st_persist_var final {
55 std::string key;
56 std::string value;
58 std::string user;
59 std::string host;
60 bool is_null;
62 st_persist_var(THD *thd);
63 st_persist_var(const std::string key, const std::string value,
64 const ulonglong timestamp, const std::string user,
65 const std::string host, const bool is_null);
66 /* This is custom comparison function used to make the unordered_set
67 work with the default std::hash for user defined types. */
68 bool operator==(const st_persist_var &persist_var) const {
69 return key == persist_var.key;
70 }
71};
72
73/**
74 STRUCT st_persist_var_hash
75
76 This structure has a custom hasher function used to make the unordered_set
77 to work with the default std::hash for user defined types.
78*/
80 size_t operator()(const st_persist_var &pv) const { return pv.key.length(); }
81};
82
83/**
84 CLASS Persisted_variables_cache
85 Holds <name,value> pair of all options which needs to be persisted
86 to a file.
87
88 OVERVIEW
89 --------
90 When first SET PERSIST statement is executed we instantiate
91 Persisted_variables_cache which loads the config file if present into
92 m_persisted_dynamic_variables set. This is a singleton operation.
93 m_persisted_dynamic_variables is an in-memory copy of config file itself. If
94 the SET statement passes then this in-memory is updated and flushed to file as
95 an atomic operation.
96
97 Next SET PERSIST statement would only update the in-memory copy and sync
98 to config file instead of loading the file again.
99*/
100
101#ifdef HAVE_PSI_INTERFACE
102void my_init_persist_psi_keys(void);
103#endif /* HAVE_PSI_INTERFACE */
104
109
111 protected:
112 enum class File_version {
113 VERSION_V1 = 1,
115 };
116
117 public:
118 explicit Persisted_variables_cache();
119 int init(int *argc, char ***argv);
121 /**
122 Update in-memory copy for every SET PERSIST statement
123 */
124 bool set_variable(THD *thd, set_var *system_var);
125 /**
126 Driver: Flush in-memory copy to persistent file
127 */
128 bool flush_to_file();
129 /**
130 Write v2 persistent file
131 */
132 bool write_persist_file_v2(String &dest, bool &do_cleanup);
133 /**
134 Driver function: Read options from persistent file
135 */
136 int read_persist_file();
137 /**
138 Read v1 persistent file
139 */
140 int read_persist_file_v1(const Json_object *json_object);
141 /**
142 Read v2 persistent file
143 */
144 int read_persist_file_v2(const Json_object *json_object);
145 /**
146 Search for persisted config file and if found read persistent options
147 */
148 bool load_persist_file();
149 bool set_persisted_options(bool plugin_options,
150 const char *target_var_name = nullptr,
151 int target_var_name_length = 0);
152 /**
153 Reset persisted options
154 */
155 bool reset_persisted_variables(THD *thd, const char *name, bool if_exists);
156
157 /**
158 Get persisted variables
159 */
161 /**
162 Get persisted parse-early variables
163 */
165 /**
166 Get SENSITIVE persisted variables
167 */
169
170 /**
171 Get persisted static variables
172 */
174 /**
175 Get persisted parse-early static variables
176 */
178 /**
179 Get SENSITIVE persisted static variables
180 */
182
183 /**
184 append read only persisted variables to command line options with a
185 separator.
186 */
187 bool append_read_only_variables(int *argc, char ***argv,
188 bool arg_separator_added = false,
189 bool plugin_options = false,
190 MEM_ROOT *root_to_use = nullptr);
191
192 /**
193 append PARSE EARLY read only persisted variables to command
194 line options with a separator.
195 */
196 bool append_parse_early_variables(int *argc, char ***argv,
197 bool &arg_separator_added);
198
199 void cleanup();
200
201 /**
202 Acquire lock on m_persisted_dynamic_variables/m_persisted_static_variables
203 */
205 /**
206 Release lock on m_persisted_dynamic_variables/m_persisted_static_variables
207 */
209 /**
210 Assert caller that owns lock on
211 m_persisted_dynamic_variables/m_persisted_static_variables
212 */
215 }
216 /**
217 Set internal state to reflect keyring support status
218 */
220
221 std::string to_hex(const std::string &value);
222 std::string from_hex(const std::string &value);
223
224 private:
225 /* Helper function to get variable value */
226 static String *get_variable_value(THD *thd, sys_var *system_var, String *str,
227 bool *is_null);
228 /**
229 If the variable has an alias, return the name for the alias.
230 */
231 static const char *get_variable_alias(const sys_var *system_var);
232 static std::string get_variable_alias(const char *name);
233 /* Helper function to extract variables from json formatted string */
235 bool is_read_only = false);
236 /**
237 After extracting the variables from the JSON, we duplicate any
238 variable definition that relates to an alias.
239 */
240 void load_aliases();
241
243 bool get_file_encryption_key(std::unique_ptr<unsigned char[]> &file_key,
244 size_t &file_key_length, bool generate = false);
247
248 /** Helper to set source information for PARSE_EARLY variables */
250
251 /** Helper function to handle changes in option type */
253
254 private:
255 /* Helper functions for file IO */
257 bool open_persist_file(int flag);
259 void close_persist_file();
260
261 private:
262 /*
263 There are two main types of variables:
264 1. Static variables: Those which cannot be set at runtime
265 2. Dynamic variables: Those which can be set on a running server
266
267 Each of these types is further divided in 3 sub-types:
268 A. PARSE_EARLY variables - This set of variables require to be set very
269 early in server start-up sequence
270 B. SENSITIVE variables - This set of variables may be stored in
271 encrypted format if a suitable keyring
272 component is available
273 C. All other variables - These are the variables that do not have
274 none of the mentioned properties
275
276 Two of the above mentioned sub-types exist because we treat
277 variables with certain properties in special manner for reasons mentioned
278 above for each of the In future, more categories may need special
279 treatment and if so, above mentioned sub-categories will increase.
280
281 These gives us total of 6 categories (3 each for static and dynamic
282 types of variables). Each of these categories of variables are processed
283 and/or loaded at different point of time in start-up sequence:
284
285 - 1A and 2A variables are added to command line argument at the very
286 beginning of the start-up
287 - 1B and 2B are decrypted once keyring component is loaded.
288 - 1B and 1C are added to command line
289 - 2B and 2C are set at a later point in start-up cycle when THD
290 initialization is possible. Some of the variables of types 2B and 2C
291 are not processed until corresponding component or plugin is loaded.
292 These subsets of variables are moved to special in-memory containers
293 reserved for them.
294
295 The persisted options file contains 6 JSON objects - one each for
296 above mentioned categories. When file is read, data from each JSON object
297 is loaded in different in-memory containers.
298 */
299
300 /* In memory copy of Persisted PARSE EARLY static variables' values */
302 /* In memory copy of Persisted SENSITIVE static variables' values */
304 /* In memory copy of all other Persisted static variables' values */
306
307 /* In memory copy of Persisted PARSE EARLY dynamic variables' values */
309 /* In memory copy of Persisted SENSITIVE dynamic variables' values */
311 /* In memory copy of all other Persisted dynamic variables' values */
313
314 /*
315 In memory copy of Persisted SENSITIVE dynamic
316 variables whose plugin is not yet installed
317 */
319 /*
320 In memory copy of all other Persisted dynamic
321 variables whose plugin is not yet installed
322 */
324
325 struct Key_info {
326 std::string m_master_key_name{"persisted_variables_key"};
327 std::string m_master_key_type{"AES"};
328 const size_t m_master_key_size{32};
329
330 std::string m_file_key{};
331 std::string m_file_key_iv{};
332 };
333
334 /* Key */
336
337 /* Status of keyring support */
339 /* Sensitive variables blob - HEX representation */
341 /* IV - HEX representation */
342 std::string m_iv{};
343
346
347 /* File handler members */
352 /* Memory for parse early read only persisted options */
355 /* Memory for read only persisted options */
357 /* Memory for read only persisted plugin options */
360
361 /* default version */
363};
364
365#endif /* PERSISTED_VARIABLE_H_INCLUDED */
JSON DOM abstract base class.
Definition: json_dom.h:171
Represents a JSON container value of type "object" (ECMA), type J_OBJECT here.
Definition: json_dom.h:367
Definition: persisted_variable.h:110
Key_info m_key_info
Definition: persisted_variable.h:335
bool m_keyring_support_available
Definition: persisted_variable.h:338
bool append_read_only_variables(int *argc, char ***argv, bool arg_separator_added=false, bool plugin_options=false, MEM_ROOT *root_to_use=nullptr)
append read only persisted variables to command line options with a separator.
Definition: persisted_variable.cc:2062
Persisted_variables_uset * get_persisted_dynamic_variables()
Get persisted variables.
Definition: persisted_variable.cc:2275
bool reset_persisted_variables(THD *thd, const char *name, bool if_exists)
Reset persisted options.
Definition: persisted_variable.cc:2151
void clear_sensitive_blob_and_iv()
Definition: persisted_variable.cc:2336
void unlock()
Release lock on m_persisted_dynamic_variables/m_persisted_static_variables.
Definition: persisted_variable.h:208
void load_aliases()
After extracting the variables from the JSON, we duplicate any variable definition that relates to an...
Definition: persisted_variable.cc:1746
int read_persist_file_v2(const Json_object *json_object)
Read v2 persistent file.
Definition: persisted_variable.cc:1640
void close_persist_file()
Close persisted config file.
Definition: persisted_variable.cc:874
Persisted_variables_uset m_persisted_dynamic_variables
Definition: persisted_variable.h:312
void set_parse_early_sources()
Helper to set source information for PARSE_EARLY variables.
Definition: persisted_variable.cc:891
File_version
Definition: persisted_variable.h:112
bool load_persist_file()
Search for persisted config file and if found read persistent options.
Definition: persisted_variable.cc:886
std::string to_hex(const std::string &value)
Definition: persisted_variable.cc:2341
Persisted_variables_uset * get_persisted_dynamic_parse_early_variables()
Get persisted parse-early variables.
Definition: persisted_variable.cc:2297
bool open_persist_backup_file(int flag)
Open persisted backup config file.
Definition: persisted_variable.cc:864
Persisted_variables_uset m_persisted_dynamic_parse_early_variables
Definition: persisted_variable.h:308
static Persisted_variables_cache * m_instance
Definition: persisted_variable.h:345
return_status decrypt_sensitive_variables()
Decrypt sensitive variables values.
Definition: persisted_variable.cc:2579
int read_persist_file_v1(const Json_object *json_object)
Read v1 persistent file.
Definition: persisted_variable.cc:1525
Persisted_variables_umap * get_persisted_static_sensitive_variables(THD *thd)
Get SENSITIVE persisted static variables.
Definition: persisted_variable.cc:2313
void cleanup()
Definition: persisted_variable.cc:2328
bool write_persist_file_v2(String &dest, bool &do_cleanup)
Write v2 persistent file.
Definition: persisted_variable.cc:674
bool get_file_encryption_key(std::unique_ptr< unsigned char[]> &file_key, size_t &file_key_length, bool generate=false)
Get file encryption key.
Definition: persisted_variable.cc:2380
return_status encrypt_sensitive_variables()
Encrypt sensitive variables values.
Definition: persisted_variable.cc:2507
static Persisted_variables_cache * get_instance()
Return a singleton object.
Definition: persisted_variable.cc:335
MYSQL_FILE * m_fd
Definition: persisted_variable.h:348
void handle_option_type_change()
Helper function to handle changes in option type.
Definition: persisted_variable.cc:1858
MEM_ROOT ro_persisted_argv_alloc
Definition: persisted_variable.h:356
std::string m_persist_filename
Definition: persisted_variable.h:349
Persisted_variables_uset m_persisted_dynamic_plugin_variables
Definition: persisted_variable.h:323
void keyring_support_available()
Set internal state to reflect keyring support status.
Definition: persisted_variable.cc:2651
Persisted_variables_uset m_persisted_dynamic_sensitive_variables
Definition: persisted_variable.h:310
Persisted_variables_umap * get_persisted_static_variables()
Get persisted static variables.
Definition: persisted_variable.cc:2305
std::string from_hex(const std::string &value)
Definition: persisted_variable.cc:2349
return_status
Definition: persisted_variable.h:242
static const char * get_variable_alias(const sys_var *system_var)
If the variable has an alias, return the name for the alias.
Definition: persisted_variable.cc:582
int read_persist_file()
Driver function: Read options from persistent file.
Definition: persisted_variable.cc:1892
Persisted_variables_uset m_persisted_dynamic_sensitive_plugin_variables
Definition: persisted_variable.h:318
bool set_variable(THD *thd, set_var *system_var)
Update in-memory copy for every SET PERSIST statement.
Definition: persisted_variable.cc:375
std::string m_sensitive_variables_blob
Definition: persisted_variable.h:340
Persisted_variables_umap m_persisted_static_variables
Definition: persisted_variable.h:305
Persisted_variables_uset * get_persisted_dynamic_sensitive_variables(THD *thd)
Get SENSITIVE persisted variables.
Definition: persisted_variable.cc:2283
mysql_mutex_t m_LOCK_persist_file
Definition: persisted_variable.h:351
void lock()
Acquire lock on m_persisted_dynamic_variables/m_persisted_static_variables.
Definition: persisted_variable.h:204
static String * get_variable_value(THD *thd, sys_var *system_var, String *str, bool *is_null)
Retrieve variables value from sys_var.
Definition: persisted_variable.cc:556
MEM_ROOT parse_early_persisted_argv_alloc
Definition: persisted_variable.h:353
std::string m_iv
Definition: persisted_variable.h:342
Persisted_variables_umap m_persisted_static_parse_early_variables
Definition: persisted_variable.h:303
Persisted_variables_cache()
Definition: persisted_variable.cc:230
bool append_parse_early_variables(int *argc, char ***argv, bool &arg_separator_added)
append PARSE EARLY read only persisted variables to command line options with a separator.
Definition: persisted_variable.cc:1982
int init(int *argc, char ***argv)
Initialize class members.
Definition: persisted_variable.cc:260
mysql_mutex_t m_LOCK_persist_variables
Definition: persisted_variable.h:344
Persisted_variables_umap m_persisted_static_sensitive_variables
Definition: persisted_variable.h:301
std::string m_persist_backup_filename
Definition: persisted_variable.h:350
void assert_lock_owner()
Assert caller that owns lock on m_persisted_dynamic_variables/m_persisted_static_variables.
Definition: persisted_variable.h:213
bool flush_to_file()
Driver: Flush in-memory copy to persistent file.
Definition: persisted_variable.cc:792
bool open_persist_file(int flag)
Open persisted config file.
Definition: persisted_variable.cc:843
File_version m_default_version
Definition: persisted_variable.h:362
bool set_persisted_options(bool plugin_options, const char *target_var_name=nullptr, int target_var_name_length=0)
set_persisted_options() will set the options read from persisted config file
Definition: persisted_variable.cc:939
bool extract_variables_from_json(const Json_dom *dom, bool is_read_only=false)
extract_variables_from_json() is used to extract all the variable information which is in the form of...
Definition: persisted_variable.cc:1422
Persisted_variables_umap * get_persisted_static_parse_early_variables()
Get persisted parse-early static variables.
Definition: persisted_variable.cc:2324
MEM_ROOT ro_persisted_plugin_argv_alloc
Definition: persisted_variable.h:358
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:166
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:35
set_var_base descendant for assignments to the system variables.
Definition: set_var.h:977
A class representing one system variable - that is something that can be accessed as @global....
Definition: set_var.h:105
#define mysql_mutex_lock(M)
Definition: mysql_mutex.h:49
#define mysql_mutex_unlock(M)
Definition: mysql_mutex.h:56
#define mysql_mutex_assert_owner(M)
Wrapper, to use safe_mutex_assert_owner with instrumented mutexes.
Definition: mysql_mutex.h:111
static int flag
Definition: hp_test1.cc:39
This file follows Google coding style, except for the name MEM_ROOT (which is kept for historical rea...
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:55
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
ABI for instrumented mutexes.
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1065
std::conditional_t< !std::is_array< T >::value, std::unique_ptr< T, detail::Deleter< T > >, std::conditional_t< detail::is_unbounded_array_v< T >, std::unique_ptr< T, detail::Array_deleter< std::remove_extent_t< T > > >, void > > unique_ptr
The following is a common type that is returned by all the ut::make_unique (non-aligned) specializati...
Definition: ut0new.h:2437
void my_init_persist_psi_keys(void)
CLASS Persisted_variables_cache Holds <name,value> pair of all options which needs to be persisted to...
Definition: persisted_variable.cc:160
Instrumentation helpers for mutexes.
Performance schema instrumentation interface.
PSI_memory_key key_memory_persisted_variables_memroot
Definition: psi_memory_key.cc:123
Our own string classes, used pervasively throughout the executor.
case opt name
Definition: sslopt-case.h:32
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:82
An instrumented FILE structure.
Definition: mysql_file.h:483
Definition: persisted_variable.h:325
std::string m_file_key_iv
Definition: persisted_variable.h:331
const size_t m_master_key_size
Definition: persisted_variable.h:328
std::string m_master_key_name
Definition: persisted_variable.h:326
std::string m_master_key_type
Definition: persisted_variable.h:327
std::string m_file_key
Definition: persisted_variable.h:330
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:49
STRUCT st_persist_var_hash.
Definition: persisted_variable.h:79
size_t operator()(const st_persist_var &pv) const
Definition: persisted_variable.h:80
STRUCT st_persist_var.
Definition: persisted_variable.h:54
st_persist_var()
Definition: persisted_variable.cc:200
std::string user
Definition: persisted_variable.h:58
ulonglong timestamp
Definition: persisted_variable.h:57
std::string value
Definition: persisted_variable.h:56
bool is_null
Definition: persisted_variable.h:60
std::string key
Definition: persisted_variable.h:55
std::string host
Definition: persisted_variable.h:59
bool operator==(const st_persist_var &persist_var) const
Definition: persisted_variable.h:68