mirror of
https://github.com/MariaDB/server.git
synced 2026-05-10 00:54:30 +02:00
MDEV-7109: Add support for INFORMATION_SCHEMA.INNODB_SEMAPHORE_WAITS
MDEV-7399: Add support for INFORMATION_SCHEMA.INNODB_MUTEXES
MDEV-7618: Improve semaphore instrumentation
Introduced two new information schema tables to monitor mutex waits
and semaphore waits. Added a new configuration variable
innodb_intrument_semaphores to add thread_id, file name and
line of current holder of mutex/rw_lock.
This commit is contained in:
parent
9152b83973
commit
1cc7befc14
39 changed files with 2173 additions and 293 deletions
|
|
@ -1,6 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyrigth (c) 2014, 2015, MariaDB Corporation
|
||||
|
||||
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
|
||||
|
|
@ -21,7 +22,9 @@ this program; if not, write to the Free Software Foundation, Inc.,
|
|||
InnoDB INFORMATION SCHEMA tables interface to MySQL.
|
||||
|
||||
Created July 18, 2007 Vasil Dimov
|
||||
Modified Dec 29, 2014 Jan Lindström (Added sys_semaphore_waits)
|
||||
*******************************************************/
|
||||
#include "univ.i"
|
||||
#include <my_global.h>
|
||||
#ifndef MYSQL_SERVER
|
||||
#define MYSQL_SERVER /* For Item_* classes */
|
||||
|
|
@ -68,6 +71,7 @@ Created July 18, 2007 Vasil Dimov
|
|||
#include "log0online.h"
|
||||
#include "btr0btr.h"
|
||||
#include "page0zip.h"
|
||||
#include "sync0arr.h"
|
||||
|
||||
/** structure associates a name string with a file page type and/or buffer
|
||||
page state. */
|
||||
|
|
@ -149,45 +153,6 @@ struct buf_page_info_t{
|
|||
index_id_t index_id; /*!< Index ID if a index page */
|
||||
};
|
||||
|
||||
/** maximum number of buffer page info we would cache. */
|
||||
#define MAX_BUF_INFO_CACHED 10000
|
||||
|
||||
#define OK(expr) \
|
||||
if ((expr) != 0) { \
|
||||
DBUG_RETURN(1); \
|
||||
}
|
||||
|
||||
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
|
||||
do { \
|
||||
if (!srv_was_started) { \
|
||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, \
|
||||
ER_CANT_FIND_SYSTEM_REC, \
|
||||
"InnoDB: SELECTing from " \
|
||||
"INFORMATION_SCHEMA.%s but " \
|
||||
"the InnoDB storage engine " \
|
||||
"is not installed", plugin_name); \
|
||||
DBUG_RETURN(0); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#if !defined __STRICT_ANSI__ && defined __GNUC__ && (__GNUC__) > 2 && \
|
||||
!defined __INTEL_COMPILER && !defined __clang__
|
||||
#define STRUCT_FLD(name, value) name: value
|
||||
#else
|
||||
#define STRUCT_FLD(name, value) value
|
||||
#endif
|
||||
|
||||
/* Don't use a static const variable here, as some C++ compilers (notably
|
||||
HPUX aCC: HP ANSI C++ B3910B A.03.65) can't handle it. */
|
||||
#define END_OF_ST_FIELD_INFO \
|
||||
{STRUCT_FLD(field_name, NULL), \
|
||||
STRUCT_FLD(field_length, 0), \
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_NULL), \
|
||||
STRUCT_FLD(value, 0), \
|
||||
STRUCT_FLD(field_flags, 0), \
|
||||
STRUCT_FLD(old_name, ""), \
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)}
|
||||
|
||||
/*
|
||||
Use the following types mapping:
|
||||
|
||||
|
|
@ -216,6 +181,20 @@ time_t MYSQL_TYPE_DATETIME
|
|||
---------------------------------
|
||||
*/
|
||||
|
||||
/** Implemented on sync0arr.cc */
|
||||
/*******************************************************************//**
|
||||
Function to populate INFORMATION_SCHEMA.INNODB_SYS_SEMAPHORE_WAITS table.
|
||||
Loop through each item on sync array, and extract the column
|
||||
information and fill the INFORMATION_SCHEMA.INNODB_SYS_SEMAPHORE_WAITS table.
|
||||
@return 0 on success */
|
||||
UNIV_INTERN
|
||||
int
|
||||
sync_arr_fill_sys_semphore_waits_table(
|
||||
/*===================================*/
|
||||
THD* thd, /*!< in: thread */
|
||||
TABLE_LIST* tables, /*!< in/out: tables to fill */
|
||||
Item* ); /*!< in: condition (not used) */
|
||||
|
||||
/*******************************************************************//**
|
||||
Common function to fill any of the dynamic tables:
|
||||
INFORMATION_SCHEMA.innodb_trx
|
||||
|
|
@ -273,7 +252,6 @@ field_store_time_t(
|
|||
/*******************************************************************//**
|
||||
Auxiliary function to store char* value in MYSQL_TYPE_STRING field.
|
||||
@return 0 on success */
|
||||
static
|
||||
int
|
||||
field_store_string(
|
||||
/*===============*/
|
||||
|
|
@ -340,7 +318,6 @@ field_store_index_name(
|
|||
Auxiliary function to store ulint value in MYSQL_TYPE_LONGLONG field.
|
||||
If the value is ULINT_UNDEFINED then the field it set to NULL.
|
||||
@return 0 on success */
|
||||
static
|
||||
int
|
||||
field_store_ulint(
|
||||
/*==============*/
|
||||
|
|
@ -8992,3 +8969,494 @@ UNIV_INTERN struct st_maria_plugin i_s_innodb_tablespaces_scrubbing =
|
|||
STRUCT_FLD(version_info, INNODB_VERSION_STR),
|
||||
STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE)
|
||||
};
|
||||
|
||||
/** INNODB_MUTEXES *********************************************/
|
||||
/* Fields of the dynamic table INFORMATION_SCHEMA.INNODB_MUTEXES */
|
||||
static ST_FIELD_INFO innodb_mutexes_fields_info[] =
|
||||
{
|
||||
#define MUTEXES_NAME 0
|
||||
{STRUCT_FLD(field_name, "NAME"),
|
||||
STRUCT_FLD(field_length, OS_FILE_MAX_PATH),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, 0),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
#define MUTEXES_CREATE_FILE 1
|
||||
{STRUCT_FLD(field_name, "CREATE_FILE"),
|
||||
STRUCT_FLD(field_length, OS_FILE_MAX_PATH),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, 0),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
#define MUTEXES_CREATE_LINE 2
|
||||
{STRUCT_FLD(field_name, "CREATE_LINE"),
|
||||
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
#define MUTEXES_OS_WAITS 3
|
||||
{STRUCT_FLD(field_name, "OS_WAITS"),
|
||||
STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
END_OF_ST_FIELD_INFO
|
||||
};
|
||||
|
||||
/*******************************************************************//**
|
||||
Function to populate INFORMATION_SCHEMA.INNODB_MUTEXES table.
|
||||
Loop through each record in mutex and rw_lock lists, and extract the column
|
||||
information and fill the INFORMATION_SCHEMA.INNODB_MUTEXES table.
|
||||
@return 0 on success */
|
||||
static
|
||||
int
|
||||
i_s_innodb_mutexes_fill_table(
|
||||
/*==========================*/
|
||||
THD* thd, /*!< in: thread */
|
||||
TABLE_LIST* tables, /*!< in/out: tables to fill */
|
||||
Item* ) /*!< in: condition (not used) */
|
||||
{
|
||||
ib_mutex_t* mutex;
|
||||
rw_lock_t* lock;
|
||||
ulint block_mutex_oswait_count = 0;
|
||||
ulint block_lock_oswait_count = 0;
|
||||
ib_mutex_t* block_mutex = NULL;
|
||||
rw_lock_t* block_lock = NULL;
|
||||
Field** fields = tables->table->field;
|
||||
|
||||
DBUG_ENTER("i_s_innodb_mutexes_fill_table");
|
||||
RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name);
|
||||
|
||||
/* deny access to user without PROCESS_ACL privilege */
|
||||
if (check_global_access(thd, PROCESS_ACL)) {
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
mutex_enter(&mutex_list_mutex);
|
||||
|
||||
for (mutex = UT_LIST_GET_FIRST(mutex_list); mutex != NULL;
|
||||
mutex = UT_LIST_GET_NEXT(list, mutex)) {
|
||||
if (mutex->count_os_wait == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (buf_pool_is_block_mutex(mutex)) {
|
||||
block_mutex = mutex;
|
||||
block_mutex_oswait_count += mutex->count_os_wait;
|
||||
continue;
|
||||
}
|
||||
|
||||
OK(field_store_string(fields[MUTEXES_NAME], mutex->cmutex_name));
|
||||
OK(field_store_string(fields[MUTEXES_CREATE_FILE], innobase_basename(mutex->cfile_name)));
|
||||
OK(field_store_ulint(fields[MUTEXES_CREATE_LINE], mutex->cline));
|
||||
OK(field_store_ulint(fields[MUTEXES_OS_WAITS], (longlong)mutex->count_os_wait));
|
||||
OK(schema_table_store_record(thd, tables->table));
|
||||
}
|
||||
|
||||
if (block_mutex) {
|
||||
char buf1[IO_SIZE];
|
||||
|
||||
my_snprintf(buf1, sizeof buf1, "combined %s",
|
||||
innobase_basename(block_mutex->cfile_name));
|
||||
|
||||
OK(field_store_string(fields[MUTEXES_NAME], block_mutex->cmutex_name));
|
||||
OK(field_store_string(fields[MUTEXES_CREATE_FILE], buf1));
|
||||
OK(field_store_ulint(fields[MUTEXES_CREATE_LINE], block_mutex->cline));
|
||||
OK(field_store_ulint(fields[MUTEXES_OS_WAITS], (longlong)block_mutex_oswait_count));
|
||||
OK(schema_table_store_record(thd, tables->table));
|
||||
}
|
||||
|
||||
mutex_exit(&mutex_list_mutex);
|
||||
|
||||
mutex_enter(&rw_lock_list_mutex);
|
||||
|
||||
for (lock = UT_LIST_GET_FIRST(rw_lock_list); lock != NULL;
|
||||
lock = UT_LIST_GET_NEXT(list, lock)) {
|
||||
if (lock->count_os_wait == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (buf_pool_is_block_lock(lock)) {
|
||||
block_lock = lock;
|
||||
block_lock_oswait_count += lock->count_os_wait;
|
||||
continue;
|
||||
}
|
||||
|
||||
OK(field_store_string(fields[MUTEXES_NAME], lock->lock_name));
|
||||
OK(field_store_string(fields[MUTEXES_CREATE_FILE], innobase_basename(lock->cfile_name)));
|
||||
OK(field_store_ulint(fields[MUTEXES_CREATE_LINE], lock->cline));
|
||||
OK(field_store_ulint(fields[MUTEXES_OS_WAITS], (longlong)lock->count_os_wait));
|
||||
OK(schema_table_store_record(thd, tables->table));
|
||||
}
|
||||
|
||||
if (block_lock) {
|
||||
char buf1[IO_SIZE];
|
||||
|
||||
my_snprintf(buf1, sizeof buf1, "combined %s",
|
||||
innobase_basename(block_lock->cfile_name));
|
||||
|
||||
OK(field_store_string(fields[MUTEXES_NAME], block_lock->lock_name));
|
||||
OK(field_store_string(fields[MUTEXES_CREATE_FILE], buf1));
|
||||
OK(field_store_ulint(fields[MUTEXES_CREATE_LINE], block_lock->cline));
|
||||
OK(field_store_ulint(fields[MUTEXES_OS_WAITS], (longlong)block_lock_oswait_count));
|
||||
OK(schema_table_store_record(thd, tables->table));
|
||||
}
|
||||
|
||||
mutex_exit(&rw_lock_list_mutex);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
Bind the dynamic table INFORMATION_SCHEMA.INNODB_MUTEXES
|
||||
@return 0 on success */
|
||||
static
|
||||
int
|
||||
innodb_mutexes_init(
|
||||
/*================*/
|
||||
void* p) /*!< in/out: table schema object */
|
||||
{
|
||||
ST_SCHEMA_TABLE* schema;
|
||||
|
||||
DBUG_ENTER("innodb_mutexes_init");
|
||||
|
||||
schema = (ST_SCHEMA_TABLE*) p;
|
||||
|
||||
schema->fields_info = innodb_mutexes_fields_info;
|
||||
schema->fill_table = i_s_innodb_mutexes_fill_table;
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
UNIV_INTERN struct st_mysql_plugin i_s_innodb_mutexes =
|
||||
{
|
||||
/* the plugin type (a MYSQL_XXX_PLUGIN value) */
|
||||
/* int */
|
||||
STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN),
|
||||
|
||||
/* pointer to type-specific plugin descriptor */
|
||||
/* void* */
|
||||
STRUCT_FLD(info, &i_s_info),
|
||||
|
||||
/* plugin name */
|
||||
/* const char* */
|
||||
STRUCT_FLD(name, "INNODB_MUTEXES"),
|
||||
|
||||
/* plugin author (for SHOW PLUGINS) */
|
||||
/* const char* */
|
||||
STRUCT_FLD(author, plugin_author),
|
||||
|
||||
/* general descriptive text (for SHOW PLUGINS) */
|
||||
/* const char* */
|
||||
STRUCT_FLD(descr, "InnoDB SYS_DATAFILES"),
|
||||
|
||||
/* the plugin license (PLUGIN_LICENSE_XXX) */
|
||||
/* int */
|
||||
STRUCT_FLD(license, PLUGIN_LICENSE_GPL),
|
||||
|
||||
/* the function to invoke when plugin is loaded */
|
||||
/* int (*)(void*); */
|
||||
STRUCT_FLD(init, innodb_mutexes_init),
|
||||
|
||||
/* the function to invoke when plugin is unloaded */
|
||||
/* int (*)(void*); */
|
||||
STRUCT_FLD(deinit, i_s_common_deinit),
|
||||
|
||||
/* plugin version (for SHOW PLUGINS) */
|
||||
/* unsigned int */
|
||||
STRUCT_FLD(version, INNODB_VERSION_SHORT),
|
||||
|
||||
/* struct st_mysql_show_var* */
|
||||
STRUCT_FLD(status_vars, NULL),
|
||||
|
||||
/* struct st_mysql_sys_var** */
|
||||
STRUCT_FLD(system_vars, NULL),
|
||||
|
||||
/* Maria extension */
|
||||
STRUCT_FLD(version_info, INNODB_VERSION_STR),
|
||||
STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE),
|
||||
};
|
||||
|
||||
/** SYS_SEMAPHORE_WAITS ************************************************/
|
||||
/* Fields of the dynamic table INFORMATION_SCHEMA.INNODB_SYS_SEMAPHORE_WAITS */
|
||||
static ST_FIELD_INFO innodb_sys_semaphore_waits_fields_info[] =
|
||||
{
|
||||
// SYS_SEMAPHORE_WAITS_THREAD_ID 0
|
||||
{STRUCT_FLD(field_name, "THREAD_ID"),
|
||||
STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_OBJECT_NAME 1
|
||||
{STRUCT_FLD(field_name, "OBJECT_NAME"),
|
||||
STRUCT_FLD(field_length, OS_FILE_MAX_PATH),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_FILE 2
|
||||
{STRUCT_FLD(field_name, "FILE"),
|
||||
STRUCT_FLD(field_length, OS_FILE_MAX_PATH),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_LINE 3
|
||||
{STRUCT_FLD(field_name, "LINE"),
|
||||
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_WAIT_TIME 4
|
||||
{STRUCT_FLD(field_name, "WAIT_TIME"),
|
||||
STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_WAIT_OBJECT 5
|
||||
{STRUCT_FLD(field_name, "WAIT_OBJECT"),
|
||||
STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_WAIT_TYPE 6
|
||||
{STRUCT_FLD(field_name, "WAIT_TYPE"),
|
||||
STRUCT_FLD(field_length, 16),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_HOLDER_THREAD_ID 7
|
||||
{STRUCT_FLD(field_name, "HOLDER_THREAD_ID"),
|
||||
STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_HOLDER_FILE 8
|
||||
{STRUCT_FLD(field_name, "HOLDER_FILE"),
|
||||
STRUCT_FLD(field_length, OS_FILE_MAX_PATH),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_HOLDER_LINE 9
|
||||
{STRUCT_FLD(field_name, "HOLDER_LINE"),
|
||||
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_CREATED_FILE 10
|
||||
{STRUCT_FLD(field_name, "CREATED_FILE"),
|
||||
STRUCT_FLD(field_length, OS_FILE_MAX_PATH),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_CREATED_LINE 11
|
||||
{STRUCT_FLD(field_name, "CREATED_LINE"),
|
||||
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_WRITER_THREAD 12
|
||||
{STRUCT_FLD(field_name, "WRITER_THREAD"),
|
||||
STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_RESERVATION_MODE 13
|
||||
{STRUCT_FLD(field_name, "RESERVATION_MODE"),
|
||||
STRUCT_FLD(field_length, 16),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_READERS 14
|
||||
{STRUCT_FLD(field_name, "READERS"),
|
||||
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_WAITERS_FLAG 15
|
||||
{STRUCT_FLD(field_name, "WAITERS_FLAG"),
|
||||
STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_LOCK_WORD 16
|
||||
{STRUCT_FLD(field_name, "LOCK_WORD"),
|
||||
STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_LAST_READER_FILE 17
|
||||
{STRUCT_FLD(field_name, "LAST_READER_FILE"),
|
||||
STRUCT_FLD(field_length, OS_FILE_MAX_PATH),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_LAST_READER_LINE 18
|
||||
{STRUCT_FLD(field_name, "LAST_READER_LINE"),
|
||||
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_LAST_WRITER_FILE 19
|
||||
{STRUCT_FLD(field_name, "LAST_WRITER_FILE"),
|
||||
STRUCT_FLD(field_length, OS_FILE_MAX_PATH),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_STRING),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_MAYBE_NULL),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_LAST_WRITER_LINE 20
|
||||
{STRUCT_FLD(field_name, "LAST_WRITER_LINE"),
|
||||
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
// SYS_SEMAPHORE_WAITS_OS_WAIT_COUNT 21
|
||||
{STRUCT_FLD(field_name, "OS_WAIT_COUNT"),
|
||||
STRUCT_FLD(field_length, MY_INT32_NUM_DECIMAL_DIGITS),
|
||||
STRUCT_FLD(field_type, MYSQL_TYPE_LONG),
|
||||
STRUCT_FLD(value, 0),
|
||||
STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
|
||||
STRUCT_FLD(old_name, ""),
|
||||
STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
|
||||
|
||||
END_OF_ST_FIELD_INFO
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*******************************************************************//**
|
||||
Bind the dynamic table INFORMATION_SCHEMA.INNODB_SYS_SEMAPHORE_WAITS
|
||||
@return 0 on success */
|
||||
static
|
||||
int
|
||||
innodb_sys_semaphore_waits_init(
|
||||
/*============================*/
|
||||
void* p) /*!< in/out: table schema object */
|
||||
{
|
||||
ST_SCHEMA_TABLE* schema;
|
||||
|
||||
DBUG_ENTER("innodb_sys_semaphore_waits_init");
|
||||
|
||||
schema = (ST_SCHEMA_TABLE*) p;
|
||||
|
||||
schema->fields_info = innodb_sys_semaphore_waits_fields_info;
|
||||
schema->fill_table = sync_arr_fill_sys_semphore_waits_table;
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
UNIV_INTERN struct st_mysql_plugin i_s_innodb_sys_semaphore_waits =
|
||||
{
|
||||
/* the plugin type (a MYSQL_XXX_PLUGIN value) */
|
||||
/* int */
|
||||
STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN),
|
||||
|
||||
/* pointer to type-specific plugin descriptor */
|
||||
/* void* */
|
||||
STRUCT_FLD(info, &i_s_info),
|
||||
|
||||
/* plugin name */
|
||||
/* const char* */
|
||||
STRUCT_FLD(name, "INNODB_SYS_SEMAPHORE_WAITS"),
|
||||
|
||||
/* plugin author (for SHOW PLUGINS) */
|
||||
/* const char* */
|
||||
STRUCT_FLD(author, maria_plugin_author),
|
||||
|
||||
/* general descriptive text (for SHOW PLUGINS) */
|
||||
/* const char* */
|
||||
STRUCT_FLD(descr, "InnoDB SYS_SEMAPHORE_WAITS"),
|
||||
|
||||
/* the plugin license (PLUGIN_LICENSE_XXX) */
|
||||
/* int */
|
||||
STRUCT_FLD(license, PLUGIN_LICENSE_GPL),
|
||||
|
||||
/* the function to invoke when plugin is loaded */
|
||||
/* int (*)(void*); */
|
||||
STRUCT_FLD(init, innodb_sys_semaphore_waits_init),
|
||||
|
||||
/* the function to invoke when plugin is unloaded */
|
||||
/* int (*)(void*); */
|
||||
STRUCT_FLD(deinit, i_s_common_deinit),
|
||||
|
||||
/* plugin version (for SHOW PLUGINS) */
|
||||
/* unsigned int */
|
||||
STRUCT_FLD(version, INNODB_VERSION_SHORT),
|
||||
|
||||
/* struct st_mysql_show_var* */
|
||||
STRUCT_FLD(status_vars, NULL),
|
||||
|
||||
/* struct st_mysql_sys_var** */
|
||||
STRUCT_FLD(system_vars, NULL),
|
||||
|
||||
/* Maria extension */
|
||||
STRUCT_FLD(version_info, INNODB_VERSION_STR),
|
||||
STRUCT_FLD(maturity, MariaDB_PLUGIN_MATURITY_STABLE),
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue