MySQL  8.0.27
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"
42 #include "mysql/psi/mysql_mutex.h"
43 #include "sql/debug_sync.h"
44 #include "sql/log.h"
45 #include "sql/mdl.h"
47 #include "sql/sql_class.h"
48 
49 namespace dd {
50 class Resource_group;
51 } // namespace dd
52 namespace resourcegroups {
53 class Resource_group;
54 } // namespace resourcegroups
55 template <class Key, class Value>
57 
58 namespace resourcegroups {
59 
60 extern const char *SYS_DEFAULT_RESOURCE_GROUP_NAME;
61 extern 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 
75  static Resource_group_mgr *instance();
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();
134  m_resource_group_support = false;
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 
160  assert(m_resource_group_support);
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 
233  assert(m_resource_group_support);
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 ||
277  res_grp == m_sys_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 
287  assert(m_resource_group_support);
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  */
446  std::string m_unsupport_reason;
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 
461  m_notify_handle(0),
467  m_num_vcpus(0) {}
468 
469  ~Resource_group_mgr() = default;
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:821
MDL_context mdl_context
Definition: sql_class.h:844
resourcegroups::Resource_group_ctx * resource_group_ctx()
Get resource group context.
Definition: sql_class.h:3730
mysql_mutex_t LOCK_thd_data
Protects THD data accessed from other threads.
Definition: sql_class.h:1060
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
const char * unsupport_reason()
Reason for resource group not being supported.
Definition: resource_group_mgr.h:97
const char * usr_default_resource_group_name()
Definition: resource_group_mgr.h:265
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
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 char * resource_group_type_str(const Type &type)
String corressponding to the type of resource group.
Definition: resource_group_mgr.h:329
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
Resource_group * sys_default_resource_group()
Return the SYS_default resource group instance.
Definition: resource_group_mgr.h:244
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
void operator=(const Resource_group_mgr &)=delete
bool disable_pfs_notification()
Definition: resource_group_mgr.cc:524
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
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
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
Resource_group * usr_default_resource_group()
Return the USR_default resource group instance.
Definition: resource_group_mgr.h:254
const char * sys_default_resource_group_name()
Get names of SYS_default and USR_default resource groups.
Definition: resource_group_mgr.h:262
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
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.
Dialog Client Authentication nullptr
Definition: dialog.cc:352
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:321
enum_mdl_duration
Duration of metadata lock.
Definition: mdl.h:332
#define DBUG_EXECUTE_IF(keyword, a1)
Definition: my_dbug.h:158
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
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:463
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