From: Dmitry Shulga Date: May 27 2011 9:23am Subject: bzr commit into mysql-5.1 branch (Dmitry.Shulga:3632) Bug#12546938 List-Archive: http://lists.mysql.com/commits/138297 X-Bug: 12546938 Message-Id: <201105270923.p4R9Nxan005285@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5942370382356850044==" --===============5942370382356850044== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/shulga/projects/mysql/mysql-5.1-bug12546938/ based on revid:dmitry.lenev@stripped 3632 Dmitry Shulga 2011-05-27 Fixed bug#12546938 (formerly known as 61005) - CREATE IF NOT EXIST EVENT will create multiple running events. A CREATE IF NOT EXIST on an event that existed and was enabled caused multiple instances of the event to run. Disabling the event didn't help. If the event was dropped, the event stopped running, but when created again, multiple instances of the event were still running. The only way to get out of this situation was to restart the server. The problem was that Event_db_repository::create_event() didn't return enough information to discriminate between situation when event didn't exist and was created and when event did exist and was not created (but a warning was emitted). As result in the latter case event was added to in-memory queue of events second time. And this led to unwarranted multiple executions of the same event. The solution is to add out-parameter to Event_db_repository::create_event() method which will signal that event was not created because it already exists and so it should not be added to the in-memory queue. @ mysql-test/r/events_bugs.result Added results for test for Bug#12546938. @ mysql-test/t/events_bugs.test Added test for Bug#12546938. @ sql/event_db_repository.cc Event_db_repository::create_event was modified: set newly added out-parameter event_already_exists to true value if event wasn't created because event already existed and IF NOT EXIST clause was present. @ sql/event_db_repository.h Added out-parameter 'event_already_exists' to create_event() method. @ sql/events.cc Events::create_event was modified: insert new element into event queue only if event was actually created. modified: mysql-test/r/events_bugs.result mysql-test/t/events_bugs.test sql/event_db_repository.cc sql/event_db_repository.h sql/events.cc === modified file 'mysql-test/r/events_bugs.result' --- a/mysql-test/r/events_bugs.result 2011-03-28 15:31:37 +0000 +++ b/mysql-test/r/events_bugs.result 2011-05-27 09:23:08 +0000 @@ -535,6 +535,7 @@ DROP EVENT e3; DROP EVENT e2; DROP EVENT e1; SET TIME_ZONE=@save_time_zone; +SET TIMESTAMP=DEFAULT; drop event if exists new_event; CREATE EVENT new_event ON SCHEDULE EVERY 0 SECOND DO SELECT 1; ERROR HY000: INTERVAL is either not positive or too big @@ -756,6 +757,45 @@ SHOW EVENTS; Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation DROP DATABASE event_test1; DROP DATABASE event_test12; +# +# Bug#12546938 (formerly known as bug#61005): +# CREATE IF NOT EXIST EVENT WILL CREATE MULTIPLE RUNNING EVENTS +# +USE events_test; +SET GLOBAL event_scheduler = ON; +DROP TABLE IF EXISTS table_bug12546938; +DROP EVENT IF EXISTS event_Bug12546938; +CREATE TABLE table_bug12546938 (i INT); +# Create an event which will be executed with a small delay +# and won't be automatically dropped after that. +CREATE EVENT event_Bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN +INSERT INTO table_bug12546938 VALUES(1); +END +| +# Now try to create the same event using CREATE EVENT IF NOT EXISTS. +# A warning should be emitted. A new event should not be created nor +# the old event should be re-executed. +CREATE EVENT IF NOT EXISTS event_bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN +INSERT INTO table_bug12546938 VALUES (1); +END +| +Warnings: +Note 1537 Event 'event_bug12546938' already exists +# Wait until at least one instance of event is executed. +# Check that only one instance of our event was executed. +SELECT COUNT(*) FROM table_bug12546938; +COUNT(*) +1 +# Clean-up. +DROP EVENT IF EXISTS event_Bug12546938; +DROP TABLE table_bug12546938; +SET GLOBAL EVENT_SCHEDULER = OFF; DROP DATABASE events_test; SET GLOBAL event_scheduler= 'ON'; SET @@global.concurrent_insert= @concurrent_insert; === modified file 'mysql-test/t/events_bugs.test' --- a/mysql-test/t/events_bugs.test 2011-03-28 15:31:37 +0000 +++ b/mysql-test/t/events_bugs.test 2011-05-27 09:23:08 +0000 @@ -857,6 +857,7 @@ DROP EVENT e2; DROP EVENT e1; SET TIME_ZONE=@save_time_zone; +SET TIMESTAMP=DEFAULT; # # START - BUG#28666 CREATE EVENT ... EVERY 0 SECOND let server crash @@ -1235,6 +1236,55 @@ SHOW EVENTS; DROP DATABASE event_test1; DROP DATABASE event_test12; +--echo # +--echo # Bug#12546938 (formerly known as bug#61005): +--echo # CREATE IF NOT EXIST EVENT WILL CREATE MULTIPLE RUNNING EVENTS +--echo # +USE events_test; +SET GLOBAL event_scheduler = ON; + +--disable_warnings +DROP TABLE IF EXISTS table_bug12546938; +DROP EVENT IF EXISTS event_Bug12546938; +--enable_warnings +CREATE TABLE table_bug12546938 (i INT); + +delimiter |; + +--echo # Create an event which will be executed with a small delay +--echo # and won't be automatically dropped after that. +CREATE EVENT event_Bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN + INSERT INTO table_bug12546938 VALUES(1); +END +| + +--echo # Now try to create the same event using CREATE EVENT IF NOT EXISTS. +--echo # A warning should be emitted. A new event should not be created nor +--echo # the old event should be re-executed. +CREATE EVENT IF NOT EXISTS event_bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN + INSERT INTO table_bug12546938 VALUES (1); +END +| + +delimiter ;| + +--echo # Wait until at least one instance of event is executed. +let $wait_condition= SELECT COUNT(*) FROM table_bug12546938; +--source include/wait_condition.inc + +--echo # Check that only one instance of our event was executed. +SELECT COUNT(*) FROM table_bug12546938; + +--echo # Clean-up. +DROP EVENT IF EXISTS event_Bug12546938; +DROP TABLE table_bug12546938; +SET GLOBAL EVENT_SCHEDULER = OFF; ########################################################################### # === modified file 'sql/event_db_repository.cc' --- a/sql/event_db_repository.cc 2011-05-04 12:59:24 +0000 +++ b/sql/event_db_repository.cc 2011-05-27 09:23:08 +0000 @@ -604,18 +604,21 @@ Event_db_repository::open_event_table(TH only creates a record on disk. @pre The thread handle has no open tables. - @param[in,out] thd THD - @param[in] parse_data Parsed event definition - @param[in] create_if_not TRUE if IF NOT EXISTS clause was provided - to CREATE EVENT statement - + @param[in,out] thd THD + @param[in] parse_data Parsed event definition + @param[in] create_if_not TRUE if IF NOT EXISTS clause was provided + to CREATE EVENT statement + @param[out] event_already_exists When method is completed successfully + set to true if event already exists else + set to false @retval FALSE success @retval TRUE error */ bool Event_db_repository::create_event(THD *thd, Event_parse_data *parse_data, - my_bool create_if_not) + bool create_if_not, + bool *event_already_exists) { int ret= 1; TABLE *table= NULL; @@ -641,6 +644,7 @@ Event_db_repository::create_event(THD *t { if (create_if_not) { + *event_already_exists= true; push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, ER_EVENT_ALREADY_EXISTS, ER(ER_EVENT_ALREADY_EXISTS), parse_data->name.str); @@ -648,8 +652,10 @@ Event_db_repository::create_event(THD *t } else my_error(ER_EVENT_ALREADY_EXISTS, MYF(0), parse_data->name.str); + goto end; - } + } else + *event_already_exists= false; DBUG_PRINT("info", ("non-existent, go forward")); === modified file 'sql/event_db_repository.h' --- a/sql/event_db_repository.h 2007-08-15 15:08:44 +0000 +++ b/sql/event_db_repository.h 2011-05-27 09:23:08 +0000 @@ -73,7 +73,8 @@ public: Event_db_repository(){} bool - create_event(THD *thd, Event_parse_data *parse_data, my_bool create_if_not); + create_event(THD *thd, Event_parse_data *parse_data, bool create_if_not, + bool *event_already_exists); bool update_event(THD *thd, Event_parse_data *parse_data, LEX_STRING *new_dbname, === modified file 'sql/events.cc' --- a/sql/events.cc 2011-05-16 20:04:01 +0000 +++ b/sql/events.cc 2011-05-27 09:23:08 +0000 @@ -370,6 +370,7 @@ create_query_string(THD *thd, String *bu return 0; } + /** Create a new event. @@ -390,8 +391,8 @@ bool Events::create_event(THD *thd, Event_parse_data *parse_data, bool if_not_exists) { - int ret; - bool save_binlog_row_based; + bool ret; + bool save_binlog_row_based, event_already_exists; DBUG_ENTER("Events::create_event"); /* @@ -440,28 +441,32 @@ Events::create_event(THD *thd, Event_par pthread_mutex_lock(&LOCK_event_metadata); /* On error conditions my_error() is called so no need to handle here */ - if (!(ret= db_repository->create_event(thd, parse_data, if_not_exists))) + if (!(ret= db_repository->create_event(thd, parse_data, if_not_exists, + &event_already_exists))) { Event_queue_element *new_element; bool dropped= 0; - if (!(new_element= new Event_queue_element())) - ret= TRUE; // OOM - else if ((ret= db_repository->load_named_event(thd, parse_data->dbname, - parse_data->name, - new_element))) - { - if (!db_repository->drop_event(thd, parse_data->dbname, parse_data->name, - TRUE)) - dropped= 1; - delete new_element; - } - else + if (!event_already_exists) { - /* TODO: do not ignore the out parameter and a possible OOM error! */ - bool created; - if (event_queue) - event_queue->create_event(thd, new_element, &created); + if (!(new_element= new Event_queue_element())) + ret= TRUE; // OOM + else if ((ret= db_repository->load_named_event(thd, parse_data->dbname, + parse_data->name, + new_element))) + { + if (!db_repository->drop_event(thd, parse_data->dbname, parse_data->name, + TRUE)) + dropped= 1; + delete new_element; + } + else + { + /* TODO: do not ignore the out parameter and a possible OOM error! */ + bool created; + if (event_queue) + event_queue->create_event(thd, new_element, &created); + } } /* binlog the create event unless it's been successfully dropped @@ -475,13 +480,14 @@ Events::create_event(THD *thd, Event_par { sql_print_error("Event Error: An error occurred while creating query string, " "before writing it into binary log."); - /* Restore the state of binlog format */ - thd->current_stmt_binlog_row_based= save_binlog_row_based; - DBUG_RETURN(TRUE); + ret= true; } - /* If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER - will be written into the binary log as the definer for the SQL thread. */ - ret= write_bin_log(thd, TRUE, log_query.c_ptr(), log_query.length()); + else + /* + If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER + will be written into the binary log as the definer for the SQL thread. + */ + ret= write_bin_log(thd, TRUE, log_query.c_ptr(), log_query.length()); } } pthread_mutex_unlock(&LOCK_event_metadata); --===============5942370382356850044== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/dmitry.shulga@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.shulga@stripped\ # uigde024php475gj # target_branch: file:///Users/shulga/projects/mysql/mysql-5.1-\ # bug12546938/ # testament_sha1: 01b02c43343dbdee32090f8dc86795c2a69851df # timestamp: 2011-05-27 16:23:51 +0700 # base_revision_id: dmitry.lenev@stripped\ # 32ch5c5hm224hhlh # # Begin bundle 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 --===============5942370382356850044==--