mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
A 5.5 version of the fix for Bug #54360 "Deadlock DROP/ALTER/CREATE
DATABASE with open HANDLER" Remove LOCK_create_db, database name locks, and use metadata locks instead. This exposes CREATE/DROP/ALTER DATABASE statements to the graph-based deadlock detector in MDL, and paves the way for a safe, deadlock-free implementation of RENAME DATABASE. Database DDL statements will now take exclusive metadata locks on the database name, while table/view/routine DDL statements take intention exclusive locks on the database name. This prevents race conditions between database DDL and table/view/routine DDL. (e.g. DROP DATABASE with concurrent CREATE/ALTER/DROP TABLE) By adding database name locks, this patch implements WL#4450 "DDL locking: CREATE/DROP DATABASE must use database locks" and WL#4985 "DDL locking: namespace/hierarchical locks". The patch also changes code to use init_one_table() where appropriate. The new lock_table_names() function requires TABLE_LIST::db_length to be set correctly, and this is taken care of by init_one_table(). This patch also adds a simple template to help work with the mysys HASH data structure. Most of the patch was written by Konstantin Osipov.
This commit is contained in:
@ -205,6 +205,9 @@ int setup_ftfuncs(SELECT_LEX* select);
|
||||
int init_ftfuncs(THD *thd, SELECT_LEX* select, bool no_order);
|
||||
void wait_for_condition(THD *thd, mysql_mutex_t *mutex,
|
||||
mysql_cond_t *cond);
|
||||
bool lock_table_names(THD *thd, TABLE_LIST *table_list,
|
||||
TABLE_LIST *table_list_end, ulong lock_wait_timeout,
|
||||
uint flags);
|
||||
bool open_tables(THD *thd, TABLE_LIST **tables, uint *counter, uint flags,
|
||||
Prelocking_strategy *prelocking_strategy);
|
||||
/* open_and_lock_tables with optional derived handling */
|
||||
@ -480,8 +483,6 @@ public:
|
||||
return m_start_of_statement_svp;
|
||||
}
|
||||
|
||||
MDL_request *get_global_mdl_request(THD *thd);
|
||||
|
||||
inline ulong get_timeout() const
|
||||
{
|
||||
return m_timeout;
|
||||
@ -498,11 +499,6 @@ private:
|
||||
*/
|
||||
TABLE_LIST *m_failed_table;
|
||||
MDL_ticket *m_start_of_statement_svp;
|
||||
/**
|
||||
Request object for global intention exclusive lock which is acquired during
|
||||
opening tables for statements which take upgradable shared metadata locks.
|
||||
*/
|
||||
MDL_request *m_global_mdl_request;
|
||||
/**
|
||||
Lock timeout in seconds. Initialized to LONG_TIMEOUT when opening system
|
||||
tables or to the "lock_wait_timeout" system variable for regular tables.
|
||||
|
Reference in New Issue
Block a user