1
0
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:
Alexey Botchkov
2016-03-23 12:16:39 +04:00
parent e4435b5ec3
commit 2783fc7d14
6 changed files with 219 additions and 82 deletions

View File

@@ -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

View 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