mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Forbid SLAVE STOP if the thread executing the query has locked
tables. This removes a possible deadlock situation.
This commit is contained in:
@@ -1376,6 +1376,24 @@ mysql_execute_command(void)
|
||||
start_slave(thd);
|
||||
break;
|
||||
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);
|
||||
break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user