mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
fix for bug #17619 Scheduler race conditions
- Scheduler is either initialized at server start or never. Starting & stopping is now suspending & resuming. - The scheduler has clear OO interface - Now all calls to the scheduler are synchronous - GLOBAL event_scheduler uses thd::sys_var_tmp (see set_var.cc) - External API is encapsulated into class Events - Includes fixes for all comments of Kostja's review of 19.05.2005 Starting to merge into 5.1-release (5.1.10) and push BitKeeper/etc/ignore: Added libmysqld/event_scheduler.cc to the ignore list libmysqld/Makefile.am: executor -> scheduler mysql-test/r/events.result: update result mysql-test/r/events_bugs.result: update result mysql-test/r/events_logs_tests.result: update result mysql-test/r/events_microsec.result: update result mysql-test/r/events_scheduling.result: update result mysql-test/r/events_stress.result: update result mysql-test/t/disabled.def: enable these tests mysql-test/t/events.test: optimize the test a bit for speed, save some seconds runtime remove FULL from SHOW EVENTS mostly use I_S.EVENTS mysql-test/t/events_bugs.test: Skip irrelevant for the current design tests - all events are loaded on server startup. Change in mysql.event will be visible on next server start. Don't use numeric error codes. mysql-test/t/events_logs_tests.test: optimize the test a bit for speed mysql-test/t/events_microsec.test: Skip irrelevant for the current design tests - all events are loaded on server startup. Change in mysql.event will be visible on next server start. Don't use numeric error codes. mysql-test/t/events_scheduling.test: broader test mysql-test/t/events_stress.test: Rework the test to the new architecture of suspending/resuming. Use less events, no need for thousands, hundreds is still ok. sql/Makefile.am: executor -> scheduler sql/cmakelists.txt: executor -> scheduler sql/event.cc: - remove todo comments - remove unneded evex_queue abstraction functions - move events_init() and events_shutdown() from event_executor.cc to here - export db_create_event - remove evex_load_and_compile_event, part of class Event_scheduler - integrate the public interface found in event.h and used by sql_parse.cc to use the new class Event_scheduler. sql/event.h: - add COND_finished so if one thread kills a running event it waits on this - export callback event_timed_definer_equal, event_timed_identifier_equal(), event_timed_name_equal and event_timed_db_equal() to be used by Event_scheduler::drop_matching_events() - cleanup event.h - encapsulated all external interface into class Events sql/event_executor.cc: make it empty, will delete after that sql/event_priv.h: - more things in the private header - remove event queue abstraction functions. tightly bind to QUEUE - export privately db_drop_event, db_find_event, db_create_event() - made change_security_context() and restore_security_context() free functions sql/event_timed.cc: - fix calculation of time when ENDS is set (STARTS is always set) - during Event_timed::compile() set the right Security_ctx. Prevents a crash during Event_scheduler::load_events_from_db() - add Event_timed::kill_thread() - implement event_timed_*_equal() - made change_security_context() and restore_security_context() free functions. - Comments cleanups sql/lex.h: new word scheduler for SHOW SCHEDULER STATUS (available only debug builds) sql/log.cc: move these from event_scheduler.cc sql/mysql_priv.h: refactor kill_one_thread export sql_print_message_func and sql_print_message_handlers sql/mysqld.cc: In close_connections, called by kill_server() skip the main scheduler thread and use events_shutdown() for shutting down the scheduler, in the same manner it's done for RPL. Add a new value to --event-scheduler : 0 <- No scheduler available 1 <- Start with scheduler enabled 2 <- Start with scheduler suspended sql/repl_failsafe.cc: refactor thd::system_thread to be an enum sql/set_var.cc: move sys_var_event_executor::update() to set_var.cc executor -> scheduler use thd::sys_var_tmp sql/set_var.h: executor -> scheduler sql/share/errmsg.txt: 3 new error messages sql/sql_class.cc: refactor thd::system_thread to be an enum . more type-safety sql/sql_class.h: refactor thd::system_thread to be an enum . more type-safety sql/sql_db.cc: get the error from evex_drop_schema_events sql/sql_error.h: export warning_level_names sql/sql_lex.h: new command SHOW SCHEDULER STATUS, available only in debug build and for debug purposes. sql/sql_parse.cc: refactor kill_one_thread() -> does the *dirty* work, and sql_kill just the reporting. add handler for SQLCOM_SHOW_SCHEDULER_STATUS sql/sql_show.cc: fix verbosity handling (this will be obsoleted anyway by the fix for 17394). sql/sql_yacc.yy: remove FULL from SHOW EVENTS add SHOW SCHEDULER STATUS in debug builds sql/table.cc: Fix valgrind warning.
This commit is contained in:
@ -4049,8 +4049,9 @@ fill_events_copy_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
|
||||
/* type */
|
||||
sch_table->field[5]->store(STRING_WITH_LEN("RECURRING"), scs);
|
||||
|
||||
if (event_reconstruct_interval_expression(&show_str, et.interval,
|
||||
et.expression))
|
||||
if (Events::reconstruct_interval_expression(&show_str,
|
||||
et.interval,
|
||||
et.expression))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
sch_table->field[7]->set_notnull();
|
||||
@ -4080,13 +4081,13 @@ fill_events_copy_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
|
||||
}
|
||||
|
||||
//status
|
||||
if (et.status == MYSQL_EVENT_ENABLED)
|
||||
if (et.status == Event_timed::ENABLED)
|
||||
sch_table->field[12]->store(STRING_WITH_LEN("ENABLED"), scs);
|
||||
else
|
||||
sch_table->field[12]->store(STRING_WITH_LEN("DISABLED"), scs);
|
||||
|
||||
//on_completion
|
||||
if (et.on_completion == MYSQL_EVENT_ON_COMPLETION_DROP)
|
||||
if (et.on_completion == Event_timed::ON_COMPLETION_DROP)
|
||||
sch_table->field[13]->store(STRING_WITH_LEN("NOT PRESERVE"), scs);
|
||||
else
|
||||
sch_table->field[13]->store(STRING_WITH_LEN("PRESERVE"), scs);
|
||||
@ -4138,7 +4139,7 @@ int fill_schema_events(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
|
||||
thd->reset_n_backup_open_tables_state(&backup);
|
||||
|
||||
if ((ret= evex_open_event_table(thd, TL_READ, &event_table)))
|
||||
if ((ret= Events::open_event_table(thd, TL_READ, &event_table)))
|
||||
{
|
||||
sql_print_error("Table mysql.event is damaged.");
|
||||
ret= 1;
|
||||
@ -4147,13 +4148,10 @@ int fill_schema_events(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
|
||||
event_table->file->ha_index_init(0, 1);
|
||||
|
||||
/*
|
||||
see others' events only if you have PROCESS_ACL !!
|
||||
thd->lex->verbose is set either if SHOW FULL EVENTS or
|
||||
in case of SELECT FROM I_S.EVENTS
|
||||
*/
|
||||
verbose= (thd->lex->verbose
|
||||
&& (thd->security_ctx->master_access & PROCESS_ACL));
|
||||
/* see others' events only if you have PROCESS_ACL !! */
|
||||
verbose= ((thd->lex->verbose ||
|
||||
thd->lex->orig_sql_command != SQLCOM_SHOW_EVENTS) &&
|
||||
(thd->security_ctx->master_access & PROCESS_ACL));
|
||||
|
||||
if (verbose && thd->security_ctx->user)
|
||||
{
|
||||
@ -4162,12 +4160,13 @@ int fill_schema_events(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
}
|
||||
else
|
||||
{
|
||||
event_table->field[EVEX_FIELD_DEFINER]->store(definer, strlen(definer), scs);
|
||||
event_table->field[Events::FIELD_DEFINER]->
|
||||
store(definer, strlen(definer), scs);
|
||||
key_len= event_table->key_info->key_part[0].store_length;
|
||||
|
||||
if (thd->lex->select_lex.db)
|
||||
{
|
||||
event_table->field[EVEX_FIELD_DB]->
|
||||
event_table->field[Events::FIELD_DB]->
|
||||
store(thd->lex->select_lex.db, strlen(thd->lex->select_lex.db), scs);
|
||||
key_len+= event_table->key_info->key_part[1].store_length;
|
||||
}
|
||||
|
Reference in New Issue
Block a user