Commit 731c8da0 authored by ingo@mysql.com's avatar ingo@mysql.com

Bug#7823 - FLUSH TABLES WITH READ LOCK + INSERT DELAYED = deadlock

After merge fix.
parent 15f9556c
...@@ -82,7 +82,8 @@ static int unlock_external(THD *thd, TABLE **table,uint count); ...@@ -82,7 +82,8 @@ static int unlock_external(THD *thd, TABLE **table,uint count);
static void print_lock_error(int error, const char *); 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; MYSQL_LOCK *sql_lock;
TABLE *write_lock_used; TABLE *write_lock_used;
...@@ -93,7 +94,7 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **tables,uint count) ...@@ -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))) if (!(sql_lock = get_lock_data(thd,tables,count, 0,&write_lock_used)))
break; 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 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) ...@@ -949,3 +950,49 @@ bool make_global_read_lock_block_commit(THD *thd)
DBUG_RETURN(error); 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; ...@@ -1151,7 +1151,8 @@ extern pthread_t signal_thread;
extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd; extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd;
#endif /* HAVE_OPENSSL */ #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_tables(THD *thd, MYSQL_LOCK *sql_lock);
void mysql_unlock_read_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); 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, ...@@ -1165,6 +1166,8 @@ bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh,
bool is_not_commit); bool is_not_commit);
void start_waiting_global_read_lock(THD *thd); void start_waiting_global_read_lock(THD *thd);
bool make_global_read_lock_block_commit(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 */ /* Lock based on name */
int lock_and_wait_for_table_name(THD *thd, TABLE_LIST *table_list); 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) ...@@ -1213,7 +1213,7 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list)
} }
pthread_mutex_lock(&tmp->mutex); pthread_mutex_lock(&tmp->mutex);
table=tmp->get_local_table(thd); table= tmp->get_local_table(thd);
pthread_mutex_unlock(&tmp->mutex); pthread_mutex_unlock(&tmp->mutex);
if (table) if (table)
thd->di=tmp; thd->di=tmp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment