summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2000-11-04 13:58:07 -0700
committerunknown <sasha@mysql.sashanet.com>2000-11-04 13:58:07 -0700
commitee972a4d9fc276a6f47fdb540a7ca88532f018aa (patch)
tree262cd6aff2b96e2def09112c7fac8f243bbefbf9 /sql
parent745f1197f64244e9937f6354891044b6b57e78dc (diff)
downloadmariadb-git-ee972a4d9fc276a6f47fdb540a7ca88532f018aa.tar.gz
fix for FLUSH TABLES WITH READ LOCK
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_delete.cc19
-rw-r--r--sql/sql_table.cc23
2 files changed, 41 insertions, 1 deletions
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index 9cd3c2f0e9b..2e6bea7239e 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -33,6 +33,25 @@ int generate_table(THD *thd, TABLE_LIST *table_list,
DBUG_ENTER("generate_table");
thd->proc_info="generate_table";
+
+ if(global_read_lock)
+ {
+ if(thd->global_read_lock)
+ {
+ my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE,MYF(0),
+ table_list->real_name);
+ DBUG_RETURN(-1);
+ }
+ pthread_mutex_lock(&LOCK_open);
+ while (global_read_lock && ! thd->killed ||
+ thd->version != refresh_version)
+ {
+ (void) pthread_cond_wait(&COND_refresh,&LOCK_open);
+ }
+ pthread_mutex_unlock(&LOCK_open);
+ }
+
+
/* If it is a temporary table, close and regenerate it */
if ((table_ptr=find_temporary_table(thd,table_list->db,
table_list->real_name)))
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index f5336e7beaf..224e92ebe86 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -57,6 +57,23 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists)
VOID(pthread_mutex_lock(&LOCK_open));
pthread_mutex_unlock(&thd->mysys_var->mutex);
+ if(global_read_lock)
+ {
+ if(thd->global_read_lock)
+ {
+ my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE,MYF(0),
+ tables->real_name);
+ error = 1;
+ goto err;
+ }
+ while (global_read_lock && ! thd->killed ||
+ thd->version != refresh_version)
+ {
+ (void) pthread_cond_wait(&COND_refresh,&LOCK_open);
+ }
+
+ }
+
for (TABLE_LIST *table=tables ; table ; table=table->next)
{
char *db=table->db ? table->db : thd->db;
@@ -124,7 +141,9 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists)
mysql_bin_log.write(&qinfo);
}
}
-
+
+ error = 0;
+ err:
VOID(pthread_cond_broadcast(&COND_refresh)); // Signal to refresh
pthread_mutex_unlock(&LOCK_open);
@@ -138,6 +157,8 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists)
my_error(ER_BAD_TABLE_ERROR,MYF(0),wrong_tables.c_ptr());
DBUG_RETURN(-1);
}
+ if(error)
+ DBUG_RETURN(-1);
send_ok(&thd->net);
DBUG_RETURN(0);
}