mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-3917 multiple use locks (GET_LOCK) in one connection.
The patch contributed by Konstantin Osipov applied. Native comments: Implement multiple user-level locks per connection. GET_LOCK() function in MySQL allows a connection to hold at most one user level lock. Taking a new lock automatically releases the old lock, if any. The limit of one lock per session existed since early versions of MySQL didn't have a deadlock detector for SQL locks. MDL patches in MySQL 5.5 added a deadlock detector, so starting from 5.5 it became possible to take multiple locks in any order -- a deadlock, should it occur, would be detected and an error returned to the client which closed the wait chain. This is exactly what is done in this patch: ULLs are moved to use MDL subsystem.
This commit is contained in:
@@ -827,6 +827,7 @@ THD::THD()
|
||||
col_access=0;
|
||||
is_slave_error= thread_specific_used= FALSE;
|
||||
my_hash_clear(&handler_tables_hash);
|
||||
my_hash_clear(&ull_hash);
|
||||
tmp_table=0;
|
||||
cuted_fields= 0L;
|
||||
sent_row_count= 0L;
|
||||
@@ -866,7 +867,6 @@ THD::THD()
|
||||
net.vio=0;
|
||||
net.buff= 0;
|
||||
client_capabilities= 0; // minimalistic client
|
||||
ull=0;
|
||||
system_thread= NON_SYSTEM_THREAD;
|
||||
cleanup_done= abort_on_warning= 0;
|
||||
peer_port= 0; // For SHOW PROCESSLIST
|
||||
@@ -1400,8 +1400,6 @@ void THD::cleanup(void)
|
||||
if (global_read_lock.is_acquired())
|
||||
global_read_lock.unlock_global_read_lock(this);
|
||||
|
||||
/* All metadata locks must have been released by now. */
|
||||
DBUG_ASSERT(!mdl_context.has_locks());
|
||||
if (user_connect)
|
||||
{
|
||||
decrease_user_connections(user_connect);
|
||||
@@ -1419,13 +1417,9 @@ void THD::cleanup(void)
|
||||
sp_cache_clear(&sp_proc_cache);
|
||||
sp_cache_clear(&sp_func_cache);
|
||||
|
||||
if (ull)
|
||||
{
|
||||
mysql_mutex_lock(&LOCK_user_locks);
|
||||
item_user_lock_release(ull);
|
||||
mysql_mutex_unlock(&LOCK_user_locks);
|
||||
ull= NULL;
|
||||
}
|
||||
mysql_ull_cleanup(this);
|
||||
/* All metadata locks must have been released by now. */
|
||||
DBUG_ASSERT(!mdl_context.has_locks());
|
||||
|
||||
apc_target.destroy();
|
||||
cleanup_done=1;
|
||||
@@ -4001,6 +3995,15 @@ extern "C" unsigned long thd_get_thread_id(const MYSQL_THD thd)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check if THD socket is still connected.
|
||||
*/
|
||||
extern "C" int thd_is_connected(MYSQL_THD thd)
|
||||
{
|
||||
return thd->is_connected();
|
||||
}
|
||||
|
||||
|
||||
#ifdef INNODB_COMPATIBILITY_HOOKS
|
||||
extern "C" const struct charset_info_st *thd_charset(MYSQL_THD thd)
|
||||
{
|
||||
@@ -4321,6 +4324,8 @@ void THD::leave_locked_tables_mode()
|
||||
/* Also ensure that we don't release metadata locks for open HANDLERs. */
|
||||
if (handler_tables_hash.records)
|
||||
mysql_ha_set_explicit_lock_duration(this);
|
||||
if (ull_hash.records)
|
||||
mysql_ull_set_explicit_lock_duration(this);
|
||||
}
|
||||
locked_tables_mode= LTM_NONE;
|
||||
}
|
||||
|
Reference in New Issue
Block a user