mirror of
https://github.com/MariaDB/server.git
synced 2025-02-09 23:24:11 +01:00
![Monty](/assets/img/avatar_default.png)
Problem was timing between the thread that was killed and reading the binary log. Updated the test to wait until the killed thread was properly terminated before checking what's in the binary log. To make check safe, I changed "threads_connected" to be updated after thd::cleanup() is done, to ensure that all binary logs updates are done before the variable is changed. This was mainly done to get the test deterministic and have now other real influence in how the server works.
275 lines
7.7 KiB
Text
275 lines
7.7 KiB
Text
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
|
|
connect con1, localhost, root,,;
|
|
connect con2, localhost, root,,;
|
|
create table t1 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=InnoDB;
|
|
create table t2 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=MyISAM;
|
|
create table t3 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=InnoDB;
|
|
connection con1;
|
|
select get_lock("a", 20);
|
|
get_lock("a", 20)
|
|
1
|
|
connection con2;
|
|
reset master;
|
|
insert into t2 values (null, null), (null, get_lock("a", 10));
|
|
connection con1;
|
|
kill query ID;
|
|
connection con2;
|
|
select
|
|
(@a:=load_file("MYSQLTEST_VARDIR/tmp/kill_query_calling_sp.binlog"))
|
|
is not null;
|
|
set @result= 2 - 1 - 1;
|
|
select @result /* must be zero either way */;
|
|
@result
|
|
0
|
|
connection con1;
|
|
select RELEASE_LOCK("a");
|
|
RELEASE_LOCK("a")
|
|
1
|
|
delete from t1;
|
|
delete from t2;
|
|
insert into t1 values (1,1),(2,2);
|
|
connection con1;
|
|
begin;
|
|
update t1 set b=11 where a=2;
|
|
connection con2;
|
|
begin;
|
|
update t1 set b=b+10;
|
|
connection con1;
|
|
kill query ID;
|
|
rollback;
|
|
connection con2;
|
|
rollback;
|
|
select * from t1 order by a /* must be the same as before (1,1),(2,2) */;
|
|
a b
|
|
1 1
|
|
2 2
|
|
connection con1;
|
|
begin;
|
|
delete from t1 where a=2;
|
|
connection con2;
|
|
begin;
|
|
delete from t1 where a=2;
|
|
connection con1;
|
|
kill query ID;
|
|
rollback;
|
|
connection con2;
|
|
rollback;
|
|
select * from t1 order by a /* must be the same as before (1,1),(2,2) */;
|
|
a b
|
|
1 1
|
|
2 2
|
|
connection con1;
|
|
drop table if exists t4;
|
|
create table t4 (a int, b int) engine=innodb;
|
|
insert into t4 values (3, 3);
|
|
begin;
|
|
insert into t1 values (3, 3);
|
|
connection con2;
|
|
begin;
|
|
insert into t1 select * from t4 for update;
|
|
connection con1;
|
|
kill query ID;
|
|
rollback;
|
|
connection con2;
|
|
rollback;
|
|
select * from t1 /* must be the same as before (1,1),(2,2) */;
|
|
a b
|
|
1 1
|
|
2 2
|
|
drop table t4;
|
|
create table t4 (a int, b int) ENGINE=MyISAM /* for killing update and delete */;
|
|
create function bug27563(n int)
|
|
RETURNS int(11)
|
|
NOT DETERMINISTIC
|
|
begin
|
|
if @b > 0 then
|
|
select get_lock("a", 20) into @a;
|
|
else
|
|
set @b= 1;
|
|
end if;
|
|
return n;
|
|
end|
|
|
delete from t4;
|
|
insert into t4 values (1,1), (1,1);
|
|
reset master;
|
|
connection con1;
|
|
select get_lock("a", 20);
|
|
get_lock("a", 20)
|
|
1
|
|
connection con2;
|
|
set @b= 0;
|
|
update t4 set b=b + bug27563(b);
|
|
connection con1;
|
|
select count(*) FROM INFORMATION_SCHEMA.PROCESSLIST where state='User lock';
|
|
count(*)
|
|
1
|
|
kill query ID;
|
|
connection con2;
|
|
ERROR 70100: Query execution was interrupted
|
|
select * from t4 order by b /* must be (1,1), (1,2) */;
|
|
a b
|
|
1 1
|
|
1 2
|
|
select @b /* must be 1 at the end of a stmt calling bug27563() */;
|
|
@b
|
|
1
|
|
must have the update query event on the 4th line
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # User var # # @`b`=0
|
|
master-bin.000001 # Query # # use `test`; update t4 set b=b + bug27563(b)
|
|
master-bin.000001 # Query # # COMMIT
|
|
*** a proof the query is binlogged with an error ***
|
|
select
|
|
(@a:=load_file("MYSQLTEST_VARDIR/tmp/binlog_killed_bug27571.binlog"))
|
|
is not null;
|
|
(@a:=load_file("MYSQLTEST_VARDIR/tmp/binlog_killed_bug27571.binlog"))
|
|
is not null
|
|
1
|
|
select 0 /* must return 0 to mean the killed update is in */;
|
|
0
|
|
0
|
|
connection con1;
|
|
select RELEASE_LOCK("a");
|
|
RELEASE_LOCK("a")
|
|
1
|
|
delete from t4;
|
|
insert into t4 values (1,1), (2,2);
|
|
reset master;
|
|
connection con1;
|
|
select get_lock("a", 20);
|
|
get_lock("a", 20)
|
|
1
|
|
connection con2;
|
|
set @b= 0;
|
|
delete from t4 where b=bug27563(1) or b=bug27563(2);
|
|
connection con1;
|
|
select count(*) FROM INFORMATION_SCHEMA.PROCESSLIST where state='User lock';
|
|
count(*)
|
|
1
|
|
kill query ID;
|
|
connection con2;
|
|
ERROR 70100: Query execution was interrupted
|
|
select count(*) from t4 /* must be 1 */;
|
|
count(*)
|
|
1
|
|
select @b /* must be 1 at the end of a stmt calling bug27563() */;
|
|
@b
|
|
1
|
|
must have the delete query event on the 4th line
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # User var # # @`b`=0
|
|
master-bin.000001 # Query # # use `test`; delete from t4 where b=bug27563(1) or b=bug27563(2)
|
|
master-bin.000001 # Query # # COMMIT
|
|
select
|
|
(@a:=load_file("MYSQLTEST_VARDIR/tmp/binlog_killed_bug27571.binlog"))
|
|
is not null;
|
|
(@a:=load_file("MYSQLTEST_VARDIR/tmp/binlog_killed_bug27571.binlog"))
|
|
is not null
|
|
1
|
|
select 0 /* must return 0 to mean the killed delete is in */;
|
|
0
|
|
0
|
|
connection con1;
|
|
select RELEASE_LOCK("a");
|
|
RELEASE_LOCK("a")
|
|
1
|
|
drop table t4;
|
|
drop function bug27563;
|
|
FLUSH LOGS;
|
|
connect con3, localhost, root,,;
|
|
connection con3;
|
|
MI: MyISAM, INNODB
|
|
BEGIN;
|
|
INSERT INTO t2 VALUES (NULL, 1);
|
|
INSERT INTO t1 VALUES (NULL, 2);
|
|
connection con1;
|
|
KILL ID;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
|
|
master-bin.000002 # Gtid_list # # [#-#-#]
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Intvar # # INSERT_ID=3
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t2 VALUES (NULL, 1)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Intvar # # INSERT_ID=4
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (NULL, 2)
|
|
master-bin.000002 # Query # # ROLLBACK
|
|
disconnect con3;
|
|
connect con3, localhost, root,,;
|
|
connection con3;
|
|
IM: INNODB, MyISAM
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (NULL, 3);
|
|
INSERT INTO t2 VALUES (NULL, 4);
|
|
connection con1;
|
|
KILL ID;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Intvar # # INSERT_ID=4
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t2 VALUES (NULL, 4)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Intvar # # INSERT_ID=5
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (NULL, 3)
|
|
master-bin.000002 # Query # # ROLLBACK
|
|
disconnect con3;
|
|
connect con3, localhost, root,,;
|
|
connection con3;
|
|
IMI: INNODB, MyISAM, INNODB
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (NULL, 5);
|
|
INSERT INTO t2 VALUES (NULL, 6);
|
|
INSERT INTO t1 VALUES (NULL, 7);
|
|
connection con1;
|
|
KILL ID;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Intvar # # INSERT_ID=5
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t2 VALUES (NULL, 6)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Intvar # # INSERT_ID=6
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (NULL, 5)
|
|
master-bin.000002 # Intvar # # INSERT_ID=7
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (NULL, 7)
|
|
master-bin.000002 # Query # # ROLLBACK
|
|
disconnect con3;
|
|
connect con3, localhost, root,,;
|
|
connection con3;
|
|
MI2: MyISAM, INNODB, MyISAM, INNODB
|
|
BEGIN;
|
|
INSERT INTO t2 VALUES (NULL, 8);
|
|
INSERT INTO t1 VALUES (NULL, 9);
|
|
INSERT INTO t2 VALUES (NULL, 10);
|
|
INSERT INTO t1 VALUES (NULL, 11);
|
|
connection con1;
|
|
KILL ID;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Intvar # # INSERT_ID=6
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t2 VALUES (NULL, 8)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Intvar # # INSERT_ID=7
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t2 VALUES (NULL, 10)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Intvar # # INSERT_ID=8
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (NULL, 9)
|
|
master-bin.000002 # Intvar # # INSERT_ID=9
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (NULL, 11)
|
|
master-bin.000002 # Query # # ROLLBACK
|
|
connection default;
|
|
disconnect con1;
|
|
disconnect con2;
|
|
drop table t1,t2,t3;
|
|
end of the tests
|