MySQL 9.1.0
Source Code Documentation
resource_group_mgr.h
Go to the documentation of this file.
1/* Copyright (c) 2017, 2024, 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 designed to work 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 either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef RESOURCEGROUPS_RESOURCE_GROUP_MGR_H_
25#define RESOURCEGROUPS_RESOURCE_GROUP_MGR_H_
26
27#include <stdint.h>
28#include <memory>
29#include <string>
30#include <vector>
31
32#include "my_dbug.h"
33#include "my_inttypes.h"
43#include "sql/debug_sync.h"
44#include "sql/log.h"
45#include "sql/mdl.h"
47#include "sql/sql_class.h"
48#include "string_with_len.h"
49
50namespace dd {
51class Resource_group;
52} // namespace dd
53namespace resourcegroups {
54class Resource_group;
55} // namespace resourcegroups
56template <class Key, class Value>
58
59namespace resourcegroups {
60
61extern const char *SYS_DEFAULT_RESOURCE_GROUP_NAME;
62extern const char *USR_DEFAULT_RESOURCE_GROUP_NAME;
63
64/**
65 This is a singleton class that provides various functionalities related to
66 Resource group management, more importantly the managing and the mapping of
67 resource group names to the corresponding in-memory resource group object.
68*/
69
71 public:
72 /**
73 Singleton method to return an instance of this class.
74 */
75
77
78 /**
79 Destroy the singleton instance.
80 */
81
82 static void destroy_instance();
83
84 /**
85 Check if support for Resource group exists at runtime.
86
87 @return true if resource group feature is supported else false.
88 */
89
91
92 /**
93 Reason for resource group not being supported.
94
95 @return pointer to string which indicate reason for resource group
96 unsupported
97 */
98
99 const char *unsupport_reason() { return m_unsupport_reason.c_str(); }
100
101 /**
102 Set reason for resource group not being supported.
103
104 @param reason string representing reason for resource group unsupported.
105 */
106
107 void set_unsupport_reason(const std::string &reason) {
108 m_unsupport_reason = reason;
109 }
110
111 /**
112 Initialize the Resource group manager.
113 Must be called before instance() can be used.
114
115 @return true if initialization failed, false otherwise.
116 */
117
118 bool init();
119
120 /**
121 Post initialization sequence during mysqld startup.
122
123 @return true if post initialization failed, else false.
124 */
125
126 bool post_init();
127
128 /**
129 Disable and deinitialize the resource group if it was initialized before.
130 */
131
134 LogErr(INFORMATION_LEVEL, ER_RES_GRP_FEATURE_NOT_AVAILABLE);
135 deinit();
137 }
138 }
139
140 /**
141 Get the in-memory Resource group object corresponding
142 to a resource group name.
143
144 @param resource_group_name Name of the resource group.
145 @return Pointer to the Resource group if it exists else nullptr.
146 */
147
148 Resource_group *get_resource_group(const std::string &resource_group_name);
149
150 /**
151 Get the thread attributes identified by PSI thread ID.
152
153 @param [out] pfs_thread_attr Pointer to thread attribute object which
154 shall be populated if the call is successful.
155 @param thread_id PFS thread identifier representing a thread of mysqld.
156
157 @return true if call failed else false.
158 */
159
164 nullptr, thread_id, pfs_thread_attr) != 0;
165 }
166
167 /**
168 Add the resource group to the Resource group map.
169
170 @param resource_group_ptr pointer to in-memory Resource_group.
171 @return true if the call failed else false.
172 */
173
174 bool add_resource_group(std::unique_ptr<Resource_group> resource_group_ptr);
175
176 /**
177 Remove the resource group from the map identified by it's name.
178
179 @param name of the resource group.
180 */
181
182 void remove_resource_group(const std::string &name);
183
184 /**
185 Create an in-memory resource group identified by its attributes
186 and add it to the resource group map.
187
188 @param name Name of resource group.
189 @param type Type of resource group.
190 @param enabled Is resource group enabled?
191 @param cpus Pointer to list of Range objects representing CPU IDS.
192 @param thr_priority Thread priority.
193
194 @returns Pointer to Resource Group object if call is successful else null.
195 */
196
198 const LEX_CSTRING &name, Type type, bool enabled,
199 std::unique_ptr<std::vector<Range>> cpus, int thr_priority);
200
201 /**
202 Move the Resource group of the current thread identified by from_res_group
203 to the Resource group to_res_grp.
204
205 @param from_res_grp Pointer to current Resource_group of the thread.
206 @param to_res_grp Pointer to the destination Resource group which the
207 thread will be switched to.
208 @return true if move_resource_group failed else false.
209 */
210
211 bool move_resource_group(Resource_group *from_res_grp,
212 Resource_group *to_res_grp);
213
214 /**
215 Deserialize a DD resource group object into an
216 in-memory Resource group object.
217
218 @param res_grp Pointer to DD Resource_group object.
219 @return Pointer to in-memory Resource_group subject if
220 Successful else null.
221 */
222
224
225 /**
226 Set Resource group name in the PFS table performance_schema.threads for
227 the PFS thread id.
228
229 @param name Pointer to name of resource group.
230 @param length length of the resource group name.
231 @param thread_id PFS thread id of the thread,
232 */
233
237 nullptr, thread_id, name, length, nullptr);
238 }
239
240 /**
241 Return the SYS_default resource group instance.
242
243 @return pointer to the SYS_default resource group.
244 */
245
248 }
249
250 /**
251 Return the USR_default resource group instance.
252
253 @return pointer to the USR_default resource group.
254 */
255
258 }
259
260 /**
261 Get names of SYS_default and USR_default resource groups.
262 Called by thread_create_callback only.
263 */
266 }
269 }
270
271 /**
272 Check if a given Resource group is either SYS_default or USR_default.
273
274 @return true if resource is USR_default or SYS_default else false.
275 */
276
278 return (res_grp == m_usr_default_resource_group ||
280 }
281
282 /**
283 Check if a thread priority setting can be done.
284
285 @return true if thread priority setting could be done else false.
286 */
287
291 }
292
293 /**
294 Acquire an shared MDL lock on resource group name.
295
296 @param thd Pointer to THD context.
297 @param res_grp_name Resource group name.
298 @param lock_duration Duration of lock.
299 @param[out] ticket reference to ticket object.
300 @param acquire_lock true if one needs to wait on lock
301 else false.
302
303 @return true if lock acquisition failed else false.
304 */
305
306 bool acquire_shared_mdl_for_resource_group(THD *thd, const char *res_grp_name,
307 enum_mdl_duration lock_duration,
308 MDL_ticket **ticket,
309 bool acquire_lock);
310
311 /**
312 Release the shared MDL lock held on a resource group.
313
314 @param thd THD context.
315 @param ticket Pointer to lock ticket object.
316 */
317
319 assert(ticket != nullptr);
320 thd->mdl_context.release_lock(ticket);
321 }
322
323 /**
324 String corresponding to the type of resource group.
325
326 @param type Type of resource group.
327
328 @return string corresponding to resource group type.
329 */
330
331 const char *resource_group_type_str(const Type &type) {
332 return type == Type::USER_RESOURCE_GROUP ? "User" : "System";
333 }
334
335 /**
336 Number of VCPUs present in the system.
337
338 @returns Number of VCPUs in the system.
339 */
340
341 uint32_t num_vcpus() { return m_num_vcpus; }
342
343 void deinit();
344
345#ifndef NDEBUG // The belows methods are required in debug build for testing.
347#endif
348
349 /**
350 Switch Resource Group if it is requested by environment.
351
352 @param thd THD context.
353 @param[out] src_res_grp Original resource group from that
354 switching is performed
355 @param[out] dest_res_grp Destination resource group to that
356 switching is performed
357 @param[out] ticket Pointer to MDL ticket object.
358 @param[out] cur_ticket Pointer to current resource group MDL ticket
359 object.
360
361 @return true if switching was performed, else false
362 */
363
365 THD *thd, resourcegroups::Resource_group **src_res_grp,
366 resourcegroups::Resource_group **dest_res_grp, MDL_ticket **ticket,
367 MDL_ticket **cur_ticket);
368
369 /**
370 Restore original resource group if
371 resource group switching was performed before.
372
373 @param thd Thread context.
374 @param[out] src_res_grp resource group to that
375 switching was performed
376 @param[out] dest_res_grp original resource group to that
377 switching is performed
378*/
379
381 THD *thd, resourcegroups::Resource_group *src_res_grp,
382 resourcegroups::Resource_group *dest_res_grp) {
384 if (thd->resource_group_ctx()->m_cur_resource_group == nullptr ||
385 thd->resource_group_ctx()->m_cur_resource_group == src_res_grp) {
387 dest_res_grp, thd->resource_group_ctx()->m_cur_resource_group);
388 }
390 DBUG_EXECUTE_IF("pause_after_rg_switch", {
391 const char act[] =
392 "now "
393 "SIGNAL restore_finished";
394 assert(!debug_sync_set_action(thd, STRING_WITH_LEN(act)));
395 };);
396 }
397
398 private:
399 /**
400 Pointer to singleton instance of the Resource_group_mgr class.
401 */
403
404 /**
405 Handles to the PFS registry, Resource Group and
406 Notification services.
407 */
408
410 SERVICE_TYPE(pfs_resource_group_v3) * m_resource_group_svc;
411 SERVICE_TYPE(pfs_notification_v3) * m_notify_svc;
415
416 /**
417 Pointer to USR_default and SYS_default resource groups.
418 Owernship of these pointers is resource group hash.
419 */
422
423 /**
424 Map mapping resource group name with it's corresponding in-memory
425 Resource_group object
426 */
429
430 /**
431 Lock protecting the resource group map.
432 */
434
435 /**
436 Boolean value indicating whether setting of thread priority is allowed.
437 */
439
440 /**
441 Bool value indicating support for resource group.
442 */
444
445 /**
446 String indicating reason for resource group not being supported.
447 */
449
450 /**
451 Value indicating the number of vcpus in the system. This is initialized
452 during startup so that we do not call the platform API every time
453 which is expensive.
454 */
455 uint32_t m_num_vcpus;
456
469 m_num_vcpus(0) {}
470
472
473 // Disable copy construction and assignment for Resource_group_mgr class.
475 void operator=(const Resource_group_mgr &) = delete;
476};
477} // namespace resourcegroups
478#endif // RESOURCEGROUPS_RESOURCE_GROUP_MGR_H_
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:251
void release_lock(MDL_ticket *ticket)
Release lock with explicit duration.
Definition: mdl.cc:4269
A granted metadata lock.
Definition: mdl.h:986
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
MDL_context mdl_context
Definition: sql_class.h:966
resourcegroups::Resource_group_ctx * resource_group_ctx()
Get resource group context.
Definition: sql_class.h:4029
mysql_mutex_t LOCK_thd_data
Protects THD data accessed from other threads.
Definition: sql_class.h:1237
std::unordered_map, but with my_malloc and collation-aware comparison.
Definition: map_helpers.h:219
Definition: resource_group.h:49
This is a singleton class that provides various functionalities related to Resource group management,...
Definition: resource_group_mgr.h:70
static Resource_group_mgr * m_instance
Pointer to singleton instance of the Resource_group_mgr class.
Definition: resource_group_mgr.h:402
my_h_service m_h_res_grp_svc
Definition: resource_group_mgr.h:412
void restore_original_resource_group(THD *thd, resourcegroups::Resource_group *src_res_grp, resourcegroups::Resource_group *dest_res_grp)
Restore original resource group if resource group switching was performed before.
Definition: resource_group_mgr.h:380
void deinit()
Definition: resource_group_mgr.cc:274
void set_unsupport_reason(const std::string &reason)
Set reason for resource group not being supported.
Definition: resource_group_mgr.h:107
void remove_resource_group(const std::string &name)
Remove the resource group from the map identified by it's name.
Definition: resource_group_mgr.cc:492
Resource_group_mgr(const Resource_group_mgr &)=delete
bool init()
Initialize the Resource group manager.
Definition: resource_group_mgr.cc:313
bool thread_priority_available()
Check if a thread priority setting can be done.
Definition: resource_group_mgr.h:288
collation_unordered_map< std::string, std::unique_ptr< Resource_group > > * m_resource_group_hash
Map mapping resource group name with it's corresponding in-memory Resource_group object.
Definition: resource_group_mgr.h:428
const char * resource_group_type_str(const Type &type)
String corresponding to the type of resource group.
Definition: resource_group_mgr.h:331
Resource_group * deserialize_resource_group(const dd::Resource_group *res_grp)
Deserialize a DD resource group object into an in-memory Resource group object.
Definition: resource_group_mgr.cc:216
const mysql_service_pfs_resource_group_v3_t * m_resource_group_svc
Definition: resource_group_mgr.h:410
Resource_group_mgr()
Definition: resource_group_mgr.h:457
my_h_service m_h_notification_svc
Definition: resource_group_mgr.h:413
uint32_t m_num_vcpus
Value indicating the number of vcpus in the system.
Definition: resource_group_mgr.h:455
void operator=(const Resource_group_mgr &)=delete
bool disable_pfs_notification()
Definition: resource_group_mgr.cc:526
Resource_group * sys_default_resource_group()
Return the SYS_default resource group instance.
Definition: resource_group_mgr.h:246
bool switch_resource_group_if_needed(THD *thd, resourcegroups::Resource_group **src_res_grp, resourcegroups::Resource_group **dest_res_grp, MDL_ticket **ticket, MDL_ticket **cur_ticket)
Switch Resource Group if it is requested by environment.
Definition: resource_group_mgr.cc:536
bool acquire_shared_mdl_for_resource_group(THD *thd, const char *res_grp_name, enum_mdl_duration lock_duration, MDL_ticket **ticket, bool acquire_lock)
Acquire an shared MDL lock on resource group name.
Definition: resource_group_mgr.cc:254
void disable_resource_group()
Disable and deinitialize the resource group if it was initialized before.
Definition: resource_group_mgr.h:132
Resource_group * usr_default_resource_group()
Return the USR_default resource group instance.
Definition: resource_group_mgr.h:256
void release_shared_mdl_for_resource_group(THD *thd, MDL_ticket *ticket)
Release the shared MDL lock held on a resource group.
Definition: resource_group_mgr.h:318
mysql_rwlock_t m_map_rwlock
Lock protecting the resource group map.
Definition: resource_group_mgr.h:433
bool is_resource_group_default(const Resource_group *res_grp)
Check if a given Resource group is either SYS_default or USR_default.
Definition: resource_group_mgr.h:277
const char * usr_default_resource_group_name()
Definition: resource_group_mgr.h:267
Resource_group * create_and_add_in_resource_group_hash(const LEX_CSTRING &name, Type type, bool enabled, std::unique_ptr< std::vector< Range > > cpus, int thr_priority)
Create an in-memory resource group identified by its attributes and add it to the resource group map.
Definition: resource_group_mgr.cc:501
bool add_resource_group(std::unique_ptr< Resource_group > resource_group_ptr)
Add the resource group to the Resource group map.
Definition: resource_group_mgr.cc:480
bool move_resource_group(Resource_group *from_res_grp, Resource_group *to_res_grp)
Move the Resource group of the current thread identified by from_res_group to the Resource group to_r...
Definition: resource_group_mgr.cc:422
bool m_thread_priority_available
Boolean value indicating whether setting of thread priority is allowed.
Definition: resource_group_mgr.h:438
bool m_resource_group_support
Bool value indicating support for resource group.
Definition: resource_group_mgr.h:443
static Resource_group_mgr * instance()
Singleton method to return an instance of this class.
Definition: resource_group_mgr.cc:99
Resource_group * m_usr_default_resource_group
Pointer to USR_default and SYS_default resource groups.
Definition: resource_group_mgr.h:420
const char * unsupport_reason()
Reason for resource group not being supported.
Definition: resource_group_mgr.h:99
bool resource_group_support()
Check if support for Resource group exists at runtime.
Definition: resource_group_mgr.h:90
const mysql_service_pfs_notification_v3_t * m_notify_svc
Definition: resource_group_mgr.h:411
static void destroy_instance()
Destroy the singleton instance.
Definition: resource_group_mgr.cc:455
const char * sys_default_resource_group_name()
Get names of SYS_default and USR_default resource groups.
Definition: resource_group_mgr.h:264
uint32_t num_vcpus()
Number of VCPUs present in the system.
Definition: resource_group_mgr.h:341
const mysql_service_registry_t * m_registry_svc
Handles to the PFS registry, Resource Group and Notification services.
Definition: resource_group_mgr.h:409
int m_notify_handle
Definition: resource_group_mgr.h:414
Resource_group * get_resource_group(const std::string &resource_group_name)
Get the in-memory Resource group object corresponding to a resource group name.
Definition: resource_group_mgr.cc:463
bool get_thread_attributes(PSI_thread_attrs *pfs_thread_attr, ulonglong thread_id)
Get the thread attributes identified by PSI thread ID.
Definition: resource_group_mgr.h:160
Resource_group * m_sys_default_resource_group
Definition: resource_group_mgr.h:421
bool post_init()
Post initialization sequence during mysqld startup.
Definition: resource_group_mgr.cc:289
void set_res_grp_in_pfs(const char *name, int length, ulonglong thread_id)
Set Resource group name in the PFS table performance_schema.threads for the PFS thread id.
Definition: resource_group_mgr.h:234
std::string m_unsupport_reason
String indicating reason for resource group not being supported.
Definition: resource_group_mgr.h:448
Class that represents an abstraction of the Resource Group.
Definition: resource_group.h:44
#define mysql_mutex_lock(M)
Definition: mysql_mutex.h:50
#define mysql_mutex_unlock(M)
Definition: mysql_mutex.h:57
struct my_h_service_imp * my_h_service
A handle type for acquired Service.
Definition: registry.h:33
Error logging, slow query logging, general query logging: If it's server-internal,...
#define LogErr(severity, ecode,...)
Definition: log_builtins.h:856
enum_mdl_duration
Duration of metadata lock.
Definition: mdl.h:334
#define DBUG_EXECUTE_IF(keyword, a1)
Definition: my_dbug.h:171
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
@ INFORMATION_LEVEL
Definition: my_loglevel.h:45
static my_thread_id thread_id
Definition: my_thr_init.cc:63
Instrumentation helpers for rwlock.
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:43
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
Definition: dd_resource_group.h:29
Type
Definition: resource_group_basic_types.h:33
const char * SYS_DEFAULT_RESOURCE_GROUP_NAME
Definition: resource_group_mgr.cc:68
const char * USR_DEFAULT_RESOURCE_GROUP_NAME
Definition: resource_group_mgr.cc:69
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:2440
Instrumentation helpers for mutexes.
Performance schema instrumentation interface.
required string type
Definition: replication_group_member_actions.proto:34
required bool enabled
Definition: replication_group_member_actions.proto:33
#define SERVICE_TYPE(name)
Generates the standard Service type name.
Definition: service.h:76
Declarations for the Debug Sync Facility.
case opt name
Definition: sslopt-case.h:29
#define STRING_WITH_LEN(X)
Definition: string_with_len.h:29
Definition: mysql_lex_string.h:40
Performance Schema thread type: user/foreground or system/background.
Definition: psi_thread_bits.h:470
An instrumented rwlock structure.
Definition: mysql_rwlock_bits.h:51
Resource_group * m_cur_resource_group
Definition: resource_group_basic_types.h:55
get_thread_system_attrs_by_id_v3_t get_thread_system_attrs_by_id
Definition: pfs_resource_group.h:136
set_thread_resource_group_by_id_v1_t set_thread_resource_group_by_id
Definition: pfs_resource_group.h:134