• unknown's avatar
    fix for bug #17619 Scheduler race conditions · f4781a7e
    unknown authored
    - 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.
    f4781a7e
sql_class.cc 75.2 KB