From d22bb45cce40cb015982c193664df08afecb14c7 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 13 Dec 2005 23:10:29 +0100 Subject: [PATCH] WL#1034 (update) - fixed silly bug, the main thread restarted but did not execute events, Quite currious why many calls to pthread_mutex_init() do not lead to abort() sql/event.cc: - remove mysql_event_table_exists - fix possible crash when table is 0x0 sql/event_executor.cc: - make event_executor_running_global_var volatile - fix erroneous reinitilization of a mutex, why did it not crash in debug mode? why pthread_mutex_init() does not abort() in case the mutex was not deinitted beforehand? - first initialization of event_executor_running_global_var inside init_mutexes() - remove debug if() sql/event_priv.h: - remove unneeded definitions sql/event_timed.cc: make backup and then restore the open table state of thd --- sql/event.cc | 21 ++------------------- sql/event_executor.cc | 20 +++++++++----------- sql/event_priv.h | 2 -- sql/event_timed.cc | 12 ++++++++++-- 4 files changed, 21 insertions(+), 34 deletions(-) diff --git a/sql/event.cc b/sql/event.cc index 362af209f9a..806780e5097 100644 --- a/sql/event.cc +++ b/sql/event.cc @@ -64,14 +64,10 @@ Warning: */ - - -bool mysql_event_table_exists= 1; QUEUE EVEX_EQ_NAME; MEM_ROOT evex_mem_root; - void evex_queue_init(EVEX_QUEUE_TYPE *queue) { @@ -175,7 +171,6 @@ event_timed_compare(event_timed **a, event_timed **b) else return 0; -// return my_time_compare(&(*a)->execute_at, &(*b)->execute_at); } @@ -204,23 +199,13 @@ TABLE *evex_open_event_table(THD *thd, enum thr_lock_type lock_type) bool not_used; DBUG_ENTER("open_proc_table"); - /* - Speed up things if the table doesn't exists. *table_exists - is set when we create or read stored procedure or on flush privileges. - */ - if (!mysql_event_table_exists) - DBUG_RETURN(0); - bzero((char*) &tables, sizeof(tables)); tables.db= (char*) "mysql"; tables.table_name= tables.alias= (char*) "event"; tables.lock_type= lock_type; if (simple_open_n_lock_tables(thd, &tables)) - { - mysql_event_table_exists= 0; DBUG_RETURN(0); - } DBUG_RETURN(tables.table); } @@ -638,7 +623,7 @@ done: et= 0; } // don't close the table if we haven't opened it ourselves - if (!tbl) + if (!tbl && table) close_thread_tables(thd); *ett= et; DBUG_RETURN(ret); @@ -745,9 +730,7 @@ done: } -/* - -= Exported functions follow =- -*/ + /* The function exported to the world for creating of events. diff --git a/sql/event_executor.cc b/sql/event_executor.cc index 530625c8b03..623e45bf118 100644 --- a/sql/event_executor.cc +++ b/sql/event_executor.cc @@ -41,7 +41,7 @@ bool evex_is_running= false; ulonglong evex_main_thread_id= 0; ulong opt_event_executor; -my_bool event_executor_running_global_var= false; +volatile my_bool event_executor_running_global_var; static my_bool evex_mutexes_initted= false; static uint workers_count; @@ -65,13 +65,14 @@ static void evex_init_mutexes() { if (evex_mutexes_initted) - { - evex_mutexes_initted= true; return; - } + + evex_mutexes_initted= true; pthread_mutex_init(&LOCK_event_arrays, MY_MUTEX_INIT_FAST); pthread_mutex_init(&LOCK_workers_count, MY_MUTEX_INIT_FAST); pthread_mutex_init(&LOCK_evex_running, MY_MUTEX_INIT_FAST); + + event_executor_running_global_var= opt_event_executor; } @@ -88,7 +89,6 @@ init_events() VOID(pthread_mutex_lock(&LOCK_evex_running)); evex_is_running= false; - event_executor_running_global_var= false; VOID(pthread_mutex_unlock(&LOCK_evex_running)); #ifndef DBUG_FAULTY_THR @@ -206,7 +206,6 @@ event_executor_main(void *arg) evex_queue_init(&EVEX_EQ_NAME); VOID(pthread_mutex_unlock(&LOCK_event_arrays)); evex_is_running= true; - event_executor_running_global_var= opt_event_executor; VOID(pthread_mutex_unlock(&LOCK_evex_running)); if (evex_load_events_from_db(thd)) @@ -224,7 +223,7 @@ event_executor_main(void *arg) cnt++; DBUG_PRINT("info", ("EVEX External Loop %d", cnt)); - if (cnt > 1000) continue; + thd->proc_info = "Sleeping"; if (!evex_queue_num_elements(EVEX_EQ_NAME) || !event_executor_running_global_var) @@ -573,18 +572,17 @@ end: } - bool sys_var_event_executor::update(THD *thd, set_var *var) { // here start the thread if not running. VOID(pthread_mutex_lock(&LOCK_evex_running)); - if ((my_bool) var->save_result.ulong_value && !evex_is_running) + *value= var->save_result.ulong_value; + if ((my_bool) *value && !evex_is_running) { VOID(pthread_mutex_unlock(&LOCK_evex_running)); init_events(); } else VOID(pthread_mutex_unlock(&LOCK_evex_running)); - - return sys_var_bool_ptr::update(thd, var); + return 0; } diff --git a/sql/event_priv.h b/sql/event_priv.h index 786d65ea94d..cb45a700cb8 100644 --- a/sql/event_priv.h +++ b/sql/event_priv.h @@ -88,8 +88,6 @@ evex_queue_init(EVEX_QUEUE_TYPE *queue); extern bool evex_is_running; -extern bool mysql_event_table_exists; -//extern DYNAMIC_ARRAY events_array; extern MEM_ROOT evex_mem_root; extern pthread_mutex_t LOCK_event_arrays, LOCK_workers_count, diff --git a/sql/event_timed.cc b/sql/event_timed.cc index db5e031b09b..747eab4558c 100644 --- a/sql/event_timed.cc +++ b/sql/event_timed.cc @@ -725,6 +725,7 @@ bool event_timed::update_fields(THD *thd) { TABLE *table; + Open_tables_state backup; int ret= 0; bool opened; @@ -736,8 +737,14 @@ event_timed::update_fields(THD *thd) if (!(status_changed || last_executed_changed)) goto done; + thd->reset_n_backup_open_tables_state(&backup); + if (!(table= evex_open_event_table(thd, TL_WRITE))) - DBUG_RETURN(SP_OPEN_TABLE_FAILED); + { + ret= SP_OPEN_TABLE_FAILED; + goto done; + } + if ((ret= evex_db_find_event_aux(thd, dbname, name, table))) goto done; @@ -764,6 +771,7 @@ event_timed::update_fields(THD *thd) done: close_thread_tables(thd); + thd->restore_backup_open_tables_state(&backup); DBUG_RETURN(ret); } @@ -798,7 +806,7 @@ event_timed::get_show_create_event(THD *thd, uint *length) *dst= '\0'; *length= len; - dst[len]= '\0'; + sql_print_information("%d %d[%s]", len, dst-ret, ret); return ret; }