mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-29 09:56:12 +01:00 
			
		
		
		
	 a3da0ee6bd
			
		
	
	
	a3da0ee6bd
	
	
	
		
			
			Avoid accessing MDL_lock::key from outside of MDL_lock class directly, use MDL_lock::get_key() instead. This is part of broader cleanup, which aims to make large part of MDL_lock members private. It is needed to simplify further work on MDEV-19749 - MDL scalability regression after backup locks.
		
			
				
	
	
		
			171 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright (C) 2013 Kentoku Shiba
 | |
| 
 | |
|   This program is free software; you can redistribute it and/or modify
 | |
|   it under the terms of the GNU General Public License as published by
 | |
|   the Free Software Foundation; version 2 of the License.
 | |
| 
 | |
|   This program is distributed in the hope that it will be useful,
 | |
|   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|   GNU General Public License for more details.
 | |
| 
 | |
|   You should have received a copy of the GNU General Public License
 | |
|   along with this program; if not, write to the Free Software
 | |
|   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
 | |
| 
 | |
| #define MYSQL_SERVER 1
 | |
| #include <my_global.h>
 | |
| #include "mysql_version.h"
 | |
| #include "mysql/plugin.h"
 | |
| #include "sql_class.h"
 | |
| #include "sql_i_s.h"
 | |
| 
 | |
| static const LEX_STRING metadata_lock_info_lock_name[] = {
 | |
|   { C_STRING_WITH_LEN("Backup lock") },
 | |
|   { C_STRING_WITH_LEN("Schema metadata lock") },
 | |
|   { C_STRING_WITH_LEN("Table metadata lock") },
 | |
|   { C_STRING_WITH_LEN("Stored function metadata lock") },
 | |
|   { C_STRING_WITH_LEN("Stored procedure metadata lock") },
 | |
|   { C_STRING_WITH_LEN("Stored package body metadata lock") },
 | |
|   { C_STRING_WITH_LEN("Trigger metadata lock") },
 | |
|   { C_STRING_WITH_LEN("Event metadata lock") },
 | |
|   { C_STRING_WITH_LEN("User lock") },
 | |
| };
 | |
| 
 | |
| 
 | |
| #ifndef DBUG_OFF
 | |
| static const LEX_STRING duration_name[] = {
 | |
|   { C_STRING_WITH_LEN("statement") },
 | |
|   { C_STRING_WITH_LEN("transaction") },
 | |
|   { C_STRING_WITH_LEN("explicit") },
 | |
| };
 | |
| #endif
 | |
| 
 | |
| namespace Show {
 | |
| 
 | |
| static ST_FIELD_INFO i_s_metadata_lock_info_fields_info[] =
 | |
| {
 | |
|   Column("THREAD_ID",     ULonglong(20), NOT_NULL, "thread_id"),
 | |
|   Column("LOCK_MODE",     Varchar(24),   NOT_NULL, "lock_mode"),
 | |
|   Column("LOCK_DURATION", Varchar(33),   NULLABLE, "lock_duration"),
 | |
|   Column("LOCK_TIME_MS",  ULonglong(8),  NULLABLE, "lock_time_ms"),
 | |
|   Column("LOCK_TYPE",     Varchar(33),   NOT_NULL, "lock_type"),
 | |
|   Column("TABLE_CATALOG", Name(),        NULLABLE, "table_catalog"),
 | |
|   Column("TABLE_SCHEMA",  Name(),        NULLABLE, "table_schema"),
 | |
|   Column("TABLE_NAME",    Name(),        NULLABLE, "table_name"),
 | |
|   CEnd()
 | |
| };
 | |
| 
 | |
| } // namespace Show
 | |
| 
 | |
| 
 | |
| struct st_i_s_metadata_param
 | |
| {
 | |
|   THD   *thd;
 | |
|   TABLE *table;
 | |
| };
 | |
| 
 | |
| int i_s_metadata_lock_info_fill_row(
 | |
|   MDL_ticket *mdl_ticket,
 | |
|   void *arg,
 | |
|   bool granted
 | |
| ) {
 | |
|   st_i_s_metadata_param *param = (st_i_s_metadata_param *) arg;
 | |
|   THD *thd = param->thd;
 | |
|   TABLE *table = param->table;
 | |
|   DBUG_ENTER("i_s_metadata_lock_info_fill_row");
 | |
|   MDL_context *mdl_ctx = mdl_ticket->get_ctx();
 | |
|   const MDL_key *mdl_key = mdl_ticket->get_key();
 | |
|   MDL_key::enum_mdl_namespace mdl_namespace = mdl_key->mdl_namespace();
 | |
|   if (!granted)
 | |
|     DBUG_RETURN(0);
 | |
|   table->field[0]->store((longlong) mdl_ctx->get_thread_id(), TRUE);
 | |
|   table->field[1]->set_notnull();
 | |
|   table->field[1]->store(*mdl_ticket->get_type_name(), system_charset_info);
 | |
| #ifndef DBUG_OFF
 | |
|   table->field[2]->set_notnull();
 | |
|   table->field[2]->store(duration_name[mdl_ticket->m_duration],
 | |
|                          system_charset_info);
 | |
| #else
 | |
|   table->field[2]->set_null();
 | |
| #endif
 | |
|   if (!mdl_ticket->m_time)
 | |
|     table->field[3]->set_null();
 | |
|   else
 | |
|   {
 | |
|     ulonglong now= microsecond_interval_timer();
 | |
|     table->field[3]->set_notnull();
 | |
|     table->field[3]->store((now - mdl_ticket->m_time) / 1000, TRUE);
 | |
|   }
 | |
|   table->field[4]->set_notnull();
 | |
|   table->field[4]->store(metadata_lock_info_lock_name[(int) mdl_namespace],
 | |
|                          system_charset_info);
 | |
|   table->field[5]->set_notnull();
 | |
|   table->field[5]->store(STRING_WITH_LEN("def"), system_charset_info);
 | |
|   table->field[6]->set_notnull();
 | |
|   table->field[6]->store(mdl_key->db_name(),
 | |
|     mdl_key->db_name_length(), system_charset_info);
 | |
|   table->field[7]->set_notnull();
 | |
|   table->field[7]->store(mdl_key->name(),
 | |
|     mdl_key->name_length(), system_charset_info);
 | |
|   if (schema_table_store_record(thd, table))
 | |
|     DBUG_RETURN(1);
 | |
|   DBUG_RETURN(0);
 | |
| }
 | |
| 
 | |
| int i_s_metadata_lock_info_fill_table(
 | |
|   THD *thd,
 | |
|   TABLE_LIST *tables,
 | |
|   COND *cond
 | |
| ) {
 | |
|   st_i_s_metadata_param param;
 | |
|   DBUG_ENTER("i_s_metadata_lock_info_fill_table");
 | |
|   param.table = tables->table;
 | |
|   param.thd = thd;
 | |
|   DBUG_RETURN(mdl_iterate(i_s_metadata_lock_info_fill_row, ¶m));
 | |
| }
 | |
| 
 | |
| static int i_s_metadata_lock_info_init(
 | |
|   void *p
 | |
| ) {
 | |
| 
 | |
|   compile_time_assert(sizeof(metadata_lock_info_lock_name)/sizeof(LEX_STRING)
 | |
|                       == MDL_key::NAMESPACE_END);
 | |
| 
 | |
|   ST_SCHEMA_TABLE *schema = (ST_SCHEMA_TABLE *) p;
 | |
|   DBUG_ENTER("i_s_metadata_lock_info_init");
 | |
|   schema->fields_info = Show::i_s_metadata_lock_info_fields_info;
 | |
|   schema->fill_table = i_s_metadata_lock_info_fill_table;
 | |
|   schema->idx_field1 = 0;
 | |
|   metadata_lock_info_plugin_loaded= 1;
 | |
|   DBUG_RETURN(0);
 | |
| }
 | |
| 
 | |
| static int i_s_metadata_lock_info_deinit(
 | |
|   void *p
 | |
| ) {
 | |
|   DBUG_ENTER("i_s_metadata_lock_info_deinit");
 | |
|   metadata_lock_info_plugin_loaded= 0;
 | |
|   DBUG_RETURN(0);
 | |
| }
 | |
| 
 | |
| static struct st_mysql_information_schema i_s_metadata_lock_info_plugin =
 | |
| { MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION };
 | |
| 
 | |
| maria_declare_plugin(metadata_lock_info)
 | |
| {
 | |
|   MYSQL_INFORMATION_SCHEMA_PLUGIN,
 | |
|   &i_s_metadata_lock_info_plugin,
 | |
|   "METADATA_LOCK_INFO",
 | |
|   "Kentoku Shiba",
 | |
|   "Metadata locking viewer",
 | |
|   PLUGIN_LICENSE_GPL,
 | |
|   i_s_metadata_lock_info_init,
 | |
|   i_s_metadata_lock_info_deinit,
 | |
|   0x0001,
 | |
|   NULL,
 | |
|   NULL,
 | |
|   NULL,
 | |
|   MariaDB_PLUGIN_MATURITY_STABLE
 | |
| }
 | |
| maria_declare_plugin_end;
 |