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:
21
sql/lock.cc
21
sql/lock.cc
@ -952,26 +952,18 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count,
|
||||
|
||||
bool lock_table_names(THD *thd, TABLE_LIST *table_list)
|
||||
{
|
||||
MDL_request_list mdl_requests;
|
||||
TABLE_LIST *lock_table;
|
||||
MDL_request *mdl_request;
|
||||
|
||||
for (lock_table= table_list; lock_table; lock_table= lock_table->next_local)
|
||||
{
|
||||
mdl_request= MDL_request::create(0, lock_table->db, lock_table->table_name,
|
||||
thd->mem_root);
|
||||
if (!mdl_request)
|
||||
goto end;
|
||||
mdl_request->set_type(MDL_EXCLUSIVE);
|
||||
thd->mdl_context.add_request(mdl_request);
|
||||
lock_table->mdl_request= mdl_request;
|
||||
lock_table->mdl_request.init(0, lock_table->db, lock_table->table_name,
|
||||
MDL_EXCLUSIVE);
|
||||
mdl_requests.push_front(&lock_table->mdl_request);
|
||||
}
|
||||
if (thd->mdl_context.acquire_exclusive_locks())
|
||||
goto end;
|
||||
if (thd->mdl_context.acquire_exclusive_locks(&mdl_requests))
|
||||
return 1;
|
||||
return 0;
|
||||
|
||||
end:
|
||||
thd->mdl_context.remove_all_requests();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@ -987,7 +979,6 @@ void unlock_table_names(THD *thd)
|
||||
{
|
||||
DBUG_ENTER("unlock_table_names");
|
||||
thd->mdl_context.release_all_locks();
|
||||
thd->mdl_context.remove_all_requests();
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user