MySQL  8.0.17
Source Code Documentation
resource_group_mgr.h
Go to the documentation of this file.
1 /* Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
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 /**
61  This is a singleton class that provides various functionalities related to
62  Resource group management, more importantly the managing and the mapping of
63  resource group names to the corresponding in-memory resource group object.
64 */
65 
67  public:
68  /**
69  Singleton method to return an instance of this class.
70  */
71 
72  static Resource_group_mgr *instance();
73 
74  /**
75  Destroy the singleton instance.
76  */
77 
78  static void destroy_instance();
79 
80  /**
81  Check if support for Resource group exists at runtime.
82 
83  @return true if resource group feature is supported else false.
84  */
85 
87 
88  /**
89  Reason for resource group not being supported.
90 
91  @return pointer to string which indicate reason for resource group unsupport
92  */
93 
94  const char *unsupport_reason() { return m_unsupport_reason.c_str(); }
95 
96  /**
97  Set reason for resource group not being supported.
98 
99  @param reason string representing reason for resource group unsupport.
100  */
101 
102  void set_unsupport_reason(const std::string &reason) {
103  m_unsupport_reason = reason;
104  }
105 
106  /**
107  Initialize the Resource group manager.
108  Must be called before instance() can be used.
109 
110  @return true if initialization failed, false otherwise.
111  */
112 
113  bool init();
114 
115  /**
116  Post initialization sequence during mysqld startup.
117 
118  @return true if post initialization failed, else false.
119  */
120 
121  bool post_init();
122 
123  /**
124  Disable and deinitialize the resource group if it was initialized before.
125  */
126 
129  LogErr(INFORMATION_LEVEL, ER_RES_GRP_FEATURE_NOT_AVAILABLE);
130  deinit();
131  m_resource_group_support = false;
132  }
133  }
134 
135  /**
136  Get the in-memory Resource group object corresponding
137  to a resource group name.
138 
139  @param resource_group_name Name of the resource group.
140  @return Pointer to the Resource group if it exists else nullptr.
141  */
142 
143  Resource_group *get_resource_group(const std::string &resource_group_name);
144 
145  /**
146  Get the thread attributes identified by PSI thread ID.
147 
148  @param [out] pfs_thread_attr Pointer to thread attribute object which
149  shall be populated if the call is successful.
150  @param thread_id PFS thread identifier representing a thread of mysqld.
151 
152  @return true if call failed else false.
153  */
154 
159  nullptr, thread_id, pfs_thread_attr) != 0;
160  }
161 
162  /**
163  Add the resource group to the Resource group map.
164 
165  @param resource_group_ptr pointer to in-memory Resource_group.
166  @return true if the call failed else false.
167  */
168 
169  bool add_resource_group(std::unique_ptr<Resource_group> resource_group_ptr);
170 
171  /**
172  Remove the resource group from the map identified by it's name.
173 
174  @param name of the resource group.
175  */
176 
177  void remove_resource_group(const std::string &name);
178 
179  /**
180  Create an in-memory resource group identified by its attributes
181  and add it to the resource group map.
182 
183  @param name Name of resource group.
184  @param type Type of resource group.
185  @param enabled Is resource group enabled?
186  @param cpus Pointer to list of Range objects representing CPU IDS.
187  @param thr_priority Thread priority.
188 
189  @returns Pointer to Resource Group object if call is successful else null.
190  */
191 
193  const LEX_CSTRING &name, Type type, bool enabled,
194  std::unique_ptr<std::vector<Range>> cpus, int thr_priority);
195 
196  /**
197  Move the Resource group of the current thread identified by from_res_group
198  to the Resource group to_res_grp.
199 
200  @param from_res_grp Pointer to current Resource_group of the thread.
201  @param to_res_grp Pointer to the destination Resource group which the
202  thread will be switched to.
203  @return true if move_resource_group failed else false.
204  */
205 
206  bool move_resource_group(Resource_group *from_res_grp,
207  Resource_group *to_res_grp);
208 
209  /**
210  Deserialize a DD resource group object into an
211  in-memory Resource group object.
212 
213  @param res_grp Pointer to DD Resource_group object.
214  @return Pointer to in-memory Resource_group subject if
215  Successful else null.
216  */
217 
219 
220  /**
221  Set Resource group name in the PFS table performance_schema.threads for
222  the PFS thread id.
223 
224  @param name Pointer to name of resource group.
225  @param length length of the resource group name.
226  @param thread_id PFS thread id of the thread,
227  */
228 
232  nullptr, thread_id, name, length, nullptr);
233  }
234 
235  /**
236  Return the SYS_default resource group instance.
237 
238  @return pointer to the SYS_default resource group.
239  */
240 
243  }
244 
245  /**
246  Return the USR_default resource group instance.
247 
248  @return pointer to the USR_default resource group.
249  */
250 
253  }
254 
255  /**
256  Check if a given Resource group is either SYS_default or USR_default.
257 
258  @return true if resource is USR_default or SYS_default else false.
259  */
260 
262  return (res_grp == m_usr_default_resource_group ||
263  res_grp == m_sys_default_resource_group);
264  }
265 
266  /**
267  Check if a thread priority setting can be done.
268 
269  @return true if thread priority setting could be done else false.
270  */
271 
275  }
276 
277  /**
278  Acquire an shared MDL lock on resource group name.
279 
280  @param thd Pointer to THD context.
281  @param res_grp_name Resource group name.
282  @param lock_duration Duration of lock.
283  @param[out] ticket reference to ticket object.
284  @param acquire_lock true if one needs to wait on lock
285  else false.
286 
287  @return true if lock acquisition failed else false.
288  */
289 
290  bool acquire_shared_mdl_for_resource_group(THD *thd, const char *res_grp_name,
291  enum_mdl_duration lock_duration,
292  MDL_ticket **ticket,
293  bool acquire_lock);
294 
295  /**
296  Release the shared MDL lock held on a resource group.
297 
298  @param thd THD context.
299  @param ticket Pointert to lock ticket object.
300  */
301 
303  const MDL_ticket *ticket) {
304  DBUG_ASSERT(ticket != nullptr);
305  thd->mdl_context.release_lock(const_cast<MDL_ticket *>(ticket));
306  }
307 
308  /**
309  String corressponding to the type of resource group.
310 
311  @param type Type of resource group.
312 
313  @return string corressponding to resource group type.
314  */
315 
316  const char *resource_group_type_str(const Type &type) {
317  return type == Type::USER_RESOURCE_GROUP ? "User" : "System";
318  }
319 
320  /**
321  Number of VCPUs present in the system.
322 
323  @returns Number of VCPUs in the system.
324  */
325 
326  uint32_t num_vcpus() { return m_num_vcpus; }
327 
328  void deinit();
329 
330 #ifndef DBUG_OFF // The belows methods are required in debug build for testing.
332 #endif
333 
334  /**
335  Switch Resource Group if it is requested by environment.
336 
337  @param thd THD context.
338  @param[out] src_res_grp Original resource group from that
339  switching is performed
340  @param[out] dest_res_grp Destination resource group to that
341  switching is performed
342  @param[out] ticket Pointer to MDL ticket object.
343  @param[out] cur_ticket Pointer to current resource group MDL ticket
344  object.
345 
346  @return true if switching was performed, else false
347  */
348 
350  THD *thd, resourcegroups::Resource_group **src_res_grp,
351  resourcegroups::Resource_group **dest_res_grp, MDL_ticket **ticket,
352  MDL_ticket **cur_ticket);
353 
354  /**
355  Restore original resource group if
356  resource group switching was performed before.
357 
358  @param thd Thread context.
359  @param[out] src_res_grp resource group to that
360  switching was performed
361  @param[out] dest_res_grp original resource group to that
362  switching is performed
363 */
364 
366  THD *thd, resourcegroups::Resource_group *src_res_grp,
367  resourcegroups::Resource_group *dest_res_grp) {
369  if (thd->resource_group_ctx()->m_cur_resource_group == nullptr ||
370  thd->resource_group_ctx()->m_cur_resource_group == src_res_grp) {
372  dest_res_grp, thd->resource_group_ctx()->m_cur_resource_group);
373  }
375  DBUG_EXECUTE_IF("pause_after_rg_switch", {
376  const char act[] =
377  "now "
378  "SIGNAL restore_finished";
379  DBUG_ASSERT(!debug_sync_set_action(thd, STRING_WITH_LEN(act)));
380  };);
381  }
382 
383  private:
384  /**
385  Pointer to singleton instance of the Resource_group_mgr class.
386  */
388 
389  /**
390  Handles to the PFS registry, Resource Group and
391  Notification services.
392  */
393 
395  SERVICE_TYPE(pfs_resource_group_v3) * m_resource_group_svc;
396  SERVICE_TYPE(pfs_notification_v3) * m_notify_svc;
400 
401  /**
402  Pointer to USR_default and SYS_default resource groups.
403  Owernship of these pointers is resource group hash.
404  */
407 
408  /**
409  Map mapping resource group name with it's corresponding in-memory
410  Resource_group object
411  */
414 
415  /**
416  Lock protecting the resource group map.
417  */
419 
420  /**
421  Boolean value indicating whether setting of thread priority is allowed.
422  */
424 
425  /**
426  Bool value indicating support for resource group.
427  */
429 
430  /**
431  String indicating reason for resource group not being supported.
432  */
433  std::string m_unsupport_reason;
434 
435  /**
436  Value indicating the number of vcpus in the system. This is initialized
437  during startup so that we do not call the platform API everytime
438  which is expensive.
439  */
440  uint32_t m_num_vcpus;
441 
443  : m_registry_svc(nullptr),
444  m_resource_group_svc(nullptr),
445  m_notify_svc(nullptr),
446  m_h_res_grp_svc(nullptr),
447  m_h_notification_svc(nullptr),
448  m_notify_handle(0),
451  m_resource_group_hash(nullptr),
454  m_num_vcpus(0) {}
455 
457 
458  // Disable copy construction and assignment for Resource_group_mgr class.
459  Resource_group_mgr(const Resource_group_mgr &) = delete;
460  void operator=(const Resource_group_mgr &) = delete;
461 };
462 } // namespace resourcegroups
463 #endif // RESOURCEGROUPS_RESOURCE_GROUP_MGR_H_
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:454
Resource_group * m_sys_default_resource_group
Definition: resource_group_mgr.h:406
bool post_init()
Post initialization sequence during mysqld startup.
Definition: resource_group_mgr.cc:282
unsigned long long int ulonglong
Definition: my_inttypes.h:74
A granted metadata lock.
Definition: mdl.h:963
Instrumentation helpers for mutexes.
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:229
static Resource_group_mgr * m_instance
Pointer to singleton instance of the Resource_group_mgr class.
Definition: resource_group_mgr.h:387
uint32_t m_num_vcpus
Value indicating the number of vcpus in the system.
Definition: resource_group_mgr.h:440
std::unordered_map, but with my_malloc and collation-aware comparison.
Definition: map_helpers.h:236
std::string m_unsupport_reason
String indicating reason for resource group not being supported.
Definition: resource_group_mgr.h:433
const string name("\ame\)
const char * unsupport_reason()
Reason for resource group not being supported.
Definition: resource_group_mgr.h:94
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:529
Some integer typedefs for easier portability.
my_h_service m_h_notification_svc
Definition: resource_group_mgr.h:398
Resource_group_mgr()
Definition: resource_group_mgr.h:442
#define SERVICE_TYPE(name)
mysql_rwlock_t m_map_rwlock
Lock protecting the resource group map.
Definition: resource_group_mgr.h:418
const mysql_service_pfs_notification_v3_t * m_notify_svc
Definition: resource_group_mgr.h:396
Class that represents an abstraction of the Resource Group.
Definition: resource_group.h:43
~Resource_group_mgr()
Definition: resource_group_mgr.h:456
Definition: mysql_lex_string.h:39
Resource_group * m_usr_default_resource_group
Pointer to USR_default and SYS_default resource groups.
Definition: resource_group_mgr.h:405
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:494
void disable_resource_group()
Disable and deinitialize the resource group if it was initialized before.
Definition: resource_group_mgr.h:127
This is a singleton class that provides various functionalities related to Resource group management...
Definition: resource_group_mgr.h:66
void release_lock(MDL_ticket *ticket)
Release lock with explicit duration.
Definition: mdl.cc:4144
MDL_context mdl_context
Definition: sql_class.h:802
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:471
int m_notify_handle
Definition: resource_group_mgr.h:399
#define DBUG_EXECUTE_IF(keyword, a1)
Definition: my_dbug.h:155
collation_unordered_map< std::string, std::unique_ptr< Resource_group > > * m_resource_group_hash
Map mapping resource group name with it&#39;s corresponding in-memory Resource_group object.
Definition: resource_group_mgr.h:413
set_thread_resource_group_by_id_v1_t set_thread_resource_group_by_id
Definition: pfs_resource_group.h:133
void set_unsupport_reason(const std::string &reason)
Set reason for resource group not being supported.
Definition: resource_group_mgr.h:102
#define DBUG_ASSERT(A)
Definition: my_dbug.h:183
static void destroy_instance()
Destroy the singleton instance.
Definition: resource_group_mgr.cc:446
my_h_service m_h_res_grp_svc
Definition: resource_group_mgr.h:397
Definition: my_loglevel.h:36
Resource_group * usr_default_resource_group()
Return the USR_default resource group instance.
Definition: resource_group_mgr.h:251
Performance schema instrumentation interface.
static Resource_group_mgr * instance()
Singleton method to return an instance of this class.
Definition: resource_group_mgr.cc:94
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:413
bool disable_pfs_notification()
Definition: resource_group_mgr.cc:519
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:247
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:261
Type
Definition: resource_group_basic_types.h:32
bool thread_priority_available()
Check if a thread priority setting can be done.
Definition: resource_group_mgr.h:272
void operator=(const Resource_group_mgr &)=delete
void release_shared_mdl_for_resource_group(THD *thd, const MDL_ticket *ticket)
Release the shared MDL lock held on a resource group.
Definition: resource_group_mgr.h:302
void deinit()
Definition: resource_group_mgr.cc:267
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:209
An instrumented rwlock structure.
Definition: mysql_rwlock_bits.h:50
get_thread_system_attrs_by_id_v3_t get_thread_system_attrs_by_id
Definition: pfs_resource_group.h:135
Resource_group * m_cur_resource_group
Definition: resource_group_basic_types.h:54
Performance Schema thread type: user/foreground or system/background.
Definition: psi_thread_bits.h:338
bool m_resource_group_support
Bool value indicating support for resource group.
Definition: resource_group_mgr.h:428
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:155
Definition: resource_group.h:48
Declarations for the Debug Sync Facility.
int type
Definition: http_common.h:411
bool init()
Initialize the Resource group manager.
Definition: resource_group_mgr.cc:306
Definition: dd_resource_group.h:28
const mysql_service_registry_t * m_registry_svc
Handles to the PFS registry, Resource Group and Notification services.
Definition: resource_group_mgr.h:394
#define LogErr(severity, ecode,...)
Definition: log_builtins.h:751
const char * resource_group_type_str(const Type &type)
String corressponding to the type of resource group.
Definition: resource_group_mgr.h:316
resourcegroups::Resource_group_ctx * resource_group_ctx()
Get resource group context.
Definition: sql_class.h:3533
#define mysql_mutex_unlock(M)
Definition: mysql_mutex.h:53
enum_mdl_duration
Duration of metadata lock.
Definition: mdl.h:316
#define mysql_mutex_lock(M)
Definition: mysql_mutex.h:44
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:365
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:39
bool m_thread_priority_available
Boolean value indicating whether setting of thread priority is allowed.
Definition: resource_group_mgr.h:423
const mysql_service_pfs_resource_group_v3_t * m_resource_group_svc
Definition: resource_group_mgr.h:395
mysql_mutex_t LOCK_thd_data
Protects THD data accessed from other threads.
Definition: sql_class.h:1005
Error logging, slow query logging, general query logging: If it&#39;s server-internal, and it&#39;s logging, it&#39;s here.
struct my_h_service_imp * my_h_service
A handle type for acquired Service.
Definition: registry.h:32
Instrumentation helpers for rwlock.
bool resource_group_support()
Check if support for Resource group exists at runtime.
Definition: resource_group_mgr.h:86
#define false
Definition: config_static.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:75
uint32_t num_vcpus()
Number of VCPUs present in the system.
Definition: resource_group_mgr.h:326
void remove_resource_group(const std::string &name)
Remove the resource group from the map identified by it&#39;s name.
Definition: resource_group_mgr.cc:483
#define STRING_WITH_LEN(X)
Definition: m_string.h:315
static my_thread_id thread_id
Definition: my_thr_init.cc:62
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_class.h:777
Resource_group * sys_default_resource_group()
Return the SYS_default resource group instance.
Definition: resource_group_mgr.h:241