diff options
author | unknown <andrey@lmy004.> | 2006-02-16 00:43:11 +0100 |
---|---|---|
committer | unknown <andrey@lmy004.> | 2006-02-16 00:43:11 +0100 |
commit | fea4742db5b5f5531b0e2d30ccee7883f54b0e80 (patch) | |
tree | 7ade9988cce658b1efc550ee4228f4bef4a4d6d8 /mysql-test/t/events_stress.test | |
parent | 7088b39da895cf22a2b71d21a8313cbf0dda3760 (diff) | |
download | mariadb-git-fea4742db5b5f5531b0e2d30ccee7883f54b0e80.tar.gz |
fix for bug#16406 (Events: DROP DATABASE doesn't automatically drop events)
WL#1034
- This changeset also changes the executor so its quite more stable now.
Stressing test case added that executes ~800 events per second and dropping
hundreds of events at once using DROP DATABASE.
(with fixes after review of JimW)
(with fixes after review of Serg)
mysql-test/r/events.result:
update results after TRIGGER_ACL was added
mysql-test/t/events.test:
-redundant line
sql/event.cc:
Implemented evex_db_drop_events() which drops all events
from a specific database. Needed for SQLCOM_DROP_DATABASE
sql/event.h:
- protect the event better (see the changes to event_executor.cc
and event.cc). An event object could be used in a spawned thread
before it's executed but till now the object is marked as being
executed when the anonymous sp_head is executed. However, there are
timeframes before and after that during which the event is not marked
as executed and other thread may delete the object -> so we end with
a nirvana pointer.
sql/event_executor.cc:
- extract some of the code executed in the main thread to a function. Too long
functions are bad for the overview.
- prepend all information/error messages to the console with "SCHEDULER:" for
better overview, and easied searching in the log tables.
sql/event_priv.h:
- change the name, of evex_db_find_event_by_name() and don't
used C++ features like function overloading
- define consts for result returned from event_timed::spawn_now()
sql/event_timed.cc:
- add few methods related to event execution.
now the event spawns the worker thread and
passes itself as parameter. This way it locks itself for exectution
first and then spawning -> no race condition. When the worker thread
has finished working with the reference it calls back
event_timed::spawn_thread_finish() to unlock itself.
sql/sql_db.cc:
- call evex_drop_db_events() on DROP DATABASE
Diffstat (limited to 'mysql-test/t/events_stress.test')
-rw-r--r-- | mysql-test/t/events_stress.test | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/mysql-test/t/events_stress.test b/mysql-test/t/events_stress.test new file mode 100644 index 00000000000..f6eed79425c --- /dev/null +++ b/mysql-test/t/events_stress.test @@ -0,0 +1,80 @@ +CREATE DATABASE IF NOT EXISTS events_test; +# +# DROP DATABASE test start (bug #16406) +# +CREATE DATABASE events_test2; +USE events_test2; +CREATE EVENT ev_drop1 ON SCHEDULE EVERY 10 MINUTE DISABLE DO SELECT 1; +CREATE EVENT ev_drop2 ON SCHEDULE EVERY 10 MINUTE DISABLE DO SELECT 1; +CREATE EVENT ev_drop3 ON SCHEDULE EVERY 10 MINUTE DISABLE DO SELECT 1; +USE events_test; +SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; +DROP DATABASE events_test2; +SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; + +--echo "Now testing stability - dropping db -> events while they are running" +CREATE DATABASE events_test2; +USE events_test2; +--disable_query_log +let $1= 1000; +while ($1) +{ + eval CREATE EVENT ev_drop$1 ON SCHEDULE EVERY 1 SECOND DO SELECT $1; + dec $1; +} +--enable_query_log +SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; +SET GLOBAL event_scheduler=1; +--sleep 4 +DROP DATABASE events_test2; + +SET GLOBAL event_scheduler=0; +--sleep 2 +SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; +CREATE DATABASE events_test3; +USE events_test3; +--disable_query_log +let $1= 950; +while ($1) +{ + eval CREATE EVENT ev_drop$1 ON SCHEDULE EVERY 1 SECOND DO SELECT $1; + dec $1; +} +--enable_query_log +SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test3'; +--sleep 3 +CREATE DATABASE events_test4; +USE events_test4; +--disable_query_log +let $1= 860; +while ($1) +{ + eval CREATE EVENT ev_drop$1 ON SCHEDULE EVERY 1 SECOND DO SELECT $1; + dec $1; +} +--enable_query_log + + +CREATE DATABASE events_test2; +USE events_test2; +--disable_query_log +let $1= 1050; +while ($1) +{ + eval CREATE EVENT ev_drop$1 ON SCHEDULE EVERY 1 SECOND DO SELECT $1; + dec $1; +} +--enable_query_log +SELECT COUNT(*) FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA='events_test2'; +--sleep 6 +DROP DATABASE events_test2; +SET GLOBAL event_scheduler=0; +DROP DATABASE events_test3; +SET GLOBAL event_scheduler=1; +DROP DATABASE events_test4; +SET GLOBAL event_scheduler=1; +USE events_test; +# +# DROP DATABASE test end (bug #16406) +# +DROP DATABASE events_test; |