• unknown's avatar
    Fix for bug#22740 Events: Decouple Event_queue from Event_db_repository · 3c39b0d8
    unknown authored
    This patch implements the idea of the bug report by making Event_queue
    unaware of Event_db_repository by making a higher level class - Events,
    which is aware of most of all classes, responsible for passing all data
    needed for adding/updating/deleting an event to/from the queue.
    
    Introduces few new classes :
     - Event_worker_thread
     - Event_queue_element_for_exec
    
    
    sql/event_data_objects.cc:
      Introduced a new class Event_queue_element_for_exec
      According to Konstantin it should be named Event_name and hold
      only two LEX_STRINGs but `dropped` is not saved on disk and will
      require additional logic in Event_worker_thread class, after loading
      to compute whether the event should be dropped or not. It's easier
      just to pass this flag around.
      
      Removed Event_queue_element::drop(). This method was a source of a
      race condition. At the place where the event should be dropped we
      call Events::drop_event() which is the only code-flow for dropping.
      In addition, because ::drop_event() holds Events::LOCK_metadata there is
      no source of race conditions. Before this patch dropping from ::drop()
      wasn't under LOCK_metadata and races were possible.
      
      Because Events::open_event_table was removed as a method, provisionally
      events_event_db_repository was exported from events.cc till a solution is
      build where Event_queue_element does not access directly mysql.event.
    sql/event_data_objects.h:
      New class Event_queue_element_for_exec added which is returned
      from Event_queue::get_top_if_time() and passed through Event_scheduler
      to Event_worker_thread. There by using the (db)name Event_job_data is
      instanciated and executed.
      
      Dropped Event_queue_element::drop()
      
      thd was moved out of Event_job_data as it is now part of
      Event_queue_element_for_exec
    sql/event_queue.cc:
      Removed dependency of Event_queue on Event_db_repository.
      The instantiation of Event_job_data was moved to class Event_worker_thread
      In place is a return of an object of Event_queue_element_for_exec is used
      later for instantiating Event_job_data.
      
      The `dropped` flag of Event_queue_element is passed over
      Event_queue_element_for_exec to the code in Event_worker_thread.
    sql/event_queue.h:
      Removed dependency of Event_queue on Event_db_repository
      Removed dependency on Event_scheduler
    sql/event_scheduler.cc:
      Added class Event_worker_thread, which is used during
      the execution of an event. It has a static init() method
      to get a pointer to Event_db_repository to be used for
      instantiation of Event_job_data object. This object it then
      executed.
    sql/event_scheduler.h:
      Added class Event_worker_thread, which is used during
      the execution of an event.
    sql/events.cc:
      Removed Events::open_event_table() because it was a product of
      a bad architecture.
    sql/events.h:
      Removed friend definition, unneeded.
      
      Fixed Events::drop_event() to have the previous signature without
      bool only_from_disk
    sql/sql_parse.cc:
      Fix call
    3c39b0d8
event_queue.cc 20.1 KB