diff options
author | Sergei Golubchik <sergii@pisem.net> | 2014-05-07 16:12:39 +0200 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2014-05-07 16:12:39 +0200 |
commit | a83a4136ffd44e214fd7c7ddf6aa3307242d4f29 (patch) | |
tree | 14e18a51707dd8d98e9ee5d427a8a56d8570e816 | |
parent | bff1b52a101abc17ef05ee1602e261f06da35403 (diff) | |
download | mariadb-git-a83a4136ffd44e214fd7c7ddf6aa3307242d4f29.tar.gz |
revno: 5265
committer: Christopher Powers <chris.powers@oracle.com>
branch nick: mysql-5.6-bug16750433
timestamp: Fri 2013-06-28 07:48:12 -0500
message:
Bug#16750433 - THE STATEMENT DIGEST DOES NOT SHOW THE SLAVE SQL
THREAD STATEMENTS
revno: 5414.1.1
committer: Marc Alff <marc.alff@oracle.com>
branch nick: mysql-5.6-bug17271055
timestamp: Thu 2013-08-29 12:29:25 +0200
message:
Bug#17271055 "STATEMENT/COM" EVENT MEANING IS UNCLEAR
(test case was merged with perfschema 5.6.17)
-rw-r--r-- | sql/log_event.cc | 13 | ||||
-rw-r--r-- | sql/mysqld.cc | 47 | ||||
-rw-r--r-- | sql/mysqld.h | 5 | ||||
-rw-r--r-- | sql/sys_vars.cc | 5 |
4 files changed, 61 insertions, 9 deletions
diff --git a/sql/log_event.cc b/sql/log_event.cc index 6610c436302..b68d6c1fbc3 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -41,6 +41,7 @@ #include "transaction.h" #include <my_dir.h> #include "sql_show.h" // append_identifier +#include <mysql/psi/mysql_statement.h> #include <strfunc.h> #include "compat56.h" @@ -4272,6 +4273,13 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi, Parser_state parser_state; if (!parser_state.init(thd, thd->query(), thd->query_length())) { + thd->m_statement_psi= MYSQL_START_STATEMENT(&thd->m_statement_state, + stmt_info_rpl.m_key, + thd->db, thd->db_length, + thd->charset()); + THD_STAGE_INFO(thd, stage_init); + MYSQL_SET_STATEMENT_TEXT(thd->m_statement_psi, thd->query(), thd->query_length()); + mysql_parse(thd, thd->query(), thd->query_length(), &parser_state); /* Finalize server status flags after executing a statement. */ thd->update_server_status(); @@ -4455,6 +4463,11 @@ end: thd->set_db(NULL, 0); /* will free the current database */ thd->reset_query(); DBUG_PRINT("info", ("end: query= 0")); + + /* Mark the statement completed. */ + MYSQL_END_STATEMENT(thd->m_statement_psi, thd->get_stmt_da()); + thd->m_statement_psi= NULL; + /* As a disk space optimization, future masters will not log an event for LAST_INSERT_ID() if that function returned 0 (and thus they will be able diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 438c56659b0..a9ee5890fdf 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -338,6 +338,13 @@ static PSI_rwlock_key key_rwlock_openssl; volatile sig_atomic_t ld_assume_kernel_is_set= 0; #endif +/** + Statement instrumentation key for replication. +*/ +#ifdef HAVE_PSI_STATEMENT_INTERFACE +PSI_statement_info stmt_info_rpl; +#endif + /* the default log output is log tables */ static bool lower_case_table_names_used= 0; static bool max_long_data_size_used= false; @@ -3791,7 +3798,7 @@ void init_com_statement_info() com_statement_info[index].m_flags= 0; } - /* "statement/com/query" can mutate into "statement/sql/..." */ + /* "statement/abstract/query" can mutate into "statement/sql/..." */ com_statement_info[(uint) COM_QUERY].m_flags= PSI_FLAG_MUTABLE; } #endif @@ -9617,23 +9624,49 @@ void init_server_psi_keys(void) category= "com"; init_com_statement_info(); - count= array_elements(com_statement_info); + + /* + Register [0 .. COM_QUERY - 1] as "statement/com/..." + */ + count= (int) COM_QUERY; mysql_statement_register(category, com_statement_info, count); /* + Register [COM_QUERY + 1 .. COM_END] as "statement/com/..." + */ + count= (int) COM_END - (int) COM_QUERY; + mysql_statement_register(category, & com_statement_info[(int) COM_QUERY + 1], count); + + category= "abstract"; + /* + Register [COM_QUERY] as "statement/abstract/com_query" + */ + mysql_statement_register(category, & com_statement_info[(int) COM_QUERY], 1); + + /* When a new packet is received, - it is instrumented as "statement/com/". + it is instrumented as "statement/abstract/new_packet". Based on the packet type found, it later mutates to the proper narrow type, for example - "statement/com/query" or "statement/com/ping". - In cases of "statement/com/query", SQL queries are given to + "statement/abstract/query" or "statement/com/ping". + In cases of "statement/abstract/query", SQL queries are given to the parser, which mutates the statement type to an even more narrow classification, for example "statement/sql/select". */ stmt_info_new_packet.m_key= 0; - stmt_info_new_packet.m_name= ""; + stmt_info_new_packet.m_name= "new_packet"; stmt_info_new_packet.m_flags= PSI_FLAG_MUTABLE; - mysql_statement_register(category, & stmt_info_new_packet, 1); + mysql_statement_register(category, &stmt_info_new_packet, 1); + + /* + Statements processed from the relay log are initially instrumented as + "statement/abstract/relay_log". The parser will mutate the statement type to + a more specific classification, for example "statement/sql/insert". + */ + stmt_info_rpl.m_key= 0; + stmt_info_rpl.m_name= "relay_log"; + stmt_info_rpl.m_flags= PSI_FLAG_MUTABLE; + mysql_statement_register(category, &stmt_info_rpl, 1); #endif } diff --git a/sql/mysqld.h b/sql/mysqld.h index 0e3af959122..09f886bff01 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -461,6 +461,11 @@ extern PSI_statement_info sql_statement_info[(uint) SQLCOM_END + 1]; */ extern PSI_statement_info com_statement_info[(uint) COM_END + 1]; +/** + Statement instrumentation key for replication. +*/ +extern PSI_statement_info stmt_info_rpl; + void init_sql_statement_info(); void init_com_statement_info(); #endif /* HAVE_PSI_STATEMENT_INTERFACE */ diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 44f47646e38..b772c82ef52 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -287,14 +287,15 @@ static Sys_var_long Sys_pfs_events_stages_history_size( - 1 for "statement/com/new_packet", for unknown enum_server_command - 1 for "statement/com/Error", for invalid enum_server_command - SQLCOM_END for all regular "statement/sql/...", - - 1 for "statement/sql/error", for invalid enum_sql_command. + - 1 for "statement/sql/error", for invalid enum_sql_command + - 1 for "statement/rpl/relay_log", for replicated statements. */ static Sys_var_ulong Sys_pfs_max_statement_classes( "performance_schema_max_statement_classes", "Maximum number of statement instruments.", PARSED_EARLY READ_ONLY GLOBAL_VAR(pfs_param.m_statement_class_sizing), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, 256), - DEFAULT((ulong) SQLCOM_END + (ulong) COM_END + 3), + DEFAULT((ulong) SQLCOM_END + (ulong) COM_END + 4), BLOCK_SIZE(1)); static Sys_var_long Sys_pfs_events_statements_history_long_size( |