From 7ecb869b6edfc95dcd4b5fa01e246ee2403b2c68 Mon Sep 17 00:00:00 2001 From: Sven Sandberg Date: Tue, 13 Jul 2010 11:13:06 +0200 Subject: [PATCH] BUG#54729: sleep() capped to 5 seconds when executed in the sql thread or in an event Symptom: When the sql function SLEEP() was executed in the slave SQL thread or from an event (as in CREATE EVENT, not binlog event), then the timeout was capped to 5 seconds. Background: This bug was introduced in the fix of BUG#10374, in the function interruptible_wait() in item_func.cc. The function interruptible_wait(), called from item_func_sleep::val_int(), splits the sleep into 5 seconds units. After each unit, it checks if thd->is_connected() is true: if not, it stops sleeping. The purpose is to not use system resources to sleep when a client disconnects. However, thd->is_connected() returns false for the slave SQL thread and for the event worker thread, because they don't connect to the server the same way as client threads do. Fix: Make thd->is_connected() return true for all system threads. sql/sql_class.h: Made THD::is_connected() return true for all system threads. --- sql/sql_class.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sql/sql_class.h b/sql/sql_class.h index db22fc5d67b..b73f830463e 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -2459,7 +2459,12 @@ public: /** Return FALSE if connection to client is broken. */ bool is_connected() { - return vio_ok() ? vio_is_connected(net.vio) : FALSE; + /* + All system threads (e.g., the slave IO thread) are connected but + not using vio. So this function always returns true for all + system threads. + */ + return system_thread || (vio_ok() ? vio_is_connected(net.vio) : FALSE); } #else inline bool vio_ok() const { return TRUE; }