From 9a4a845adc81b16f64d870a0e8e457bd4b6689c5 Mon Sep 17 00:00:00 2001 From: Konstantin Osipov Date: Tue, 13 Oct 2009 22:29:28 +0400 Subject: Backport of the following revision from 6.0-codebase: ---------------------------------------------------------- revno: 2617.1.12 committer: kostja@bodhi.(none) timestamp: Sun 2008-04-20 11:18:52 +0400 message: A fix for Bug#32771 "events_bugs.test fails randomly". In Event_scheduler::stop(), which may be called from destructor, wait synchronously for the parallel Event_scheduler::stop() to complete before returning. This fixes a race between MySQL shutdown thread and the scheduler thread who could call stop() in parallel. sql/event_scheduler.cc: There was a race condition between the shutdown thread and the scheduler thread: the shutdown thread could delete the scheduler mutex before the sheduler has stopped. --- sql/event_scheduler.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sql/event_scheduler.cc b/sql/event_scheduler.cc index daaa6be0520..ea20270b457 100644 --- a/sql/event_scheduler.cc +++ b/sql/event_scheduler.cc @@ -607,7 +607,12 @@ Event_scheduler::stop() LOCK_DATA(); DBUG_PRINT("info", ("state before action %s", scheduler_states_names[state].str)); if (state != RUNNING) + { + /* Synchronously wait until the scheduler stops. */ + while (state != INITIALIZED) + COND_STATE_WAIT(thd, NULL, "Waiting for the scheduler to stop"); goto end; + } /* Guarantee we don't catch spurious signals */ do { -- cgit v1.2.1