MySQL 8.0.32
Source Code Documentation
resource_group_mgr.h
Go to the documentation of this file.
1/* Copyright (c) 2017, 2022, 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 RESOURCEGROUPS_RESOURCE_GROUP_MGR_H_
24#define RESOURCEGROUPS_RESOURCE_GROUP_MGR_H_
25
26#include <stdint.h>
27#include <memory>
28#include <string>
29#include <vector>
30
31#include "m_string.h"
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
49namespace dd {
50class Resource_group;
51} // namespace dd
52namespace resourcegroups {
53class Resource_group;
54} // namespace resourcegroups
55template <class Key, class Value>
57
58namespace resourcegroups {
59
60extern const char *SYS_DEFAULT_RESOURCE_GROUP_NAME;
61extern const char *USR_DEFAULT_RESOURCE_GROUP_NAME;
62extern const char *SYS_INTERNAL_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 Extract(unlink) the resource group from the map identified by it's name.
186
187 @param name of the resource group.
188 */
189 void extract_resource_group(const std::string &name);
190
191 /**
192 Create an in-memory resource group identified by its attributes
193 and add it to the resource group map.
194
195 @param name Name of resource group.
196 @param type Type of resource group.
197 @param enabled Is resource group enabled?
198 @param cpus Pointer to list of Range objects representing CPU IDS.
199 @param thr_priority Thread priority.
200
201 @returns Pointer to Resource Group object if call is successful else null.
202 */
203
205 const LEX_CSTRING &name, Type type, bool enabled,
206 std::unique_ptr<std::vector<Range>> cpus, int thr_priority);
207
208 /**
209 Move the Resource group of the current thread identified by from_res_group
210 to the Resource group to_res_grp.
211
212 @param from_res_grp Pointer to current Resource_group of the thread.
213 @param to_res_grp Pointer to the destination Resource group which the
214 thread will be switched to.
215 @return true if move_resource_group failed else false.
216 */
217
218 bool move_resource_group(Resource_group *from_res_grp,
219 Resource_group *to_res_grp);
220
221 /**
222 Deserialize a DD resource group object into an
223 in-memory Resource group object.
224
225 @param res_grp Pointer to DD Resource_group object.
226 @return Pointer to in-memory Resource_group subject if
227 Successful else null.
228 */
229
231
232 /**
233 Set Resource group name in the PFS table performance_schema.threads for
234 the PFS thread id.
235
236 @param name Pointer to name of resource group.
237 @param length length of the resource group name.
238 @param thread_id PFS thread id of the thread,
239 */
240
244 nullptr, thread_id, name, length, nullptr);
245 }
246
247 /**
248 Return the SYS_default resource group instance.
249
250 @return pointer to the SYS_default resource group.
251 */
252
255 }
256
257 /**
258 Return the SYS_internal resource group instance.
259
260 @return pointer to the SYS_internal resource group.
261 */
262
265 }
266
267 /**
268 Return the USR_default resource group instance.
269
270 @return pointer to the USR_default resource group.
271 */
272
275 }
276
277 /**
278 Get names of SYS_default and USR_default resource groups.
279 Called by thread_create_callback only.
280 */
283 }
286 }
287
288 /**
289 Check if a given Resource group is either SYS_default or USR_default.
290
291 @return true if resource is USR_default or SYS_default else false.
292 */
293
295 return (res_grp == m_usr_default_resource_group ||
297 }
298
299 /**
300 Check if a given Resource group is SYS_internal.
301
302 @param res_grp Resource group instance.
303
304 @return true if resource is SYS_internal else false.
305 */
306
308 return (res_grp == m_sys_internal_resource_group);
309 }
310
311 /**
312 Check if a thread priority setting can be done.
313
314 @return true if thread priority setting could be done else false.
315 */
316
320 }
321
322 /**
323 Acquire an shared MDL lock on resource group name.
324
325 @param thd Pointer to THD context.
326 @param res_grp_name Resource group name.
327 @param lock_duration Duration of lock.
328 @param[out] ticket reference to ticket object.
329 @param acquire_lock true if one needs to wait on lock
330 else false.
331
332 @return true if lock acquisition failed else false.
333 */
334
335 bool acquire_shared_mdl_for_resource_group(THD *thd, const char *res_grp_name,
336 enum_mdl_duration lock_duration,
337 MDL_ticket **ticket,
338 bool acquire_lock);
339
340 /**
341 Release the shared MDL lock held on a resource group.
342
343 @param thd THD context.
344 @param ticket Pointer to lock ticket object.
345 */
346
348 assert(ticket != nullptr);
349 thd->mdl_context.release_lock(ticket);
350 }
351
352 /**
353 String corresponding to the type of resource group.
354
355 @param type Type of resource group.
356
357 @return string corresponding to resource group type.
358 */
359
360 const char *resource_group_type_str(const Type &type) {
361 return type == Type::USER_RESOURCE_GROUP ? "User" : "System";
362 }
363
364 /**
365 Number of VCPUs present in the system.
366
367 @returns Number of VCPUs in the system.
368 */
369
370 uint32_t num_vcpus() { return m_num_vcpus; }
371
372 void deinit();
373
374#ifndef NDEBUG // The belows methods are required in debug build for testing.
376#endif
377
378 /**
379 Switch Resource Group if it is requested by environment.
380
381 @param thd THD context.
382 @param[out] src_res_grp Original resource group from that
383 switching is performed
384 @param[out] dest_res_grp Destination resource group to that
385 switching is performed
386 @param[out] ticket Pointer to MDL ticket object.
387 @param[out] cur_ticket Pointer to current resource group MDL ticket
388 object.
389
390 @return true if switching was performed, else false
391 */
392
394 THD *thd, resourcegroups::Resource_group **src_res_grp,
395 resourcegroups::Resource_group **dest_res_grp, MDL_ticket **ticket,
396 MDL_ticket **cur_ticket);
397
398 /**
399 Restore original resource group if
400 resource group switching was performed before.
401
402 @param thd Thread context.
403 @param[out] src_res_grp resource group to that
404 switching was performed
405 @param[out] dest_res_grp original resource group to that
406 switching is performed
407*/
408
410 THD *thd, resourcegroups::Resource_group *src_res_grp,
411 resourcegroups::Resource_group *dest_res_grp) {
413 if (thd->resource_group_ctx()->m_cur_resource_group == nullptr ||
414 thd->resource_group_ctx()->m_cur_resource_group == src_res_grp) {
416 dest_res_grp, thd->resource_group_ctx()->m_cur_resource_group);
417 }
419 DBUG_EXECUTE_IF("pause_after_rg_switch", {
420 const char act[] =
421 "now "
422 "SIGNAL restore_finished";
423 assert(!debug_sync_set_action(thd, STRING_WITH_LEN(act)));
424 };);
425 }
426
427 private:
428 /**
429 Pointer to singleton instance of the Resource_group_mgr class.
430 */
432
433 /**
434 Handles to the PFS registry, Resource Group and
435 Notification services.
436 */
437
439 SERVICE_TYPE(pfs_resource_group_v3) * m_resource_group_svc;
440 SERVICE_TYPE(pfs_notification_v3) * m_notify_svc;
444
445 /**
446 Pointer to USR_default and SYS_default resource groups.
447 Owernship of these pointers is resource group hash.
448 */
451
452 /** Pointer to SYS_internal resource group. */
454
455 /**
456 Map mapping resource group name with it's corresponding in-memory
457 Resource_group object
458 */
461
462 /**
463 Lock protecting the resource group map.
464 */
466
467 /**
468 Boolean value indicating whether setting of thread priority is allowed.
469 */
471
472 /**
473 Bool value indicating support for resource group.
474 */
476
477 /**
478 String indicating reason for resource group not being supported.
479 */
481
482 /**
483 Value indicating the number of vcpus in the system. This is initialized
484 during startup so that we do not call the platform API every time
485 which is expensive.
486 */
487 uint32_t m_num_vcpus;
488
502 m_num_vcpus(0) {}
503
505
506 // Disable copy construction and assignment for Resource_group_mgr class.
508 void operator=(const Resource_group_mgr &) = delete;
509};
510} // namespace resourcegroups
511#endif // RESOURCEGROUPS_RESOURCE_GROUP_MGR_H_
void release_lock(MDL_ticket *ticket)
Release lock with explicit duration.
Definition: mdl.cc:4203
A granted metadata lock.
Definition: mdl.h:983
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:33
MDL_context mdl_context
Definition: sql_class.h:960
resourcegroups::Resource_group_ctx * resource_group_ctx()
Get resource group context.
Definition: sql_class.h:3942
mysql_mutex_t LOCK_thd_data
Protects THD data accessed from other threads.
Definition: sql_class.h:1207
std::unordered_map, but with my_malloc and collation-aware comparison.
Definition: map_helpers.h:209
Definition: resource_group.h:48
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:431
my_h_service m_h_res_grp_svc
Definition: resource_group_mgr.h:441
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:409
void deinit()
Definition: resource_group_mgr.cc:282
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:520
Resource_group_mgr(const Resource_group_mgr &)=delete
bool init()
Initialize the Resource group manager.
Definition: resource_group_mgr.cc:321
bool thread_priority_available()
Check if a thread priority setting can be done.
Definition: resource_group_mgr.h:317
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:460
const char * resource_group_type_str(const Type &type)
String corresponding to the type of resource group.
Definition: resource_group_mgr.h:360
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:224
Resource_group * m_sys_internal_resource_group
Pointer to SYS_internal resource group.
Definition: resource_group_mgr.h:453
const mysql_service_pfs_resource_group_v3_t * m_resource_group_svc
Definition: resource_group_mgr.h:439
Resource_group_mgr()
Definition: resource_group_mgr.h:489
my_h_service m_h_notification_svc
Definition: resource_group_mgr.h:442
bool is_sys_internal_resource_group(const Resource_group *res_grp) const
Check if a given Resource group is SYS_internal.
Definition: resource_group_mgr.h:307
uint32_t m_num_vcpus
Value indicating the number of vcpus in the system.
Definition: resource_group_mgr.h:487
void operator=(const Resource_group_mgr &)=delete
bool disable_pfs_notification()
Definition: resource_group_mgr.cc:567
Resource_group * sys_default_resource_group()
Return the SYS_default resource group instance.
Definition: resource_group_mgr.h:253
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:577
Resource_group * sys_internal_resource_group()
Return the SYS_internal resource group instance.
Definition: resource_group_mgr.h:263
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:262
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:273
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:347
mysql_rwlock_t m_map_rwlock
Lock protecting the resource group map.
Definition: resource_group_mgr.h:465
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:294
const char * usr_default_resource_group_name()
Definition: resource_group_mgr.h:284
void extract_resource_group(const std::string &name)
Extract(unlink) the resource group from the map identified by it's name.
Definition: resource_group_mgr.cc:529
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:542
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:508
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:448
bool m_thread_priority_available
Boolean value indicating whether setting of thread priority is allowed.
Definition: resource_group_mgr.h:470
bool m_resource_group_support
Bool value indicating support for resource group.
Definition: resource_group_mgr.h:475
static Resource_group_mgr * instance()
Singleton method to return an instance of this class.
Definition: resource_group_mgr.cc:98
Resource_group * m_usr_default_resource_group
Pointer to USR_default and SYS_default resource groups.
Definition: resource_group_mgr.h:449
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:440
static void destroy_instance()
Destroy the singleton instance.
Definition: resource_group_mgr.cc:483
const char * sys_default_resource_group_name()
Get names of SYS_default and USR_default resource groups.
Definition: resource_group_mgr.h:281
uint32_t num_vcpus()
Number of VCPUs present in the system.
Definition: resource_group_mgr.h:370
const mysql_service_registry_t * m_registry_svc
Handles to the PFS registry, Resource Group and Notification services.
Definition: resource_group_mgr.h:438
int m_notify_handle
Definition: resource_group_mgr.h:443
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:491
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:450
bool post_init()
Post initialization sequence during mysqld startup.
Definition: resource_group_mgr.cc:297
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:241
std::string m_unsupport_reason
String indicating reason for resource group not being supported.
Definition: resource_group_mgr.h:480
Class that represents an abstraction of the Resource Group.
Definition: resource_group.h:44
#define mysql_mutex_lock(M)
Definition: mysql_mutex.h:49
#define mysql_mutex_unlock(M)
Definition: mysql_mutex.h:56
Declarations for the Debug Sync Facility.
Fido Client Authentication nullptr
Definition: fido_client_plugin.cc:221
struct my_h_service_imp * my_h_service
A handle type for acquired Service.
Definition: registry.h:32
Error logging, slow query logging, general query logging: If it's server-internal,...
#define LogErr(severity, ecode,...)
Definition: log_builtins.h:842
#define STRING_WITH_LEN(X)
Definition: m_string.h:314
enum_mdl_duration
Duration of metadata lock.
Definition: mdl.h:332
#define DBUG_EXECUTE_IF(keyword, a1)
Definition: my_dbug.h:170
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:55
@ INFORMATION_LEVEL
Definition: my_loglevel.h:44
static my_thread_id thread_id
Definition: my_thr_init.cc:62
Instrumentation helpers for rwlock.
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:42
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:75
Definition: dd_resource_group.h:28
const char * SYS_INTERNAL_RESOURCE_GROUP_NAME
Definition: resource_group_mgr.cc:68
Type
Definition: resource_group_basic_types.h:32
const char * SYS_DEFAULT_RESOURCE_GROUP_NAME
Definition: resource_group_mgr.cc:66
const char * USR_DEFAULT_RESOURCE_GROUP_NAME
Definition: resource_group_mgr.cc:67
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:2436
Instrumentation helpers for mutexes.
Performance schema instrumentation interface.
required string type
Definition: replication_group_member_actions.proto:33
required bool enabled
Definition: replication_group_member_actions.proto:32
#define SERVICE_TYPE(name)
Generates the standard Service type name.
Definition: service.h:75
case opt name
Definition: sslopt-case.h:32
Definition: mysql_lex_string.h:39
Performance Schema thread type: user/foreground or system/background.
Definition: psi_thread_bits.h:469
An instrumented rwlock structure.
Definition: mysql_rwlock_bits.h:50
Resource_group * m_cur_resource_group
Definition: resource_group_basic_types.h:54
get_thread_system_attrs_by_id_v3_t get_thread_system_attrs_by_id
Definition: pfs_resource_group.h:135
set_thread_resource_group_by_id_v1_t set_thread_resource_group_by_id
Definition: pfs_resource_group.h:133