mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
Merge work:/home/bk/mysql into mashka.mysql.fi:/home/my/mysql-3.23
This commit is contained in:
commit
446f23568a
1 changed files with 18 additions and 0 deletions
|
@ -1376,6 +1376,24 @@ mysql_execute_command(void)
|
||||||
start_slave(thd);
|
start_slave(thd);
|
||||||
break;
|
break;
|
||||||
case SQLCOM_SLAVE_STOP:
|
case SQLCOM_SLAVE_STOP:
|
||||||
|
/*
|
||||||
|
if the client thread has locked tables, a deadlock is possible.
|
||||||
|
Assume that
|
||||||
|
- the client thread does LOCK TABLE t READ.
|
||||||
|
- then the master updates t.
|
||||||
|
- then the SQL slave thread wants to update t,
|
||||||
|
so it waits for the client thread because t is locked by it.
|
||||||
|
- then the client thread does SLAVE STOP.
|
||||||
|
SLAVE STOP waits for the SQL slave thread to terminate its
|
||||||
|
update t, which waits for the client thread because t is locked by it.
|
||||||
|
To prevent that, refuse SLAVE STOP if the
|
||||||
|
client thread has locked tables
|
||||||
|
*/
|
||||||
|
if (thd->locked_tables || thd->active_transaction())
|
||||||
|
{
|
||||||
|
send_error(&thd->net,ER_LOCK_OR_ACTIVE_TRANSACTION);
|
||||||
|
break;
|
||||||
|
}
|
||||||
stop_slave(thd);
|
stop_slave(thd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue