From 5b22bc3bd59dcc75828072ce738c8acb3ab254fc Mon Sep 17 00:00:00 2001 From: "ramil/ram@mysql.com/ramil.myoffice.izhnet.ru" <> Date: Mon, 18 Jun 2007 22:22:31 +0500 Subject: [PATCH] Sdditional fix-up for bug #26380: LOCK TABLES + FLUSH LOGS causes deadlock FLUSH LOGS should ignore SET GLOBAL READ_ONLY. --- sql/lock.cc | 11 ++++++----- sql/mysql_priv.h | 1 + sql/sql_base.cc | 5 +++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/sql/lock.cc b/sql/lock.cc index 9785bc4ac00..9c5b5b9d88a 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -92,6 +92,7 @@ static void print_lock_error(int error, const char *); count The number of tables to lock. flags Options: MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK Ignore a global read lock + MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY Ignore SET GLOBAL READ_ONLY MYSQL_LOCK_IGNORE_FLUSH Ignore a flush tables. MYSQL_LOCK_NOTIFY_IF_NEED_REOPEN Instead of reopening altered or dropped tables by itself, @@ -150,11 +151,11 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, } } - if ( write_lock_used - && opt_readonly - && ! (thd->security_ctx->master_access & SUPER_ACL) - && ! thd->slave_thread - ) + if (!(flags & MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY) && + write_lock_used && + opt_readonly && + !(thd->security_ctx->master_access & SUPER_ACL) && + !thd->slave_thread) { /* Someone has issued SET GLOBAL READ_ONLY=1 and we want a write lock. diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index bd786ed81ca..1f19458a332 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -1765,6 +1765,7 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **table, uint count, #define MYSQL_LOCK_IGNORE_FLUSH 0x0002 #define MYSQL_LOCK_NOTIFY_IF_NEED_REOPEN 0x0004 #define MYSQL_OPEN_TEMPORARY_ONLY 0x0008 +#define MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY 0x0010 void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 2450429fb69..9b336e8a703 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -4020,9 +4020,10 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count, bool *need_reopen) TABLE **start,**ptr; uint lock_flag= MYSQL_LOCK_NOTIFY_IF_NEED_REOPEN; - /* Don't honor the GLOBAL READ LOCK if called from a logger */ + /* Ignore GLOBAL READ LOCK and GLOBAL READ_ONLY if called from a logger */ if (logger.is_privileged_thread(thd)) - lock_flag|= MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK; + lock_flag|= (MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK | + MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY); if (!(ptr=start=(TABLE**) thd->alloc(sizeof(TABLE*)*count))) DBUG_RETURN(-1);