Skip to content
/ server Public

Commit eea4934

Browse files
MDEV-38003: Intermittent Replication Failure on a multi-table DELETE
When deleting from multiple tables, the DELETE operator uses a temporary table to collect the row IDs of rows that will be deleted. If this table grows too large, then we convert it from a heap temporary table to a persistent (on-disk) temporary table to avoid unbounded memory usage. There are several error codes that gate creating this persistent temporary table but themselves don't indicate a problem with the DELETE operation. However, regardless of this error code value, we need to clear it after deciding whether or not to create the persistent temporary table. If we don't clear this value, then the error code's stale state prevents binlog replication when its value is muxed with local_error during multi_delete::send_eof.
1 parent 2a3bc9e commit eea4934

File tree

3 files changed

+107
-0
lines changed

3 files changed

+107
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
include/master-slave.inc
2+
[connection master]
3+
#
4+
# MDEV-38003 Intermittent Replication Failure on a multi-table DELETE
5+
#
6+
connection master;
7+
set sql_log_bin=1;
8+
connection slave;
9+
set sql_log_bin=1;
10+
reset master;
11+
connection master;
12+
create database mdev38003;
13+
use mdev38003;
14+
create table t1 (pk int, num int);
15+
create table t2 (pk int, num int);
16+
create table t3 (pk int, num int);
17+
insert into t1 (pk, num) values (1,1900),(2,1901);
18+
insert into t2 (pk, num) values (2,2001),(2,2002);
19+
insert into t3 (pk, num) values (1,40),(2,42);
20+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk;
21+
pk num pk num pk num
22+
2 1901 2 2001 2 42
23+
2 1901 2 2002 2 42
24+
1 1900 NULL NULL NULL NULL
25+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
26+
pk num pk num pk num
27+
2 1901 2 2001 2 42
28+
2 1901 2 2002 2 42
29+
connection slave;
30+
use mdev38003;
31+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk;
32+
pk num pk num pk num
33+
2 1901 2 2001 2 42
34+
2 1901 2 2002 2 42
35+
1 1900 NULL NULL NULL NULL
36+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
37+
pk num pk num pk num
38+
2 1901 2 2001 2 42
39+
2 1901 2 2002 2 42
40+
connection master;
41+
use mdev38003;
42+
delete t1, t2, t3 from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
43+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk;
44+
pk num pk num pk num
45+
1 1900 NULL NULL NULL NULL
46+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
47+
pk num pk num pk num
48+
connection slave;
49+
use mdev38003;
50+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk;
51+
pk num pk num pk num
52+
1 1900 NULL NULL NULL NULL
53+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
54+
pk num pk num pk num
55+
connection master;
56+
use mdev38003;
57+
drop table t1, t2, t3;
58+
drop database mdev38003;
59+
# End of 11.8 tests
60+
include/rpl_end.inc
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
source include/master-slave.inc;
2+
3+
--echo #
4+
--echo # MDEV-38003 Intermittent Replication Failure on a multi-table DELETE
5+
--echo #
6+
connection master;
7+
set sql_log_bin=1;
8+
sync_slave_with_master;
9+
set sql_log_bin=1;
10+
reset master;
11+
connection master;
12+
create database mdev38003;
13+
use mdev38003;
14+
create table t1 (pk int, num int);
15+
create table t2 (pk int, num int);
16+
create table t3 (pk int, num int);
17+
insert into t1 (pk, num) values (1,1900),(2,1901);
18+
insert into t2 (pk, num) values (2,2001),(2,2002);
19+
insert into t3 (pk, num) values (1,40),(2,42);
20+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk;
21+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
22+
23+
sync_slave_with_master;
24+
use mdev38003;
25+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk;
26+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
27+
28+
connection master;
29+
use mdev38003;
30+
delete t1, t2, t3 from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
31+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk;
32+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
33+
34+
sync_slave_with_master;
35+
use mdev38003;
36+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk;
37+
select * from t1 left join t2 on t1.pk = t2.pk left join t3 on t2.pk = t3.pk where t2.num <= 2002;
38+
39+
connection master;
40+
use mdev38003;
41+
drop table t1, t2, t3;
42+
drop database mdev38003;
43+
44+
--echo # End of 11.8 tests
45+
46+
--source include/rpl_end.inc

sql/sql_delete.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,6 +1477,7 @@ int multi_delete::send_data(List<Item> &values)
14771477
}
14781478
found++;
14791479
}
1480+
error= 0;
14801481
}
14811482
}
14821483
}

0 commit comments

Comments
 (0)