Skip to content

Commit 6eb1eed

Browse files
committed
MDEV-24452 ALTER TABLE event take infinite time which for example breaks mysql_upgrade
The problem was that update_timing_fields_for_event() didn't release all MDL locks it took.
1 parent 9930cb2 commit 6eb1eed

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

mysql-test/main/alter_events.result

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
SET GLOBAL event_scheduler=1;
2+
CREATE TABLE t1 (a int primary key, b int) engine=innodb;
3+
insert into t1 values (1,1),(2,2),(3,3);
4+
CREATE TABLE t2 (a int primary key) engine=innodb;
5+
CREATE EVENT e_t1 ON SCHEDULE EVERY 1 SECOND DO insert ignore into test.t2 select a from test.t1;
6+
select * from t2;
7+
a
8+
1
9+
2
10+
3
11+
drop event e_t1;
12+
ALTER TABLE mysql.event DROP PRIMARY KEY, ADD PRIMARY KEY(db,name);
13+
drop table t1,t2;
14+
SET GLOBAL event_scheduler=default;

mysql-test/main/alter_events.test

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--source include/not_embedded.inc
2+
--source include/have_innodb.inc
3+
#--source include/have_metadata_lock_info.inc
4+
5+
#
6+
# Testing of problems with ALTER TABLE and events on the same table(s)
7+
#
8+
9+
#
10+
# MDEV-24452 ALTER TABLE event take infinite time which for example breaks
11+
# mysql_upgrade
12+
#
13+
14+
SET GLOBAL event_scheduler=1;
15+
16+
CREATE TABLE t1 (a int primary key, b int) engine=innodb;
17+
insert into t1 values (1,1),(2,2),(3,3);
18+
CREATE TABLE t2 (a int primary key) engine=innodb;
19+
20+
CREATE EVENT e_t1 ON SCHEDULE EVERY 1 SECOND DO insert ignore into test.t2 select a from test.t1;
21+
22+
let $wait_condition=SELECT count(*) > 0 from t2;
23+
--source include/wait_condition.inc
24+
select * from t2;
25+
drop event e_t1;
26+
27+
# select * from information_schema.metadata_lock_info;
28+
ALTER TABLE mysql.event DROP PRIMARY KEY, ADD PRIMARY KEY(db,name);
29+
drop table t1,t2;
30+
31+
SET GLOBAL event_scheduler=default;

sql/event_db_repository.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,6 +1130,12 @@ update_timing_fields_for_event(THD *thd,
11301130

11311131
DBUG_ASSERT(thd->security_ctx->master_access & PRIV_IGNORE_READ_ONLY);
11321132

1133+
/*
1134+
Take a savepoint to release only the lock on mysql.event
1135+
table at the end but keep the global read lock and
1136+
possible other locks taken by the caller.
1137+
*/
1138+
MDL_savepoint mdl_savepoint= thd->mdl_context.mdl_savepoint();
11331139
if (open_event_table(thd, TL_WRITE, &table))
11341140
DBUG_RETURN(1);
11351141

@@ -1162,6 +1168,7 @@ update_timing_fields_for_event(THD *thd,
11621168
end:
11631169
if (thd->commit_whole_transaction_and_close_tables())
11641170
ret= 1;
1171+
thd->mdl_context.rollback_to_savepoint(mdl_savepoint);
11651172

11661173
DBUG_RETURN(MY_TEST(ret));
11671174
}

0 commit comments

Comments
 (0)