mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
Bug#7823 - FLUSH TABLES WITH READ LOCK + INSERT DELAYED = deadlock
After merge fix.
This commit is contained in:
parent
15f9556ca2
commit
731c8da030
3 changed files with 54 additions and 4 deletions
51
sql/lock.cc
51
sql/lock.cc
|
@ -82,7 +82,8 @@ static int unlock_external(THD *thd, TABLE **table,uint count);
|
|||
static void print_lock_error(int error, const char *);
|
||||
|
||||
|
||||
MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **tables,uint count)
|
||||
MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count,
|
||||
bool ignore_global_read_lock)
|
||||
{
|
||||
MYSQL_LOCK *sql_lock;
|
||||
TABLE *write_lock_used;
|
||||
|
@ -93,7 +94,7 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **tables,uint count)
|
|||
if (!(sql_lock = get_lock_data(thd,tables,count, 0,&write_lock_used)))
|
||||
break;
|
||||
|
||||
if (global_read_lock && write_lock_used)
|
||||
if (global_read_lock && write_lock_used && ! ignore_global_read_lock)
|
||||
{
|
||||
/*
|
||||
Someone has issued LOCK ALL TABLES FOR READ and we want a write lock
|
||||
|
@ -949,3 +950,49 @@ bool make_global_read_lock_block_commit(THD *thd)
|
|||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Set protection against global read lock.
|
||||
|
||||
SYNOPSIS
|
||||
set_protect_against_global_read_lock()
|
||||
void
|
||||
|
||||
RETURN
|
||||
FALSE OK, no global read lock exists.
|
||||
TRUE Error, global read lock exists already.
|
||||
*/
|
||||
|
||||
bool set_protect_against_global_read_lock(void)
|
||||
{
|
||||
bool global_read_lock_exists;
|
||||
|
||||
pthread_mutex_lock(&LOCK_open);
|
||||
if (! (global_read_lock_exists= test(global_read_lock)))
|
||||
protect_against_global_read_lock++;
|
||||
pthread_mutex_unlock(&LOCK_open);
|
||||
return global_read_lock_exists;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Unset protection against global read lock.
|
||||
|
||||
SYNOPSIS
|
||||
unset_protect_against_global_read_lock()
|
||||
void
|
||||
|
||||
RETURN
|
||||
void
|
||||
*/
|
||||
|
||||
void unset_protect_against_global_read_lock(void)
|
||||
{
|
||||
pthread_mutex_lock(&LOCK_open);
|
||||
protect_against_global_read_lock--;
|
||||
pthread_mutex_unlock(&LOCK_open);
|
||||
pthread_cond_broadcast(&COND_refresh);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1151,7 +1151,8 @@ extern pthread_t signal_thread;
|
|||
extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd;
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
||||
MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **table,uint count);
|
||||
MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **table, uint count,
|
||||
bool ignore_global_read_lock= FALSE);
|
||||
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock);
|
||||
void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock);
|
||||
void mysql_unlock_some_tables(THD *thd, TABLE **table,uint count);
|
||||
|
@ -1165,6 +1166,8 @@ bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh,
|
|||
bool is_not_commit);
|
||||
void start_waiting_global_read_lock(THD *thd);
|
||||
bool make_global_read_lock_block_commit(THD *thd);
|
||||
bool set_protect_against_global_read_lock(void);
|
||||
void unset_protect_against_global_read_lock(void);
|
||||
|
||||
/* Lock based on name */
|
||||
int lock_and_wait_for_table_name(THD *thd, TABLE_LIST *table_list);
|
||||
|
|
|
@ -1213,7 +1213,7 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list)
|
|||
}
|
||||
|
||||
pthread_mutex_lock(&tmp->mutex);
|
||||
table=tmp->get_local_table(thd);
|
||||
table= tmp->get_local_table(thd);
|
||||
pthread_mutex_unlock(&tmp->mutex);
|
||||
if (table)
|
||||
thd->di=tmp;
|
||||
|
|
Loading…
Reference in a new issue