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