diff options
author | unknown <sasha@mysql.sashanet.com> | 2000-11-04 13:58:07 -0700 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2000-11-04 13:58:07 -0700 |
commit | ee972a4d9fc276a6f47fdb540a7ca88532f018aa (patch) | |
tree | 262cd6aff2b96e2def09112c7fac8f243bbefbf9 /sql | |
parent | 745f1197f64244e9937f6354891044b6b57e78dc (diff) | |
download | mariadb-git-ee972a4d9fc276a6f47fdb540a7ca88532f018aa.tar.gz |
fix for FLUSH TABLES WITH READ LOCK
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_delete.cc | 19 | ||||
-rw-r--r-- | sql/sql_table.cc | 23 |
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); } |