Commit 9058e481 authored by He Zhenxing's avatar He Zhenxing

BUG#45520 rpl_killed_ddl fails sporadically in pb2

There are three issues that caused rpl_killed_ddl fails sporadically
in pb2:

 1) thd->clear_error() was not called before create Query event
if operation is executed successfully.
 2) DATABASE d2 might do exist because the statement to CREATE or
ALTER it was killed
 3) because of bug 43353, kill the query that do DROP FUNCTION or
    DROP PROCEDURE can result in SP not found

This patch fixed all above issues by:
 1) Called thd->clear_error() if the operation succeeded.
 2) Add IF EXISTS to the DROP DATABASE d2 statement
 3) Temporarily disabled testing DROP FUNCTION/PROCEDURE IF EXISTS.
parent 846c81c7
...@@ -53,7 +53,7 @@ source include/diff_master_slave.inc; ...@@ -53,7 +53,7 @@ source include/diff_master_slave.inc;
DROP DATABASE d1; DROP DATABASE d1;
source include/kill_query.inc; source include/kill_query.inc;
source include/diff_master_slave.inc; source include/diff_master_slave.inc;
DROP DATABASE d2; DROP DATABASE IF EXISTS d2;
source include/kill_query.inc; source include/kill_query.inc;
source include/diff_master_slave.inc; source include/diff_master_slave.inc;
CREATE FUNCTION f2 () RETURNS INT DETERMINISTIC CREATE FUNCTION f2 () RETURNS INT DETERMINISTIC
...@@ -63,10 +63,7 @@ source include/diff_master_slave.inc; ...@@ -63,10 +63,7 @@ source include/diff_master_slave.inc;
ALTER FUNCTION f1 SQL SECURITY INVOKER; ALTER FUNCTION f1 SQL SECURITY INVOKER;
source include/kill_query.inc; source include/kill_query.inc;
source include/diff_master_slave.inc; source include/diff_master_slave.inc;
DROP FUNCTION IF EXISTS f1; DROP FUNCTION f1;
source include/kill_query.inc;
source include/diff_master_slave.inc;
DROP FUNCTION IF EXISTS f2;
source include/kill_query.inc; source include/kill_query.inc;
source include/diff_master_slave.inc; source include/diff_master_slave.inc;
CREATE PROCEDURE p2 (OUT rows INT) CREATE PROCEDURE p2 (OUT rows INT)
...@@ -79,10 +76,7 @@ source include/diff_master_slave.inc; ...@@ -79,10 +76,7 @@ source include/diff_master_slave.inc;
ALTER PROCEDURE p1 SQL SECURITY INVOKER COMMENT 'return rows of table t1'; ALTER PROCEDURE p1 SQL SECURITY INVOKER COMMENT 'return rows of table t1';
source include/kill_query.inc; source include/kill_query.inc;
source include/diff_master_slave.inc; source include/diff_master_slave.inc;
DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE p1;
source include/kill_query.inc;
source include/diff_master_slave.inc;
DROP PROCEDURE IF EXISTS p2;
source include/kill_query.inc; source include/kill_query.inc;
source include/diff_master_slave.inc; source include/diff_master_slave.inc;
CREATE TABLE t2 (b int); CREATE TABLE t2 (b int);
......
...@@ -123,7 +123,7 @@ source include/kill_query_and_diff_master_slave.inc; ...@@ -123,7 +123,7 @@ source include/kill_query_and_diff_master_slave.inc;
send DROP DATABASE d1; send DROP DATABASE d1;
source include/kill_query_and_diff_master_slave.inc; source include/kill_query_and_diff_master_slave.inc;
send DROP DATABASE d2; send DROP DATABASE IF EXISTS d2;
source include/kill_query_and_diff_master_slave.inc; source include/kill_query_and_diff_master_slave.inc;
######## FUNCTION ######## ######## FUNCTION ########
...@@ -139,13 +139,21 @@ source include/kill_query_and_diff_master_slave.inc; ...@@ -139,13 +139,21 @@ source include/kill_query_and_diff_master_slave.inc;
# function f1 probably does not exist because the ALTER query was # function f1 probably does not exist because the ALTER query was
# killed # killed
send DROP FUNCTION IF EXISTS f1; send DROP FUNCTION f1;
source include/kill_query_and_diff_master_slave.inc; source include/kill_query_and_diff_master_slave.inc;
# function f2 probably does not exist because the CREATE query was # function f2 probably does not exist because the CREATE query was
# killed # killed
send DROP FUNCTION IF EXISTS f2; #
source include/kill_query_and_diff_master_slave.inc; # Temporarily disabled. Because of BUG#43353, KILL the query may
# result in function not found, and for 5.1, DROP statements will be
# logged if the function is not found on master, so the following DROP
# FUNCTION statement may be interrupted and not drop the function on
# master, but still get logged and executed on slave and cause
# inconsistence. Also disable the following DROP PROCEDURE IF EXITS
# below.
#send DROP FUNCTION IF EXISTS f2;
#source include/kill_query_and_diff_master_slave.inc;
######## PROCEDURE ######## ######## PROCEDURE ########
...@@ -163,11 +171,12 @@ source include/kill_query_and_diff_master_slave.inc; ...@@ -163,11 +171,12 @@ source include/kill_query_and_diff_master_slave.inc;
send ALTER PROCEDURE p1 SQL SECURITY INVOKER COMMENT 'return rows of table t1'; send ALTER PROCEDURE p1 SQL SECURITY INVOKER COMMENT 'return rows of table t1';
source include/kill_query_and_diff_master_slave.inc; source include/kill_query_and_diff_master_slave.inc;
send DROP PROCEDURE IF EXISTS p1; send DROP PROCEDURE p1;
source include/kill_query_and_diff_master_slave.inc; source include/kill_query_and_diff_master_slave.inc;
send DROP PROCEDURE IF EXISTS p2; # Temporarily disabled because of bug#43353, see comment above for DROP FUNCTION IF EXISTS
source include/kill_query_and_diff_master_slave.inc; #send DROP PROCEDURE IF EXISTS p2;
#source include/kill_query_and_diff_master_slave.inc;
######## TABLE ######## ######## TABLE ########
......
...@@ -541,6 +541,7 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, ...@@ -541,6 +541,7 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info,
file. In this case it's best to just continue as if nothing has file. In this case it's best to just continue as if nothing has
happened. (This is a very unlikely senario) happened. (This is a very unlikely senario)
*/ */
thd->clear_error();
} }
if (!silent) if (!silent)
...@@ -644,6 +645,7 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info) ...@@ -644,6 +645,7 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info)
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error();
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, Query_log_event qinfo(thd, thd->query, thd->query_length, 0,
/* suppress_use */ TRUE, THD::NOT_KILLED); /* suppress_use */ TRUE, THD::NOT_KILLED);
...@@ -655,7 +657,6 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info) ...@@ -655,7 +657,6 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info)
qinfo.db = db; qinfo.db = db;
qinfo.db_len = (uint) strlen(db); qinfo.db_len = (uint) strlen(db);
thd->clear_error();
/* These DDL methods and logging protected with LOCK_mysql_create_db */ /* These DDL methods and logging protected with LOCK_mysql_create_db */
mysql_bin_log.write(&qinfo); mysql_bin_log.write(&qinfo);
} }
...@@ -769,6 +770,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) ...@@ -769,6 +770,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
} }
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error();
Query_log_event qinfo(thd, query, query_length, 0, Query_log_event qinfo(thd, query, query_length, 0,
/* suppress_use */ TRUE, THD::NOT_KILLED); /* suppress_use */ TRUE, THD::NOT_KILLED);
/* /*
...@@ -779,7 +781,6 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) ...@@ -779,7 +781,6 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
qinfo.db = db; qinfo.db = db;
qinfo.db_len = (uint) strlen(db); qinfo.db_len = (uint) strlen(db);
thd->clear_error();
/* These DDL methods and logging protected with LOCK_mysql_create_db */ /* These DDL methods and logging protected with LOCK_mysql_create_db */
mysql_bin_log.write(&qinfo); mysql_bin_log.write(&qinfo);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment