mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Merge from 4.0 needs fixes
This commit is contained in:
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);
|
static void print_lock_error(int error);
|
||||||
|
|
||||||
|
|
||||||
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)
|
|||||||
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
|
||||||
@@ -911,3 +912,49 @@ void make_global_read_lock_block_commit(THD *thd)
|
|||||||
pthread_mutex_unlock(&LOCK_open);
|
pthread_mutex_unlock(&LOCK_open);
|
||||||
thd->global_read_lock= MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT;
|
thd->global_read_lock= MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
my_bool set_protect_against_global_read_lock(void)
|
||||||
|
{
|
||||||
|
my_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -975,7 +975,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);
|
||||||
@@ -988,6 +989,8 @@ void unlock_global_read_lock(THD *thd);
|
|||||||
bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh, bool is_not_commit);
|
bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh, bool is_not_commit);
|
||||||
void start_waiting_global_read_lock(THD *thd);
|
void start_waiting_global_read_lock(THD *thd);
|
||||||
void make_global_read_lock_block_commit(THD *thd);
|
void make_global_read_lock_block_commit(THD *thd);
|
||||||
|
my_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);
|
||||||
|
Reference in New Issue
Block a user