mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 03:47:17 +02:00
MDEV-717 LP:1003679 - Wrong binlog order on concurrent DROP schema and CREATE function.
The cause of the issue is when DROP DATABASE takes
metadata lock and is in progress through it's
execution, a concurrently running CREATE FUNCTION checks
for the existence of database which it succeeds and then it
waits on the metadata lock. Once DROP DATABASE writes to
BINLOG and finally releases the metadata lock on schema
object, the CREATE FUNCTION waiting on metadata lock
gets in it's code path and succeeds and writes to binlog.
This commit is contained in:
parent
e4435b5ec3
commit
2783fc7d14
6 changed files with 219 additions and 82 deletions
|
|
@ -0,0 +1,52 @@
|
|||
include/master-slave.inc
|
||||
[connection master]
|
||||
RESET MASTER;
|
||||
DROP DATABASE IF EXISTS db_717;
|
||||
DROP EVENT IF EXISTS test.e_x1;
|
||||
set @saved_global_binlog_format = @@global.binlog_format;
|
||||
set @saved_local_binlog_format = @@session.binlog_format;
|
||||
SET GLOBAL BINLOG_FORMAT = STATEMENT;
|
||||
SET SESSION BINLOG_FORMAT = STATEMENT;
|
||||
CREATE DATABASE db_717;
|
||||
CREATE FUNCTION db_717.f1() RETURNS INT RETURN 1;
|
||||
DROP DATABASE db_717;
|
||||
CREATE FUNCTION db_717.f2() RETURNS INT RETURN 1;
|
||||
CREATE DATABASE db_717;
|
||||
CREATE EVENT db_717.e_x1 ON SCHEDULE EVERY 1000 HOUR DO CREATE TABLE t1(id int);
|
||||
DROP DATABASE db_717;
|
||||
CREATE EVENT db_717.e_x2 ON SCHEDULE EVERY 1000 HOUR DO CREATE TABLE t1(id int);
|
||||
CREATE DATABASE db_717;
|
||||
CREATE EVENT test.e_x1 ON SCHEDULE EVERY 1000 HOUR DO CREATE TABLE t1(id int);
|
||||
DROP DATABASE db_717;
|
||||
ALTER EVENT test.e_x1 RENAME TO db_717.e_x2;
|
||||
DROP EVENT test.e_x1;
|
||||
include/show_binlog_events.inc
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # DROP DATABASE IF EXISTS db_717
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; DROP EVENT IF EXISTS test.e_x1
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # CREATE DATABASE db_717
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` FUNCTION `db_717`.`f1`() RETURNS int(11)
|
||||
RETURN 1
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # DROP DATABASE db_717
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # CREATE DATABASE db_717
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` EVENT db_717.e_x1 ON SCHEDULE EVERY 1000 HOUR DO CREATE TABLE t1(id int)
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # DROP DATABASE db_717
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # CREATE DATABASE db_717
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` EVENT test.e_x1 ON SCHEDULE EVERY 1000 HOUR DO CREATE TABLE t1(id int)
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # DROP DATABASE db_717
|
||||
master-bin.000001 # Gtid # # GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; DROP EVENT test.e_x1
|
||||
SET GLOBAL BINLOG_FORMAT = @saved_global_binlog_format;
|
||||
SET SESSION BINLOG_FORMAT = @saved_local_binlog_format;
|
||||
include/rpl_end.inc
|
||||
85
mysql-test/suite/binlog/t/binlog_concurrent_drop_create.test
Normal file
85
mysql-test/suite/binlog/t/binlog_concurrent_drop_create.test
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
# MDEV-717
|
||||
# DROP DATABASE and CREATE PROCEDURE|FUNCTION|EVENT
|
||||
# statements can appear in wrong order in the binlog.
|
||||
#
|
||||
# Note - the test can be undeterministic.
|
||||
|
||||
--source include/master-slave.inc
|
||||
RESET MASTER;
|
||||
|
||||
--disable_warnings
|
||||
DROP DATABASE IF EXISTS db_717;
|
||||
DROP EVENT IF EXISTS test.e_x1;
|
||||
--enable_warnings
|
||||
|
||||
set @saved_global_binlog_format = @@global.binlog_format;
|
||||
set @saved_local_binlog_format = @@session.binlog_format;
|
||||
SET GLOBAL BINLOG_FORMAT = STATEMENT;
|
||||
SET SESSION BINLOG_FORMAT = STATEMENT;
|
||||
|
||||
# test function creation
|
||||
CREATE DATABASE db_717;
|
||||
|
||||
CREATE FUNCTION db_717.f1() RETURNS INT RETURN 1;
|
||||
|
||||
--send
|
||||
|
||||
DROP DATABASE db_717;
|
||||
|
||||
--connection master1
|
||||
|
||||
--error 0,ER_BAD_DB_ERROR
|
||||
|
||||
CREATE FUNCTION db_717.f2() RETURNS INT RETURN 1;
|
||||
|
||||
--connection master
|
||||
|
||||
--reap
|
||||
|
||||
# test event creation
|
||||
CREATE DATABASE db_717;
|
||||
|
||||
CREATE EVENT db_717.e_x1 ON SCHEDULE EVERY 1000 HOUR DO CREATE TABLE t1(id int);
|
||||
|
||||
--send
|
||||
|
||||
DROP DATABASE db_717;
|
||||
|
||||
--connection master1
|
||||
|
||||
--error 0,ER_BAD_DB_ERROR
|
||||
|
||||
CREATE EVENT db_717.e_x2 ON SCHEDULE EVERY 1000 HOUR DO CREATE TABLE t1(id int);
|
||||
|
||||
--connection master
|
||||
|
||||
--reap
|
||||
|
||||
# test event modification
|
||||
CREATE DATABASE db_717;
|
||||
|
||||
CREATE EVENT test.e_x1 ON SCHEDULE EVERY 1000 HOUR DO CREATE TABLE t1(id int);
|
||||
|
||||
--send
|
||||
|
||||
DROP DATABASE db_717;
|
||||
|
||||
--connection master1
|
||||
|
||||
--error 0,ER_BAD_DB_ERROR
|
||||
|
||||
ALTER EVENT test.e_x1 RENAME TO db_717.e_x2;
|
||||
|
||||
--connection master
|
||||
|
||||
--reap
|
||||
|
||||
DROP EVENT test.e_x1;
|
||||
|
||||
source include/show_binlog_events.inc;
|
||||
|
||||
SET GLOBAL BINLOG_FORMAT = @saved_global_binlog_format;
|
||||
SET SESSION BINLOG_FORMAT = @saved_local_binlog_format;
|
||||
|
||||
--source include/rpl_end.inc
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue