mirror of
https://github.com/MariaDB/server.git
synced 2025-09-02 09:41:40 +03: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:
@@ -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
|
||||
|
Reference in New Issue
Block a user