MySQL 8.2.0
Source Code Documentation
resource_group_mgr.h
Go to the documentation of this file.
1/* Copyright (c) 2017, 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 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 "my_dbug.h"
32#include "my_inttypes.h"
42#include "sql/debug_sync.h"
43#include "sql/log.h"
44#include "sql/mdl.h"
46#include "sql/sql_class.h"
47#include "string_with_len.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;
62
63/**
64 This is a singleton class that provides various functionalities related to
65 Resource group management, more importantly the managing and the mapping of
66 resource group names to the corresponding in-memory resource group object.
67*/
68
70 public:
71 /**
72 Singleton method to return an instance of this class.
73 */
74
76
77 /**
78 Destroy the singleton instance.
79 */
80
81 static void destroy_instance();
82
83 /**
84 Check if support for Resource group exists at runtime.
85
86 @return true if resource group feature is supported else false.
87 */
88
90
91 /**
92 Reason for resource group not being supported.
93
94 @return pointer to string which indicate reason for resource group
95 unsupported
96 */
97
98 const char *unsupport_reason() { return m_unsupport_reason.c_str(); }
99
100 /**
101 Set reason for resource group not being supported.
102
103 @param reason string representing reason for resource group unsupported.
104 */
105
106 void set_unsupport_reason(const std::string &reason) {
107 m_unsupport_reason = reason;
108 }
109
110 /**
111 Initialize the Resource group manager.
112 Must be called before instance() can be used.
113
114 @return true if initialization failed, false otherwise.
115 */
116
117 bool init();
118
119 /**
120 Post initialization sequence during mysqld startup.
121
122 @return true if post initialization failed, else false.
123 */
124
125 bool post_init();
126
127 /**
128 Disable and deinitialize the resource group if it was initialized before.
129 */
130
133 LogErr(INFORMATION_LEVEL, ER_RES_GRP_FEATURE_NOT_AVAILABLE);
134 deinit();
136 }
137 }
138
139 /**
140 Get the in-memory Resource group object corresponding
141 to a resource group name.
142
143 @param resource_group_name Name of the resource group.
144 @return Pointer to the Resource group if it exists else nullptr.
145 */
146
147 Resource_group *get_resource_group(const std::string &resource_group_name);
148
149 /**
150 Get the thread attributes identified by PSI thread ID.
151
152 @param [out] pfs_thread_attr Pointer to thread attribute object which
153 shall be populated if the call is successful.
154 @param thread_id PFS thread identifier representing a thread of mysqld.
155
156 @return true if call failed else false.
157 */
158
163 nullptr, thread_id, pfs_thread_attr) != 0;
164 }
165
166 /**
167 Add the resource group to the Resource group map.
168
169 @param resource_group_ptr pointer to in-memory Resource_group.
170 @return true if the call failed else false.
171 */
172
173 bool add_resource_group(std::unique_ptr<Resource_group> resource_group_ptr);
174
175 /**
176 Remove the resource group from the map identified by it's name.
177
178 @param name of the resource group.
179 */
180
181 void remove_resource_group(const std::string &name);
182
183 /**
184 Create an in-memory resource group identified by its attributes
185 and add it to the resource group map.
186
187 @param name Name of resource group.
188 @param type Type of resource group.
189 @param enabled Is resource group enabled?
190 @param cpus Pointer to list of Range objects representing CPU IDS.
191 @param thr_priority Thread priority.
192
193 @returns Pointer to Resource Group object if call is successful else null.
194 */
195
197 const LEX_CSTRING &name, Type type, bool enabled,
198 std::unique_ptr<std::vector<Range>> cpus, int thr_priority);
199
200 /**
201 Move the Resource group of the current thread identified by from_res_group
202 to the Resource group to_res_grp.
203
204 @param from_res_grp Pointer to current Resource_group of the thread.
205 @param to_res_grp Pointer to the destination Resource group which the
206 thread will be switched to.
207 @return true if move_resource_group failed else false.
208 */
209
210 bool move_resource_group(Resource_group *from_res_grp,
211 Resource_group *to_res_grp);
212
213 /**
214 Deserialize a DD resource group object into an
215 in-memory Resource group object.
216
217 @param res_grp Pointer to DD Resource_group object.
218 @return Pointer to in-memory Resource_group subject if
219 Successful else null.
220 */
221
223
224 /**
225 Set Resource group name in the PFS table performance_schema.threads for
226 the PFS thread id.
227
228 @param name Pointer to name of resource group.
229 @param length length of the resource group name.
230 @param thread_id PFS thread id of the thread,
231 */
232
236 nullptr, thread_id, name, length, nullptr);
237 }
238
239 /**
240 Return the SYS_default resource group instance.
241
242 @return pointer to the SYS_default resource group.
243 */
244
247 }
248
249 /**
250 Return the USR_default resource group instance.
251
252 @return pointer to the USR_default resource group.
253 */
254
257 }
258
259 /**
260 Get names of SYS_default and USR_default resource groups.
261 Called by thread_create_callback only.
262 */
265 }
268 }
269
270 /**
271 Check if a given Resource group is either SYS_default or USR_default.
272
273 @return true if resource is USR_default or SYS_default else false.
274 */
275
277 return (res_grp == m_usr_default_resource_group ||
279 }
280
281 /**
282 Check if a thread priority setting can be done.
283
284 @return true if thread priority setting could be done else false.
285 */
286
290 }
291
292 /**
293 Acquire an shared MDL lock on resource group name.
294
295 @param thd Pointer to THD context.
296 @param res_grp_name Resource group name.
297 @param lock_duration Duration of lock.
298 @param[out] ticket reference to ticket object.
299 @param acquire_lock true if one needs to wait on lock
300 else false.
301
302 @return true if lock acquisition failed else false.
303 */
304
305 bool acquire_shared_mdl_for_resource_group(THD *thd, const char *res_grp_name,
306 enum_mdl_duration lock_duration,
307 MDL_ticket **ticket,
308 bool acquire_lock);
309
310 /**
311 Release the shared MDL lock held on a resource group.
312
313 @param thd THD context.
314 @param ticket Pointer to lock ticket object.
315 */
316
318 assert(ticket != nullptr);
319 thd->mdl_context.release_lock(ticket);
320 }
321
322 /**
323 String corresponding to the type of resource group.
324
325 @param type Type of resource group.
326
327 @return string corresponding to resource group type.
328 */
329
330 const char *resource_group_type_str(const Type &type) {
331 return type == Type::USER_RESOURCE_GROUP ? "User" : "System";
332 }
333
334 /**
335 Number of VCPUs present in the system.
336
337 @returns Number of VCPUs in the system.
338 */
339
340 uint32_t num_vcpus() { return m_num_vcpus; }
341
342 void deinit();
343
344#ifndef NDEBUG // The belows methods are required in debug build for testing.
346#endif
347
348 /**
349 Switch Resource Group if it is requested by environment.
350
351 @param thd THD context.
352 @param[out] src_res_grp Original resource group from that
353 switching is performed
354 @param[out] dest_res_grp Destination resource group to that
355 switching is performed
356 @param[out] ticket Pointer to MDL ticket object.
357 @param[out] cur_ticket Pointer to current resource group MDL ticket
358 object.
359
360 @return true if switching was performed, else false
361 */
362
364 THD *thd, resourcegroups::Resource_group **src_res_grp,
365 resourcegroups::Resource_group **dest_res_grp, MDL_ticket **ticket,
366 MDL_ticket **cur_ticket);
367
368 /**
369 Restore original resource group if
370 resource group switching was performed before.
371
372 @param thd Thread context.
373 @param[out] src_res_grp resource group to that
374 switching was performed
375 @param[out] dest_res_grp original resource group to that
376 switching is performed
377*/
378
380 THD *thd, resourcegroups::Resource_group *src_res_grp,
381 resourcegroups::Resource_group *dest_res_grp) {
383 if (thd->resource_group_ctx()->m_cur_resource_group == nullptr ||
384 thd->resource_group_ctx()->m_cur_resource_group == src_res_grp) {
386 dest_res_grp, thd->resource_group_ctx()->m_cur_resource_group);
387 }
389 DBUG_EXECUTE_IF("pause_after_rg_switch", {
390 const char act[] =
391 "now "
392 "SIGNAL restore_finished";
393 assert(!debug_sync_set_action(thd, STRING_WITH_LEN(act)));
394 };);
395 }
396
397 private:
398 /**
399 Pointer to singleton instance of the Resource_group_mgr class.
400 */
402
403 /**
404 Handles to the PFS registry, Resource Group and
405 Notification services.
406 */
407
409 SERVICE_TYPE(pfs_resource_group_v3) * m_resource_group_svc;
410 SERVICE_TYPE(pfs_notification_v3) * m_notify_svc;
414
415 /**
416 Pointer to USR_default and SYS_default resource groups.
417 Owernship of these pointers is resource group hash.
418 */
421
422 /**
423 Map mapping resource group name with it's corresponding in-memory
424 Resource_group object
425 */
428
429 /**
430 Lock protecting the resource group map.
431 */
433
434 /**
435 Boolean value indicating whether setting of thread priority is allowed.
436 */
438
439 /**
440 Bool value indicating support for resource group.
441 */
443
444 /**
445 String indicating reason for resource group not being supported.
446 */
448
449 /**
450 Value indicating the number of vcpus in the system. This is initialized
451 during startup so that we do not call the platform API every time
452 which is expensive.
453 */
454 uint32_t m_num_vcpus;
455
468 m_num_vcpus(0) {}
469
471
472 // Disable copy construction and assignment for Resource_group_mgr class.
474 void operator=(const Resource_group_mgr &) = delete;
475};
476} // namespace resourcegroups
477#endif // RESOURCEGROUPS_RESOURCE_GROUP_MGR_H_
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:250
void release_lock(MDL_ticket *ticket)
Release lock with explicit duration.
Definition: mdl.cc:4213
A granted metadata lock.
Definition: mdl.h:984
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:35
MDL_context mdl_context
Definition: sql_class.h:954
resourcegroups::Resource_group_ctx * resource_group_ctx()
Get resource group context.
Definition: sql_class.h:3957
mysql_mutex_t LOCK_thd_data
Protects THD data accessed from other threads.
Definition: sql_class.h:1201
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:69
static Resource_group_mgr * m_instance
Pointer to singleton instance of the Resource_group_mgr class.
Definition: resource_group_mgr.h:401
my_h_service m_h_res_grp_svc
Definition: resource_group_mgr.h:411
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:379
void deinit()
Definition: resource_group_mgr.cc:273
void set_unsupport_reason(const std::string &reason)
Set reason for resource group not being supported.
Definition: resource_group_mgr.h:106
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:491
Resource_group_mgr(const Resource_group_mgr &)=delete
bool init()
Initialize the Resource group manager.
Definition: resource_group_mgr.cc:312
bool thread_priority_available()
Check if a thread priority setting can be done.
Definition: resource_group_mgr.h:287
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:427
const char * resource_group_type_str(const Type &type)
String corresponding to the type of resource group.
Definition: resource_group_mgr.h:330
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:215
const mysql_service_pfs_resource_group_v3_t * m_resource_group_svc
Definition: resource_group_mgr.h:409
Resource_group_mgr()
Definition: resource_group_mgr.h:456
my_h_service m_h_notification_svc
Definition: resource_group_mgr.h:412
uint32_t m_num_vcpus
Value indicating the number of vcpus in the system.
Definition: resource_group_mgr.h:454
void operator=(const Resource_group_mgr &)=delete
bool disable_pfs_notification()
Definition: resource_group_mgr.cc:525
Resource_group * sys_default_resource_group()
Return the SYS_default resource group instance.
Definition: resource_group_mgr.h:245
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:535
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:253
void disable_resource_group()
Disable and deinitialize the resource group if it was initialized before.
Definition: resource_group_mgr.h:131
Resource_group * usr_default_resource_group()
Return the USR_default resource group instance.
Definition: resource_group_mgr.h:255
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:317
mysql_rwlock_t m_map_rwlock
Lock protecting the resource group map.
Definition: resource_group_mgr.h:432
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:276
const char * usr_default_resource_group_name()
Definition: resource_group_mgr.h:266
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:500
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:479
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:421
bool m_thread_priority_available
Boolean value indicating whether setting of thread priority is allowed.
Definition: resource_group_mgr.h:437
bool m_resource_group_support
Bool value indicating support for resource group.
Definition: resource_group_mgr.h:442
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:419
const char * unsupport_reason()
Reason for resource group not being supported.
Definition: resource_group_mgr.h:98
bool resource_group_support()
Check if support for Resource group exists at runtime.
Definition: resource_group_mgr.h:89
const mysql_service_pfs_notification_v3_t * m_notify_svc
Definition: resource_group_mgr.h:410
static void destroy_instance()
Destroy the singleton instance.
Definition: resource_group_mgr.cc:454
const char * sys_default_resource_group_name()
Get names of SYS_default and USR_default resource groups.
Definition: resource_group_mgr.h:263
uint32_t num_vcpus()
Number of VCPUs present in the system.
Definition: resource_group_mgr.h:340
const mysql_service_registry_t * m_registry_svc
Handles to the PFS registry, Resource Group and Notification services.
Definition: resource_group_mgr.h:408
int m_notify_handle
Definition: resource_group_mgr.h:413
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:462
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:159
Resource_group * m_sys_default_resource_group
Definition: resource_group_mgr.h:420
bool post_init()
Post initialization sequence during mysqld startup.
Definition: resource_group_mgr.cc:288
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:233
std::string m_unsupport_reason
String indicating reason for resource group not being supported.
Definition: resource_group_mgr.h:447
Class that represents an abstraction of the Resource Group.
Definition: resource_group.h:43
#define mysql_mutex_lock(M)
Definition: mysql_mutex.h:49
#define mysql_mutex_unlock(M)
Definition: mysql_mutex.h:56
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
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
Type
Definition: resource_group_basic_types.h:32
const char * SYS_DEFAULT_RESOURCE_GROUP_NAME
Definition: resource_group_mgr.cc:67
const char * USR_DEFAULT_RESOURCE_GROUP_NAME
Definition: resource_group_mgr.cc:68
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
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
Declarations for the Debug Sync Facility.
case opt name
Definition: sslopt-case.h:32
#define STRING_WITH_LEN(X)
Definition: string_with_len.h:28
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