mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
de130323b4
This is a 10.5 version of 9b750dcbd8
, fix for
MDEV-23536 Race condition between KILL and transaction commit
InnoDB needs to remove trx from thd before destroying it (trx), otherwise
a concurrent KILL might get a pointer from thd to a destroyed trx.
ha_close_connection() should allow engines to clear ha_data in
hton->on close_connection(). To prevent the engine from being unloaded
while hton->close_connection() is running, we remove the lock from
ha_data and unlock the plugin manually.
239 lines
5.9 KiB
Text
239 lines
5.9 KiB
Text
set local sql_mode="";
|
|
set global sql_mode="";
|
|
CREATE FUNCTION MY_KILL(tid INT) RETURNS INT
|
|
BEGIN
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
|
|
KILL tid;
|
|
RETURN (SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = tid);
|
|
END|
|
|
connect con1, localhost, root;
|
|
connect con2, localhost, root;
|
|
connection con1;
|
|
connection con2;
|
|
connection con1;
|
|
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
|
|
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read';
|
|
connection con2;
|
|
SET DEBUG_SYNC='now WAIT_FOR con1_read';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
|
|
SET DEBUG_SYNC = 'RESET';
|
|
connection con1;
|
|
SELECT 1;
|
|
Got one of the listed errors
|
|
SELECT 1;
|
|
1
|
|
1
|
|
SELECT @id != CONNECTION_ID();
|
|
@id != CONNECTION_ID()
|
|
1
|
|
connection con2;
|
|
SELECT 4;
|
|
4
|
|
4
|
|
connection default;
|
|
KILL (SELECT COUNT(*) FROM mysql.user);
|
|
ERROR 42000: KILL does not support subqueries or stored functions
|
|
connection con1;
|
|
connection con2;
|
|
connection con1;
|
|
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
|
|
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read WAIT_FOR kill';
|
|
connection con2;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR con1_read';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
|
|
SET DEBUG_SYNC = 'RESET';
|
|
connection con1;
|
|
SELECT 1;
|
|
Got one of the listed errors
|
|
SELECT 1;
|
|
1
|
|
1
|
|
SELECT @id != CONNECTION_ID();
|
|
@id != CONNECTION_ID()
|
|
1
|
|
connection con2;
|
|
SELECT 4;
|
|
4
|
|
4
|
|
connection default;
|
|
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT);
|
|
CREATE TABLE t2 (id INT UNSIGNED NOT NULL);
|
|
INSERT INTO t1 VALUES
|
|
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
|
|
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
|
|
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
|
|
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0);
|
|
INSERT t1 SELECT 0 FROM t1 AS a1, t1 AS a2 LIMIT 4032;
|
|
INSERT INTO t2 SELECT id FROM t1;
|
|
connection con1;
|
|
connection con2;
|
|
connection con1;
|
|
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
|
|
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync';
|
|
SELECT id FROM t1 WHERE id IN
|
|
(SELECT DISTINCT a.id FROM t2 a, t2 b, t2 c, t2 d
|
|
GROUP BY ACOS(1/a.id), b.id, c.id, d.id
|
|
HAVING a.id BETWEEN 10 AND 20);
|
|
connection con2;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
|
|
KILL @id;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
|
|
connection con1;
|
|
Got one of the listed errors
|
|
SELECT 1;
|
|
1
|
|
1
|
|
connection default;
|
|
SET DEBUG_SYNC = 'RESET';
|
|
DROP TABLE t1, t2;
|
|
connection con1;
|
|
connection con2;
|
|
connection con1;
|
|
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync WAIT_FOR kill';
|
|
SELECT ACOS(0);
|
|
connection con2;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
|
|
KILL QUERY @id;
|
|
connection con1;
|
|
ACOS(0)
|
|
1.5707963267948966
|
|
SELECT 1;
|
|
1
|
|
1
|
|
SELECT @id = CONNECTION_ID();
|
|
@id = CONNECTION_ID()
|
|
1
|
|
connection default;
|
|
SET DEBUG_SYNC = 'RESET';
|
|
CREATE TABLE t1 (f1 INT);
|
|
CREATE FUNCTION bug27563() RETURNS INT(11)
|
|
DETERMINISTIC
|
|
BEGIN
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
|
|
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
|
|
RETURN 1;
|
|
END|
|
|
connection con1;
|
|
connection con2;
|
|
connection con1;
|
|
INSERT INTO t1 VALUES (bug27563());
|
|
connection con2;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
|
|
KILL QUERY @id;
|
|
connection con1;
|
|
ERROR 70100: Query execution was interrupted
|
|
SELECT * FROM t1;
|
|
f1
|
|
connection default;
|
|
SET DEBUG_SYNC = 'RESET';
|
|
INSERT INTO t1 VALUES(0);
|
|
connection con1;
|
|
UPDATE t1 SET f1= bug27563();
|
|
connection con2;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
|
|
KILL QUERY @id;
|
|
connection con1;
|
|
ERROR 70100: Query execution was interrupted
|
|
SELECT * FROM t1;
|
|
f1
|
|
0
|
|
connection default;
|
|
SET DEBUG_SYNC = 'RESET';
|
|
INSERT INTO t1 VALUES(1);
|
|
connection con1;
|
|
DELETE FROM t1 WHERE bug27563() IS NULL;
|
|
connection con2;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
|
|
KILL QUERY @id;
|
|
connection con1;
|
|
ERROR 70100: Query execution was interrupted
|
|
SELECT * FROM t1;
|
|
f1
|
|
0
|
|
1
|
|
connection default;
|
|
SET DEBUG_SYNC = 'RESET';
|
|
connection con1;
|
|
SELECT * FROM t1 WHERE f1= bug27563();
|
|
connection con2;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
|
|
KILL QUERY @id;
|
|
connection con1;
|
|
ERROR 70100: Query execution was interrupted
|
|
SELECT * FROM t1;
|
|
f1
|
|
0
|
|
1
|
|
connection default;
|
|
SET DEBUG_SYNC = 'RESET';
|
|
DROP FUNCTION bug27563;
|
|
CREATE TABLE t2 (f2 INT);
|
|
CREATE TRIGGER trg27563 BEFORE INSERT ON t1 FOR EACH ROW
|
|
BEGIN
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
|
|
INSERT INTO t2 VALUES(0);
|
|
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
|
|
INSERT INTO t2 VALUES(1);
|
|
END|
|
|
connection con1;
|
|
INSERT INTO t1 VALUES(2),(3);
|
|
connection con2;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
|
|
KILL QUERY @id;
|
|
connection con1;
|
|
ERROR 70100: Query execution was interrupted
|
|
SELECT * FROM t1;
|
|
f1
|
|
0
|
|
1
|
|
SELECT * FROM t2;
|
|
f2
|
|
0
|
|
connection default;
|
|
SET DEBUG_SYNC = 'RESET';
|
|
DROP TABLE t1, t2;
|
|
#
|
|
# Bug#19723: kill of active connection yields different error code
|
|
# depending on platform.
|
|
#
|
|
connection con1;
|
|
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
|
|
KILL @id;
|
|
ERROR 70100: Connection was killed
|
|
connection con2;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
|
|
connection con1;
|
|
# ER_SERVER_SHUTDOWN, CR_SERVER_GONE_ERROR, CR_SERVER_LOST,
|
|
# depending on the timing of close of the connection socket
|
|
SELECT 1;
|
|
Got one of the listed errors
|
|
SELECT 1;
|
|
1
|
|
1
|
|
SELECT @id != CONNECTION_ID();
|
|
@id != CONNECTION_ID()
|
|
1
|
|
connection default;
|
|
SET DEBUG_SYNC = 'RESET';
|
|
DROP FUNCTION MY_KILL;
|
|
set global sql_mode=default;
|
|
disconnect con1;
|
|
disconnect con2;
|
|
#
|
|
# MDEV-29368 Assertion `trx->mysql_thd == thd' failed in innobase_kill_query from process_timers/timer_handler and use-after-poison in innobase_kill_query
|
|
#
|
|
connect foo,localhost,root;
|
|
create table t1 (a int) engine=innodb;
|
|
insert t1 values (1);
|
|
set debug_sync='THD_cleanup_after_set_killed SIGNAL go0 WAIT_FOR go1';
|
|
set debug_sync='innobase_connection_closed SIGNAL go2 WAIT_FOR go3';
|
|
disconnect foo;
|
|
connection default;
|
|
set debug_sync='now WAIT_FOR go0';
|
|
set debug_sync='found_killee SIGNAL go1 WAIT_FOR go2';
|
|
kill $id;
|
|
set debug_sync='now SIGNAL go3';
|
|
drop table t1;
|
|
set debug_sync='reset';
|