fix for bug#17793 (Scheduler uses class event_timed should be Event_timed)
sql/event.cc:
class event_timed -> Event_timed
sql/event.h:
class event_timed -> Event_timed
sql/event_executor.cc:
class event_timed -> Event_timed
sql/event_priv.h:
class event_timed -> Event_timed
sql/event_timed.cc:
class event_timed -> Event_timed
sql/sql_lex.h:
class event_timed -> Event_timed
sql/sql_show.cc:
class event_timed -> Event_timed
sql/sql_yacc.yy:
class event_timed -> Event_timed
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
WL#1034 (Internal CRON)
(with post-review fix)
mysql-test/r/events.result:
update the result
mysql-test/t/events.test:
use --sleep instead of select sleep()
enable some scheduler related tests. They were disabled because of a hang that
happened. The hang is fixed with this bugfix.
sql/event.cc:
- evex_remove_from_cache reports back whether the in_memory
object was deleted or was scheduled. In case scheduling then
don't delete it from outside but let it do it itself
- move out db interaction code out of evex_drop_event to db_drop_event
so it can be called from outter space :)
sql/event_priv.h:
- export the new function db_drop_event()
sql/event_timed.cc:
- use db_drop_event() and don't implement the dropping ourselves
sql/sql_parse.cc:
- some debug info about the status code returned.
mysql-test/lib/init_db.sql:
Auto merged
scripts/mysql_create_system_tables.sh:
Auto merged
scripts/mysql_fix_privilege_tables.sql:
Auto merged
sql/event.cc:
Auto merged
sql/event.h:
Auto merged
sql/event_executor.cc:
Auto merged
sql/event_priv.h:
Auto merged
sql/event_timed.cc:
Auto merged
sql/mysqld.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/sql_yacc.yy:
Auto merged
mysql-test/r/events.result:
manual merge
mysql-test/r/system_mysql_db.result:
manual merge
mysql-test/t/events.test:
manual merge
post-review change - use pointer instead of copy on the stack.
WL#1034 (Internal CRON)
This patch adds INFORMATION_SCHEMA.EVENTS table with the following format:
EVENT_CATALOG - MYSQL_TYPE_STRING (Always NULL)
EVENT_SCHEMA - MYSQL_TYPE_STRING (the database)
EVENT_NAME - MYSQL_TYPE_STRING (the name)
DEFINER - MYSQL_TYPE_STRING (user@host)
EVENT_BODY - MYSQL_TYPE_STRING (the body from mysql.event)
EVENT_TYPE - MYSQL_TYPE_STRING ("ONE TIME" | "RECURRING")
EXECUTE_AT - MYSQL_TYPE_TIMESTAMP (set for "ONE TIME" otherwise NULL)
INTERVAL_VALUE - MYSQL_TYPE_LONG (set for RECURRING otherwise NULL)
INTERVAL_FIELD - MYSQL_TYPE_STRING (set for RECURRING otherwise NULL)
SQL_MODE - MYSQL_TYPE_STRING (for now NULL)
STARTS - MYSQL_TYPE_TIMESTAMP (starts from mysql.event)
ENDS - MYSQL_TYPE_TIMESTAMP (ends from mysql.event)
STATUS - MYSQL_TYPE_STRING (ENABLED | DISABLED)
ON_COMPLETION - MYSQL_TYPE_STRING (NOT PRESERVE | PRESERVE)
CREATED - MYSQL_TYPE_TIMESTAMP
LAST_ALTERED - MYSQL_TYPE_TIMESTAMP
LAST_EXECUTED - MYSQL_TYPE_TIMESTAMP
EVENT_COMMENT - MYSQL_TYPE_STRING
SQL_MODE is NULL for now, because the value is still not stored in mysql.event .
Support will be added as a fix for another bug.
This patch also adds SHOW [FULL] EVENTS [FROM db] [LIKE pattern]
1. SHOW EVENTS shows always only the events on the same user,
because the PK of mysql.event is (definer, db, name) several
users may have event with the same name -> no information disclosure.
2. SHOW FULL EVENTS - shows the events (in the current db as SHOW EVENTS)
of all users. The user has to have PROCESS privilege, if not then
SHOW FULL EVENTS behave like SHOW EVENTS.
3. If [FROM db] is specified then this db is considered.
4. Event names can be filtered with LIKE pattern.
SHOW EVENTS returns table with the following columns, which are subset of
the data which is returned by SELECT * FROM I_S.EVENTS
Db
Name
Definer
Type
Execute at
Interval value
Interval field
Starts
Ends
Status
mysql-test/lib/init_db.sql:
change the PK - (definer, db, name)
quicker searches when SHOW EVENTS;
allow also different users to have events with the same name ->
no information disclosure
mysql-test/r/events.result:
result of new tests
mysql-test/r/information_schema.result:
result of new tests
mysql-test/r/information_schema_db.result:
result of new tests
mysql-test/r/system_mysql_db.result:
result of new tests
mysql-test/t/events.test:
new tests for information_schema.events
scripts/mysql_create_system_tables.sh:
change the PK of mysql.event to (definer, db, name)
scripts/mysql_fix_privilege_tables.sql:
change the PK of mysql.event to (definer, db, name)
sql/event.cc:
pass around the definer of the event because of the new PK
which is (definer, db, name). It's needed for index searching.
sql/event.h:
- make enum evex_table_field again public so it can be used
in sql_show.cc
- make created and modified ulonglong, because they should be such
- make public evex_open_event_table so it can be used in sql_show.cc
sql/event_executor.cc:
- cosmetics
sql/event_priv.h:
- moved enum evex_table_field and evex_open_event_table()
to event.h (made them therefore public)
sql/event_timed.cc:
- in event_timed::init_definer() always fill this.definer with
the concatenated value of definer_user@definer_host. Makes
later the work easier.
- pass around the definer wherever is needed for searching
(new prototype of evex_db_find_evex_aux)
sql/mysqld.cc:
- add counter for SHOW EVENTS
sql/sql_lex.h:
- register SHOW EVENTS as command
sql/sql_parse.cc:
- handle SCH_EVENTS (I_S.EVENTS like SCH_TRIGGERS)
- make additional check in case of SHOW EVENTS (check for EVENT on
the current database. if it is null check_access() gives appropriate
message back.
sql/sql_show.cc:
- add INFORMATION_SCHEMA.EVENTS and SHOW EVENTS
- I_S.EVENTS.SQL_MODE is NULL for now -> not implemented. Trudy
asked to be added so bug #16642 can be completely closed. There
is another bug report which will fix the lack of storage of
SQL_MODE during event creation.
sql/sql_yacc.yy:
- always call event_timed::init_definer() when CREATE/ALTER/DROP
EVENT but not when just compiling the body of the event because
in this case this operation is not needed, it takes memory and
CPU time and at the end the result is not used. event_timed::definer
is used only on SQLCOM_CREATE/ALTER/DROP_EVENT execution not on
statement compilation.
- add SHOW [FULL] EVENTS [FROM db] [LIKE pattern]
in case of FULL and the user has PROCESS privilege then he will see
also others' events in the current database, otherwise the output
is the same as of SHOW EVENTS. Because the events are per DB only
the events from the current database are shown. pattern is applied
against event name. FROM db is self explanatory.
sql/table.h:
add SCH_EVENTS as part of INFORMATION_SCHEMA
Before the interval expression was considered to be in seconds, now it is
just a number and the type of interval is considered.
- this changeset introduces also fix for bug#16432 (Events: error re interval
misrepresents the facts)
the code of event_timed::set_interval() was refactored anyway so it is meaningful to
fix the bug in the same changeset.
include/my_time.h:
- move enum interval_type to include/my_time.h so it can be used by functions
in the whole server
sql/event.cc:
- don't use second_part
- fix small problem with create event xyz, when xyz exists -> make it error
instead of warning if create_if_not is false.
sql/event.h:
pass thd to mark_last_executed() to be able to call thd->end_time()
sql/event_executor.cc:
- pass thd to event_timed::compute_next_execution_time()
- a bit more DBUG info in the server log
- handle error returned by event_timed::compute_next_execution_time()
sql/event_priv.h:
- define the maximal possible value for interval_value
sql/event_timed.cc:
- more docs
- add static get_next_time() which sums a TIME with an interval
- fix bug #16435 (Weekly events execute every second)
Before the interval expression was considered to be in seconds, now it is
just a number and the type of interval is considered.
- fix for bug#16432 (Events: error re interval misrepresents the facts)
(return an error if a value is too big or is negative - errmsg changed)
sql/item_timefunc.cc:
- export get_interval_date()
- refactor Item_date_add_interval::get_date() and extract the core
to date_add_interval() in time.cc so it can be reused by the
scheduler code in event_timed.cc
sql/item_timefunc.h:
- export get_interval_value() so it can be reused in event_timed.cc in
function static get_next_time()
- move enum interval_type to include/my_time.h so it can be used by functions
in the whole server
sql/mysql_priv.h:
export the new function date_add_interval() added to time.cc
sql/share/errmsg.txt:
- change error message to be appropriate as fix for bug#16432
(Events: error re interval misrepresents the facts)
sql/sql_yacc.yy:
- change error message to be appropriate as fix for bug#16432
(Events: error re interval misrepresents the facts)
sql/time.cc:
extract the core of Item_date_add_interval::get_date()
to a function per Serg's request. The code can be reused
to add und substract interval from a date.
- fix problem with too long identifier name
sql/event.cc:
report an error when identifier too long
sql/event_priv.h:
name the enum
fix truncation problem
sql/share/errmsg.txt:
new error message
sql/sql_yacc.yy:
remove debug info and whitespace
- improve the stability of the executor
- make create event if not exists work as before
sql/event.cc:
refactoring:
- have only 1 routine for comparing TIME structures
fix:
- after previous refactoring IF NOT EXISTS of CREATE EVENT did not work
anymore. Now it will work.
sql/event.h:
update definitions
sql/event_executor.cc:
- don't load DISABLED events
- if an event is being disabled because of time restrictions - drop it from the
prio queue
- move dropping to the worker process
sql/event_priv.h:
- remove unneeded func
sql/share/errmsg.txt:
fix error message
sql/sql_parse.cc:
- support 0 rows affected when CREATE EVENT IF NOT EXISTS
- handle crashes where the table definition has been changed
(different number of fields)
sql/event.cc:
change the way table is opened
check whether the number of fields is exact, otherwise report damaged table
sql/event_executor.cc:
- move around some code
- use the new way of table opening
sql/event_priv.h:
- new declaration
sql/event_timed.cc:
- now 0 is ok
- fixed silly bug, the main thread restarted but did not execute events,
Quite currious why many calls to pthread_mutex_init() do not lead to abort()
sql/event.cc:
- remove mysql_event_table_exists
- fix possible crash when table is 0x0
sql/event_executor.cc:
- make event_executor_running_global_var volatile
- fix erroneous reinitilization of a mutex, why did it not crash in debug mode?
why pthread_mutex_init() does not abort() in case the mutex was not deinitted
beforehand?
- first initialization of event_executor_running_global_var inside init_mutexes()
- remove debug if()
sql/event_priv.h:
- remove unneeded definitions
sql/event_timed.cc:
make backup and then restore the open table state of thd
(cleanups, leaks fixed)
sql/event.cc:
- update comments
- remove dead code
- event_timed is no more copied after allocation on a DYNAMIC_ARRAY
because there is a problem when the array is reallocated - we get
dangling pointers from the scheduling queue. anyway it makes little
sense to keep them there except that cleaning is quite efficient but
iterating over all events and cleaning them one by one is not that bad
considering that happens only when the main scheduler thread is killed
or during server shutdown.
sql/event_executor.cc:
- DYNAMIC_ARRAY is no more
sql/event_priv.h:
- remove unneeded code/defines. the scheduler's queue is of
type QUEUE and cannot run anymore on top of DYNAMIC_ARRAY
sql/event_timed.cc:
- after parsing (in ::compile() ) destruct the event_timed object
sql/sql_parse.cc:
in case of syntax error clean up lex->et because there could be an object
created. as in the code the same is done for SPs.
cleanup before throwin away DYNAMIC_ARRAY for event storage,
once reallocated I get dangling pointers so that's not good.
solution will be found however ;)
sql/event.cc:
- remove unneeded variables
- remove commented out code
- remove non-cs compliant comment
- fix a bug when removing from memory cache
- better close the tables than relying on sql_parse.cc::do_command()
to do that
sql/event_executor.cc:
- cleanup
sql/event_priv.h:
-cleanup
sql/event_timed.cc:
cleanup
QUEUE implementation working now. this should be ready more or less
for testing once the debug output is being cleaned and some things
around DYNAMIC_ARRAY are cleaned
- fix handling in case of errors that lead to crashes, now no more crashes
in case of table corruption and such.
include/queues.h:
introduce a safe version of queue_insert that will extend the queue if
necessary. the auto_extent is passed to the _ex version of init_queue()
mysys/queues.c:
add init_queue_ex() implementation
add queue_insert_safe() implementation
sql/event.cc:
- move mysql_priv.h inclusion to event_priv.h
- use a priority queue instead of DYNAMIC_ARRAY which is sorted
sql/event.h:
reorder
sql/event_executor.cc:
reorder
sql/event_priv.h:
- reorder a bit
- add macroses and functions for queue manipulation which stay on top
of QUEUE (partly implemented for DYNAMIC_ARRAY but will be cleared to be
only for QUEUE).
sql/event_timed.cc:
allocate one more byte and zeroterminate, really
- fix a bug introduced with last commit ALTER EVENT a RENAME TO b; failed
- misc
sql/event.cc:
- rename evex_db_find_routine_aux() to evex_db_find_event_aux() (better name)
- change parameter order of db_update_event()
- last bits to handle errors as close as possible to the place they occur
- fix a bug introduced with last commit: first check for overwriting and event and then
check whether the original one exists
sql/event.h:
add a new error code returned by event_timed::compile() in case of
error
sql/event_priv.h:
rename
sql/event_timed.cc:
- function rename
- add a bit of doc
sql/share/errmsg.txt:
- extend an error message so it's more informative
- add a new error message
sql/sql_parse.cc:
refactor the cases for CREATE/ALTER/DROP event so use as much common
code as possible. last bits of error checking unneeded in sql_parse.cc
thrwon out.
(strip m_ as prefix from member variables' names)
sql/event.cc:
- change copyright years
- remove m_ prefix from member variables (I liked m_)
- reorder parameter in evex_update_event()
sql/event.h:
- change copyright years
- remove m_ prefix from member variables
- declare some member variables as private (were public)
- delete 0 is valid in C++ therefore don't embrace with if()
sql/event_executor.cc:
- executor => scheduler in messages
- fix a bug introduced in last commit -> typo in a mutex name
- remove m_ prefix from member variables
sql/event_priv.h:
- change copyright years
sql/event_timed.cc:
- change copyright years
- strip m_ as prefix from member variables' names
sql/sql_parse.cc:
- strip m_ as prefix from member variables' names
sql/sql_yacc.yy:
- strip m_ as prefix from member variables names
sql/event.cc:
- fix TODO (remove things already done)
- check the length of the event's name and body during creation
and report an error if longer than what can be fit into
mysql.event (nothing like non-strict mode here)
- report to sql_parse.cc and error when open table failed, otherwise send_ok()
was being called and the error have become an warning.
- update function documentation a bit
- evex_db_find_routine_aux returns 0 and not EVEX_OK
sql/event_executor.cc:
- CS changes to definitions of the main and worker thread routines
- reorder code a bit to prevent crashes because of reading of
already freed data -> first wait all events to finish their work,
namely all worker threads to finish, and then destroy in-memory
structures
- more error checking and error reporting at the place of failure.
sql/event_priv.h:
code simplifying macro
sql/event_timed.cc:
CS cosmetics
make more independent of SP
sql/event.cc:
use own routine - export it
sql/event_priv.h:
export these two
sql/event_timed.cc:
use own routine, don't rely on SP
sql/sp.cc:
revert changes to SP
sql/sp.h:
revert changes to SP
sql/sql_show.cc:
rever changes to SP
updated sources
sql/event.cc:
update
put some error calls to the places they occur
sql/event.h:
- change the default (does not work in STRICT mode)
sql/event_executor.cc:
move mutex initialization to evex_init_mutexes so init_events() can be reused when the
main thread does not work and set global event_scheduler=1; (this will start the thread)
The main thread is now visible with show processlist and can be killed.
sql/event_priv.h:
don't use anymore SP for opening table
sql/event_timed.cc:
don't use anymore SP routines for opening mysql.event
sql/mysqld.cc:
shutdown_events() should be maximal at the end of the server because
it destroys mutexes of EVEX. The call should not be in the main thread.
sql/set_var.cc:
make sys_var_event_executor subclass sys_var_bool_ptr
to overload ::update() method - needed to start a
killed (non-running) evex main thread
sql/set_var.h:
declare class sys_var_event_executor
sql/share/errmsg.txt:
2 new messages
- split into several files
- forbid parallel execution (before analyse is done how to make it possible)
because the same sp_head instance cannot be executed in parallel
- added GPL headers
- changed EVENT_ACL to be per DB variable
- fixed minor problems
mysql-test/lib/init_db.sql:
WL#1034 updated
- add Event_priv to mysql.user (update test)
- add updated mysql.event table struct
scripts/mysql_fix_privilege_tables.sql:
WL#1034 updated
add updated mysql.event structure
sql/Makefile.am:
split event.cc into
- event.cc (create/alter/drop)
- event_executor.cc (main and worker threads)
- event_timed.cc (class event_timed)
- event_priv.h (some definitions used internally by the module)
sql/event.cc:
- added GPL header
- split into few files
- fixed some issues after code review
- now using SP routines for opening/traversing/closing tables
(will be reverted)
sql/event.h:
- add GPL header
- remove two methods - inline them in sql_yacc.yy
- don't use absolute values for EVEX_ defines but the SP_ equivalents (have to move 100% to SP_
defines and as later step to not transfer messages upwards in the stack but
report them at the place they occur)
- updated reference table definition
- move default mem_root param from event.cc to the header
sql/mysqld.cc:
WL#1034
rename --event-executor to --event-scheduler
executor sounds a bit scary :)
sql/set_var.cc:
rename internal variable name from event_executor to event_scheduler
(ppl won't be scarried anymore :)
sql/share/errmsg.txt:
omit one %s - not needed
sql/sp_head.cc:
disable this DBUG_PRINT for a bit. m_next_cached_sp is 0x0 and I get crash here...
sql/sp_head.h:
remove m_old_cmq, a temporal variable is used in sql_yacc.yy (Serg's idea)
to keep the previous state.
$<ulong_val>$ = ....
YYTHD->client_capabilites != $<ulong_val>4;
(the same is done also for class event_timed)
sql/sql_acl.cc:
handle pre-5.1.4 table and give the user EVENT_ACL if he had CREATE_ACL
sql/sql_acl.h:
fix the bitmask
sql/sql_parse.cc:
- move from EVENT_ACL being global to EVENT_ACL being per DB like
CREATE_PROC_ACL
- lex->m_qname dropped, because not needed, fix code therefore
- add comment that SHOW CREATE EVENT has to be implemented
sql/sql_yacc.yy:
- use temporal variable of Bison to store a short lived value
- fix indentation
- inline 2 class event_timed methods in the parser
sql/tztime.h:
be more expressive - it's already extern