Commit a10a9448 authored by Michael Widenius's avatar Michael Widenius

Added new states to be able to better diagnose where server hangs.

- Table locks now ends with state "After table lock"
- Open table now ends with state "After opening tables"
- All calls to close_thread_tables(), not only from mysql_execute_command(), has state "closing tables"
- Added state "executing" for mysql admin commands, like CACHE INDEX, REPAIR TABLE etc.
- Added state "Finding key cache" for CACHE INDEX
- Added state "Filling schema table" when we generate temporary table for SHOW commands and information schema.

Other things:
Add limit from innobase for thread_sleep_delay. This fixed a failing tests case.
Added db.opt to support-files to make 'make package' work


mysql-test/suite/funcs_1/datadict/processlist_val.inc:
  Use new state
mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result:
  Updated test result because of new state
mysql-test/suite/funcs_1/r/processlist_val_no_prot.result:
  Updated test result because of new state
sql/CMakeLists.txt:
  Have option files in support-files
sql/lock.cc:
  Added new state 'After table lock'
sql/sql_admin.cc:
  Added state "executing" and "Sending data" for mysql admin commands, like CACHE INDEX, REPAIR TABLE etc.
  Added state "Finding key cache"
sql/sql_base.cc:
  open tables now ends with state "After table lock", instead of NULL
sql/sql_parse.cc:
  Moved state "closing tables" to close_thread_tables()
sql/sql_show.cc:
  Added state "Filling schema table" when we generate temporary table for SHOW commands and information schema.
storage/xtradb/buf/buf0buf.c:
  Removed compiler warning
storage/xtradb/handler/ha_innodb.cc:
  Add limit from innobase for thread_sleep_delay. This fixed a failing tests case.
support-files/db.opt:
  cmakes needs this to create data/test directory
parent f137be80
...@@ -89,7 +89,7 @@ echo ...@@ -89,7 +89,7 @@ echo
# - TIME (printed value will be unified), the exact values are like # - TIME (printed value will be unified), the exact values are like
# "normal" load: 0 (seconds) # "normal" load: 0 (seconds)
# "heavy" load: 1 or more (seconds) # "heavy" load: 1 or more (seconds)
# - State 'executing' # - State 'Filling schema table'
# - INFO must contain the corresponding SHOW/SELECT PROCESSLIST # - INFO must contain the corresponding SHOW/SELECT PROCESSLIST
# #
# 1. Just dump what we get # 1. Just dump what we get
...@@ -109,7 +109,7 @@ FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = @default_id; ...@@ -109,7 +109,7 @@ FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = @default_id;
SELECT COUNT(*) = 1 AS "Expect 1" SELECT COUNT(*) = 1 AS "Expect 1"
FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = @default_id FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = @default_id
AND USER = 'root' AND DB = 'test' AND Command IN('Query','Execute') AND USER = 'root' AND DB = 'test' AND Command IN('Query','Execute')
AND State = 'executing'; AND State = 'Filling schema table';
# #
# 4. Change the DB # 4. Change the DB
USE information_schema; USE information_schema;
......
...@@ -30,7 +30,7 @@ PROCESSLIST CREATE TEMPORARY TABLE `PROCESSLIST` ( ...@@ -30,7 +30,7 @@ PROCESSLIST CREATE TEMPORARY TABLE `PROCESSLIST` (
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS
<ID> root <HOST_NAME> test Query <TIME> executing SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000 <ID> root <HOST_NAME> test Query <TIME> Filling schema table SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
Id User Host db Command Time State Info Progress Id User Host db Command Time State Info Progress
<ID> root <HOST_NAME> test Query <TIME> NULL SHOW FULL PROCESSLIST <TIME_MS> <ID> root <HOST_NAME> test Query <TIME> NULL SHOW FULL PROCESSLIST <TIME_MS>
...@@ -42,7 +42,7 @@ Expect exact one connection with this id ...@@ -42,7 +42,7 @@ Expect exact one connection with this id
SELECT COUNT(*) = 1 AS "Expect 1" SELECT COUNT(*) = 1 AS "Expect 1"
FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = @default_id FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = @default_id
AND USER = 'root' AND DB = 'test' AND Command IN('Query','Execute') AND USER = 'root' AND DB = 'test' AND Command IN('Query','Execute')
AND State = 'executing'; AND State = 'Filling schema table';
Expect 1 Expect 1
1 1
USE information_schema; USE information_schema;
...@@ -78,7 +78,7 @@ Has TIME a reasonable value? ...@@ -78,7 +78,7 @@ Has TIME a reasonable value?
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS
<ID> test_user <HOST_NAME> information_schema Sleep <TIME> NULL <TIME_MS> 0 0 0.000 <ID> test_user <HOST_NAME> information_schema Sleep <TIME> NULL <TIME_MS> 0 0 0.000
<ID> root <HOST_NAME> information_schema Query <TIME> executing SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000 <ID> root <HOST_NAME> information_schema Query <TIME> Filling schema table SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
Id User Host db Command Time State Info Progress Id User Host db Command Time State Info Progress
<ID> root <HOST_NAME> information_schema Query <TIME> NULL SHOW FULL PROCESSLIST 0.000 <ID> root <HOST_NAME> information_schema Query <TIME> NULL SHOW FULL PROCESSLIST 0.000
...@@ -111,7 +111,7 @@ Expect 1 ...@@ -111,7 +111,7 @@ Expect 1
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS
<ID> test_user <HOST_NAME> information_schema Query <TIME> executing SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000 <ID> test_user <HOST_NAME> information_schema Query <TIME> Filling schema table SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
Id User Host db Command Time State Info Progress Id User Host db Command Time State Info Progress
<ID> test_user <HOST_NAME> information_schema Query <TIME> NULL SHOW FULL PROCESSLIST 0.000 <ID> test_user <HOST_NAME> information_schema Query <TIME> NULL SHOW FULL PROCESSLIST 0.000
...@@ -128,7 +128,7 @@ Id User Host db Command Time State Info Progress ...@@ -128,7 +128,7 @@ Id User Host db Command Time State Info Progress
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS
<ID> test_user <HOST_NAME> information_schema Query <TIME> executing SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000 <ID> test_user <HOST_NAME> information_schema Query <TIME> Filling schema table SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000
<ID> test_user <HOST_NAME> information_schema Sleep <TIME> NULL <TIME_MS> 0 0 0.000 <ID> test_user <HOST_NAME> information_schema Sleep <TIME> NULL <TIME_MS> 0 0 0.000
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
Id User Host db Command Time State Info Progress Id User Host db Command Time State Info Progress
...@@ -156,7 +156,7 @@ SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; ...@@ -156,7 +156,7 @@ SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS
<ID> test_user <HOST_NAME> information_schema Query <TIME> User sleep SELECT sleep(10), 17 <TIME_MS> 0 0 0.000 <ID> test_user <HOST_NAME> information_schema Query <TIME> User sleep SELECT sleep(10), 17 <TIME_MS> 0 0 0.000
<ID> test_user <HOST_NAME> information_schema Sleep <TIME> NULL <TIME_MS> 0 0 0.000 <ID> test_user <HOST_NAME> information_schema Sleep <TIME> NULL <TIME_MS> 0 0 0.000
<ID> root <HOST_NAME> information_schema Query <TIME> executing SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000 <ID> root <HOST_NAME> information_schema Query <TIME> Filling schema table SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000
SHOW FULL PROCESSLIST; SHOW FULL PROCESSLIST;
Id User Host db Command Time State Info Progress Id User Host db Command Time State Info Progress
<ID> root <HOST_NAME> information_schema Query <TIME> NULL SHOW FULL PROCESSLIST 0.000 <ID> root <HOST_NAME> information_schema Query <TIME> NULL SHOW FULL PROCESSLIST 0.000
...@@ -203,7 +203,7 @@ SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; ...@@ -203,7 +203,7 @@ SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS ID USER HOST DB COMMAND TIME STATE INFO TIME_MS STAGE MAX_STAGE PROGRESS
<ID> test_user <HOST_NAME> information_schema Query <TIME> Waiting for table metadata lock SELECT COUNT(*) FROM test.t1 <TIME_MS> 0 0 0.000 <ID> test_user <HOST_NAME> information_schema Query <TIME> Waiting for table metadata lock SELECT COUNT(*) FROM test.t1 <TIME_MS> 0 0 0.000
<ID> test_user <HOST_NAME> information_schema Sleep <TIME> NULL <TIME_MS> 0 0 0.000 <ID> test_user <HOST_NAME> information_schema Sleep <TIME> NULL <TIME_MS> 0 0 0.000
<ID> root <HOST_NAME> information_schema Query <TIME> executing SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000 <ID> root <HOST_NAME> information_schema Query <TIME> Filling schema table SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST <TIME_MS> 0 0 0.000
UNLOCK TABLES; UNLOCK TABLES;
# ----- switch to connection con2 (user = test_user) ----- # ----- switch to connection con2 (user = test_user) -----
......
...@@ -271,7 +271,7 @@ ADD_CUSTOM_TARGET(distclean ...@@ -271,7 +271,7 @@ ADD_CUSTOM_TARGET(distclean
IF(INSTALL_LAYOUT STREQUAL "STANDALONE") IF(INSTALL_LAYOUT STREQUAL "STANDALONE")
# Copy db.opt into data/test/ # Copy db.opt into data/test/
SET(DBOPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/db.opt ) SET(DBOPT_FILE ${CMAKE_SOURCE_DIR}/support-files/db.opt )
INSTALL(FILES ${DBOPT_FILE} DESTINATION data/test COMPONENT DataFiles) INSTALL(FILES ${DBOPT_FILE} DESTINATION data/test COMPONENT DataFiles)
# Install initial database on windows # Install initial database on windows
......
...@@ -323,7 +323,7 @@ bool mysql_lock_tables(THD *thd, MYSQL_LOCK *sql_lock, uint flags) ...@@ -323,7 +323,7 @@ bool mysql_lock_tables(THD *thd, MYSQL_LOCK *sql_lock, uint flags)
(void) unlock_external(thd, sql_lock->table, sql_lock->table_count); (void) unlock_external(thd, sql_lock->table, sql_lock->table_count);
end: end:
thd_proc_info(thd, 0); thd_proc_info(thd, "After table lock");
if (thd->killed) if (thd->killed)
{ {
......
...@@ -647,7 +647,9 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, ...@@ -647,7 +647,9 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
} }
DBUG_PRINT("admin", ("calling operator_func '%s'", operator_name)); DBUG_PRINT("admin", ("calling operator_func '%s'", operator_name));
thd_proc_info(thd, "executing");
result_code = (table->table->file->*operator_func)(thd, check_opt); result_code = (table->table->file->*operator_func)(thd, check_opt);
thd_proc_info(thd, "Sending data");
DBUG_PRINT("admin", ("operator_func returned: %d", result_code)); DBUG_PRINT("admin", ("operator_func returned: %d", result_code));
if (result_code == HA_ADMIN_NOT_IMPLEMENTED && need_repair_or_alter) if (result_code == HA_ADMIN_NOT_IMPLEMENTED && need_repair_or_alter)
...@@ -771,6 +773,7 @@ send_result_message: ...@@ -771,6 +773,7 @@ send_result_message:
} }
if (protocol->write()) if (protocol->write())
goto err; goto err;
thd_proc_info(thd, "recreating table");
DBUG_PRINT("info", ("HA_ADMIN_TRY_ALTER, trying analyze...")); DBUG_PRINT("info", ("HA_ADMIN_TRY_ALTER, trying analyze..."));
TABLE_LIST *save_next_local= table->next_local, TABLE_LIST *save_next_local= table->next_local,
*save_next_global= table->next_global; *save_next_global= table->next_global;
...@@ -975,6 +978,7 @@ bool mysql_assign_to_keycache(THD* thd, TABLE_LIST* tables, ...@@ -975,6 +978,7 @@ bool mysql_assign_to_keycache(THD* thd, TABLE_LIST* tables,
KEY_CACHE *key_cache; KEY_CACHE *key_cache;
DBUG_ENTER("mysql_assign_to_keycache"); DBUG_ENTER("mysql_assign_to_keycache");
thd_proc_info(thd, "Finding key cache");
check_opt.init(); check_opt.init();
mysql_mutex_lock(&LOCK_global_system_variables); mysql_mutex_lock(&LOCK_global_system_variables);
if (!(key_cache= get_key_cache(key_cache_name))) if (!(key_cache= get_key_cache(key_cache_name)))
......
...@@ -1467,6 +1467,8 @@ void close_thread_tables(THD *thd) ...@@ -1467,6 +1467,8 @@ void close_thread_tables(THD *thd)
TABLE *table; TABLE *table;
DBUG_ENTER("close_thread_tables"); DBUG_ENTER("close_thread_tables");
thd_proc_info(thd, "closing tables");
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
DBUG_PRINT("tcache", ("open tables:")); DBUG_PRINT("tcache", ("open tables:"));
for (table= thd->open_tables; table; table= table->next) for (table= thd->open_tables; table; table= table->next)
...@@ -5170,7 +5172,7 @@ restart: ...@@ -5170,7 +5172,7 @@ restart:
} }
err: err:
thd_proc_info(thd, 0); thd_proc_info(thd, "After opening tables");
free_root(&new_frm_mem, MYF(0)); // Free pre-alloced block free_root(&new_frm_mem, MYF(0)); // Free pre-alloced block
if (error && *table_to_open) if (error && *table_to_open)
...@@ -5619,7 +5621,7 @@ end: ...@@ -5619,7 +5621,7 @@ end:
trans_rollback_stmt(thd); trans_rollback_stmt(thd);
close_thread_tables(thd); close_thread_tables(thd);
} }
thd_proc_info(thd, 0); thd_proc_info(thd, "After opening table");
DBUG_RETURN(table); DBUG_RETURN(table);
} }
......
...@@ -4579,7 +4579,6 @@ finish: ...@@ -4579,7 +4579,6 @@ finish:
} }
/* Free tables */ /* Free tables */
thd_proc_info(thd, "closing tables");
close_thread_tables(thd); close_thread_tables(thd);
thd_proc_info(thd, 0); thd_proc_info(thd, 0);
......
...@@ -7651,10 +7651,13 @@ bool get_schema_tables_result(JOIN *join, ...@@ -7651,10 +7651,13 @@ bool get_schema_tables_result(JOIN *join,
THD *thd= join->thd; THD *thd= join->thd;
LEX *lex= thd->lex; LEX *lex= thd->lex;
bool result= 0; bool result= 0;
const char *old_proc_info;
DBUG_ENTER("get_schema_tables_result"); DBUG_ENTER("get_schema_tables_result");
Warnings_only_error_handler err_handler; Warnings_only_error_handler err_handler;
thd->push_internal_handler(&err_handler); thd->push_internal_handler(&err_handler);
old_proc_info= thd_proc_info(thd, "Filling schema table");
for (JOIN_TAB *tab= first_linear_tab(join, WITH_CONST_TABLES); for (JOIN_TAB *tab= first_linear_tab(join, WITH_CONST_TABLES);
tab; tab;
tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS))
...@@ -7743,6 +7746,7 @@ bool get_schema_tables_result(JOIN *join, ...@@ -7743,6 +7746,7 @@ bool get_schema_tables_result(JOIN *join,
} }
else if (result) else if (result)
my_error(ER_UNKNOWN_ERROR, MYF(0)); my_error(ER_UNKNOWN_ERROR, MYF(0));
thd_proc_info(thd, old_proc_info);
DBUG_RETURN(result); DBUG_RETURN(result);
} }
......
...@@ -2537,7 +2537,9 @@ loop: ...@@ -2537,7 +2537,9 @@ loop:
rw_lock_s_unlock(&buf_pool->page_hash_latch); rw_lock_s_unlock(&buf_pool->page_hash_latch);
} }
#if defined UNIV_DEBUG || defined UNIV_IBUF_DEBUG
loop2: loop2:
#endif
if (block && buf_pool_watch_is_sentinel(buf_pool, &block->page)) { if (block && buf_pool_watch_is_sentinel(buf_pool, &block->page)) {
mutex_exit(block_mutex); mutex_exit(block_mutex);
block = NULL; block = NULL;
......
...@@ -13281,7 +13281,7 @@ static MYSQL_SYSVAR_ULONG(thread_concurrency, srv_thread_concurrency, ...@@ -13281,7 +13281,7 @@ static MYSQL_SYSVAR_ULONG(thread_concurrency, srv_thread_concurrency,
static MYSQL_SYSVAR_ULONG(thread_sleep_delay, srv_thread_sleep_delay, static MYSQL_SYSVAR_ULONG(thread_sleep_delay, srv_thread_sleep_delay,
PLUGIN_VAR_RQCMDARG, PLUGIN_VAR_RQCMDARG,
"Time of innodb thread sleeping before joining InnoDB queue (usec). Value 0 disable a sleep", "Time of innodb thread sleeping before joining InnoDB queue (usec). Value 0 disable a sleep",
NULL, NULL, 10000L, 0L, ~0UL, 0); NULL, NULL, 10000L, 0L, 1000000L, 0);
static MYSQL_SYSVAR_STR(data_file_path, innobase_data_file_path, static MYSQL_SYSVAR_STR(data_file_path, innobase_data_file_path,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
......
default-character-set=latin1
default-collation=latin1_swedish_ci
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment