From 31608f67ab310e7c84477a79d5b2f683113365e0 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 13 Jun 2007 16:24:21 -0400 Subject: [PATCH 1/2] Bug #28953 Using events in a replication let the slave crash. Fixed where the slave code would try to update the Lex->sphead which is NULL on an "alter table" commands. mysql-test/r/rpl_events.result: test that "alter event" replicates without crashing the slave mysql-test/t/rpl_events.test: test that "alter event" replicates without crashing the slave sql/sql_parse.cc: Added a check for lex->spd, which isn't set on an "alter event" command --- mysql-test/r/rpl_events.result | 6 ++++++ mysql-test/t/rpl_events.test | 23 +++++++++++++++++++++++ sql/sql_parse.cc | 2 +- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/rpl_events.result b/mysql-test/r/rpl_events.result index debfcce0072..0d7e7bb28a7 100644 --- a/mysql-test/r/rpl_events.result +++ b/mysql-test/r/rpl_events.result @@ -157,3 +157,9 @@ test slave_terminate SLAVESIDE_DISABLED 2 DROP EVENT test.slave_terminate; "in the master" DROP TABLE t1; +CREATE EVENT event1 ON SCHEDULE EVERY 1 YEAR +DO BEGIN +select * from t1; +END;| +ALTER EVENT event1 RENAME TO event2; +DROP EVENT event2; diff --git a/mysql-test/t/rpl_events.test b/mysql-test/t/rpl_events.test index 895e94c438b..62ffead7dcb 100644 --- a/mysql-test/t/rpl_events.test +++ b/mysql-test/t/rpl_events.test @@ -22,3 +22,26 @@ set binlog_format=statement; # Embedded server doesn't support binlogging --source include/rpl_events.inc +# +# Bug #28953 Using events in a replication let the slave crash. +# + +connection master; + +DELIMITER |; +CREATE EVENT event1 ON SCHEDULE EVERY 1 YEAR +DO BEGIN + select * from t1; +END;| +DELIMITER ;| + +ALTER EVENT event1 RENAME TO event2; + +sync_slave_with_master; + +connection master; + +DROP EVENT event2; + +sync_slave_with_master; + diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 31e3196ded1..1b06f5567d8 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1567,7 +1567,7 @@ bool sp_process_definer(THD *thd) if (lex->definer == NULL) DBUG_RETURN(TRUE); - if (thd->slave_thread) + if (thd->slave_thread && lex->sphead) lex->sphead->m_chistics->suid= SP_IS_NOT_SUID; } else From 608297467983e8504c5063f64399be16a5648cc4 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 Jun 2007 13:53:36 +0500 Subject: [PATCH 2/2] Backport of mysql-test/include/wait_for_slave_io_to_stop.inc mysql-test/include/wait_for_slave_sql_to_stop.inc mysql-test/include/wait_for_slave_to_start.inc mysql-test/include/wait_for_slave_to_stop.inc from 5.1 mysql-test/include/wait_for_slave_io_to_stop.inc: New BitKeeper file ``mysql-test/include/wait_for_slave_io_to_stop.inc'' mysql-test/include/wait_for_slave_sql_to_stop.inc: New BitKeeper file ``mysql-test/include/wait_for_slave_sql_to_stop.inc'' mysql-test/include/wait_for_slave_to_start.inc: New BitKeeper file ``mysql-test/include/wait_for_slave_to_start.inc'' mysql-test/include/wait_for_slave_to_stop.inc: New BitKeeper file ``mysql-test/include/wait_for_slave_to_stop.inc'' --- .../include/wait_for_slave_io_to_stop.inc | 33 +++++++++++++++++ .../include/wait_for_slave_sql_to_stop.inc | 30 +++++++++++++++ .../include/wait_for_slave_to_start.inc | 35 ++++++++++++++++++ mysql-test/include/wait_for_slave_to_stop.inc | 37 +++++++++++++++++++ 4 files changed, 135 insertions(+) create mode 100644 mysql-test/include/wait_for_slave_io_to_stop.inc create mode 100644 mysql-test/include/wait_for_slave_sql_to_stop.inc create mode 100644 mysql-test/include/wait_for_slave_to_start.inc create mode 100644 mysql-test/include/wait_for_slave_to_stop.inc diff --git a/mysql-test/include/wait_for_slave_io_to_stop.inc b/mysql-test/include/wait_for_slave_io_to_stop.inc new file mode 100644 index 00000000000..004f8bbbd8d --- /dev/null +++ b/mysql-test/include/wait_for_slave_io_to_stop.inc @@ -0,0 +1,33 @@ +################################################### +#Author: Jeb +#Date: 2007-06-11 +#Purpose: used for io errors on the slave. If Slave gets an io +# error, the io trhead should stop +#Details: +# 1) Fill in and setup variables +# 2) loop through looking for +# sql threads to stop +# 3) If loops too long die. +#################################################### +connection slave; +let $my_show= SHOW SLAVE STATUS; +let $sql_running= Slave_IO_Running; +let $row_number= 1; +let $run= 1; +let $counter= 300; + +while ($run) +{ + let $io_result= query_get_value("SHOW SLAVE STATUS", Slave_IO_Running, $row_number); + if (`SELECT '$io_result' = 'No'`){ + let $run= 0; + } + sleep 0.1; + if (!$counter){ + --echo "Failed while waiting for slave IO thread to stop" + SHOW SLAVE STATUS; + exit; + } + dec $counter; +} + diff --git a/mysql-test/include/wait_for_slave_sql_to_stop.inc b/mysql-test/include/wait_for_slave_sql_to_stop.inc new file mode 100644 index 00000000000..ee765c81f6a --- /dev/null +++ b/mysql-test/include/wait_for_slave_sql_to_stop.inc @@ -0,0 +1,30 @@ +################################################### +#Author: Jeb +#Date: 2007-06-11 +#Purpose: used for SQL errors on the slave. If Slave gets a sql +# error, the SQL trhead should stop +#Details: +# 1) Fill in and setup variables +# 2) loop through looking for +# sql threads to stop +# 3) If loops too long die. +#################################################### +connection slave; +let $row_number= 1; +let $run= 1; +let $counter= 300; + +while ($run) +{ + let $sql_result= query_get_value("SHOW SLAVE STATUS", Slave_SQL_Running, $row_number); + if (`SELECT '$sql_result' = 'No'`){ + let $run= 0; + } + sleep 0.1; + if (!$counter){ + --echo "Failed while waiting for slave SQL thread to stop" + SHOW SLAVE STATUS; + exit; + } + dec $counter; +} diff --git a/mysql-test/include/wait_for_slave_to_start.inc b/mysql-test/include/wait_for_slave_to_start.inc new file mode 100644 index 00000000000..84e1d646efe --- /dev/null +++ b/mysql-test/include/wait_for_slave_to_start.inc @@ -0,0 +1,35 @@ +################################################### +#Author: Jeb +#Date: 2007-06-11 +#Purpose: To wait a brief time for slave to start +#Details: +# 1) Fill in and setup variables +# 2) loop through looking for both +# io and sql threads to start +# 3) If loops too long die. +#################################################### +connection slave; +let $row_number= 1; +let $run= 1; +let $counter= 300; + +while ($run) +{ + let $io_result= query_get_value("SHOW SLAVE STATUS", Slave_IO_Running, $row_number); + if (`SELECT '$io_result' = 'Yes'`){ + + let $sql_result= query_get_value("SHOW SLAVE STATUS", Slave_SQL_Running, $row_number); + if (`SELECT '$sql_result' = 'Yes'`){ + let $run= 0; + } + } + sleep 0.1; + if (!$counter){ + --echo "Failed while waiting for slave to start" + SHOW SLAVE STATUS; + exit; + } + dec $counter; +} + + diff --git a/mysql-test/include/wait_for_slave_to_stop.inc b/mysql-test/include/wait_for_slave_to_stop.inc new file mode 100644 index 00000000000..13acbecb835 --- /dev/null +++ b/mysql-test/include/wait_for_slave_to_stop.inc @@ -0,0 +1,37 @@ +################################################### +#Author: Jeb +#Date: 2007-06-11 +#Purpose: To replace the mysqltest.c executable +# wait_for_slave_to_stop function and +# return this to the test language. +#Details: +# 1) Fill in and setup variables +# 2) loop through looking for both +# io and sql threads to stop +# 3) If loops too long die. +#################################################### +connection slave; +let $row_number= 1; +let $run= 1; +let $counter= 300; + +while ($run) +{ + let $io_result= query_get_value("SHOW SLAVE STATUS", Slave_IO_Running, $row_number); + if (`SELECT '$io_result' = 'No'`){ + + let $sql_result= query_get_value("SHOW SLAVE STATUS", Slave_SQL_Running, $row_number); + if (`SELECT '$sql_result' = 'No'`){ + let $run= 0; + } + } + sleep 0.1; + if (!$counter){ + --echo "Failed while waiting for slave to stop" + SHOW SLAVE STATUS; + exit; + } + dec $counter; +} + +