Commit 7c367029 authored by Sven Sandberg's avatar Sven Sandberg

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.
parent 465e4025
......@@ -2459,7 +2459,12 @@ class THD :public Statement,
/** 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; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment