mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Backport of:
---------------------------------------------------------- revno: 2617.69.20 committer: Konstantin Osipov <kostja@sun.com> branch nick: 5.4-4284-1-assert timestamp: Thu 2009-08-13 18:29:55 +0400 message: WL#4284 "Transactional DDL locking" A review fix. Since WL#4284 implementation separated MDL_request and MDL_ticket, MDL_request becamse a utility object necessary only to get a ticket. Store it by-value in TABLE_LIST with the intent to merge MDL_request::key with table_list->table_name and table_list->db in future. Change the MDL subsystem to not require MDL_requests to stay around till close_thread_tables(). Remove the list of requests from the MDL context. Requests for shared metadata locks acquired in open_tables() are only used as a list in recover_from_failed_open_table_attempt(), which calls mdl_context.wait_for_locks() for this list. To keep such list for recover_from_failed_open_table_attempt(), introduce a context class (Open_table_context), that collects all requests. A lot of minor cleanups and simplications that became possible with this change.
This commit is contained in:
@ -228,11 +228,7 @@ bool servers_reload(THD *thd)
|
||||
DBUG_PRINT("info", ("locking servers_cache"));
|
||||
rw_wrlock(&THR_LOCK_servers);
|
||||
|
||||
bzero((char*) tables, sizeof(tables));
|
||||
tables[0].alias= tables[0].table_name= (char*) "servers";
|
||||
tables[0].db= (char*) "mysql";
|
||||
tables[0].lock_type= TL_READ;
|
||||
alloc_mdl_requests(tables, thd->mem_root);
|
||||
tables[0].init_one_table("mysql", 5, "servers", 7, "servers", TL_READ);
|
||||
|
||||
if (simple_open_n_lock_tables(thd, tables))
|
||||
{
|
||||
@ -363,10 +359,7 @@ insert_server(THD *thd, FOREIGN_SERVER *server)
|
||||
|
||||
DBUG_ENTER("insert_server");
|
||||
|
||||
bzero((char*) &tables, sizeof(tables));
|
||||
tables.db= (char*) "mysql";
|
||||
tables.alias= tables.table_name= (char*) "servers";
|
||||
alloc_mdl_requests(&tables, thd->mem_root);
|
||||
tables.init_one_table("mysql", 5, "servers", 7, "servers", TL_WRITE);
|
||||
|
||||
/* need to open before acquiring THR_LOCK_plugin or it will deadlock */
|
||||
if (! (table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
@ -582,10 +575,7 @@ int drop_server(THD *thd, LEX_SERVER_OPTIONS *server_options)
|
||||
DBUG_PRINT("info", ("server name server->server_name %s",
|
||||
server_options->server_name));
|
||||
|
||||
bzero((char*) &tables, sizeof(tables));
|
||||
tables.db= (char*) "mysql";
|
||||
tables.alias= tables.table_name= (char*) "servers";
|
||||
alloc_mdl_requests(&tables, thd->mem_root);
|
||||
tables.init_one_table("mysql", 5, "servers", 7, "servers", TL_WRITE);
|
||||
|
||||
rw_wrlock(&THR_LOCK_servers);
|
||||
|
||||
@ -707,10 +697,8 @@ int update_server(THD *thd, FOREIGN_SERVER *existing, FOREIGN_SERVER *altered)
|
||||
TABLE_LIST tables;
|
||||
DBUG_ENTER("update_server");
|
||||
|
||||
bzero((char*) &tables, sizeof(tables));
|
||||
tables.db= (char*)"mysql";
|
||||
tables.alias= tables.table_name= (char*)"servers";
|
||||
alloc_mdl_requests(&tables, thd->mem_root);
|
||||
tables.init_one_table("mysql", 5, "servers", 7, "servers",
|
||||
TL_WRITE);
|
||||
|
||||
if (!(table= open_ltable(thd, &tables, TL_WRITE, 0)))
|
||||
{
|
||||
|
Reference in New Issue
Block a user