diff options
author | unknown <gluh@mysql.com/eagle.(none)> | 2007-11-23 16:27:05 +0400 |
---|---|---|
committer | unknown <gluh@mysql.com/eagle.(none)> | 2007-11-23 16:27:05 +0400 |
commit | 6b3fed49ea438ebb4e685510aa8f13f584ac0945 (patch) | |
tree | 04a7a80fef3f53a7b8304c8c86b56066df5ef78c /sql/sql_partition.cc | |
parent | 339e8f5d6354d350ea6a5eb13ff8faead65dca49 (diff) | |
download | mariadb-git-6b3fed49ea438ebb4e685510aa8f13f584ac0945.tar.gz |
Bug#32178 server crash when select from i_s and concurrent partition management
The crash happens because we change share->partition_info where 'share' is global struct
(it affects other threads which use the same 'share').
It causes discrepancy between 'share' and handler data.
The fix:
Move share->partition_info update into WFRM_INSTALL_SHADOW part which is protected by OPEN_lock.
sql/sql_partition.cc:
fast_end_partition: added close_thread_tables() for the case when error occures
fast_alter_partition_table: added close_thread_tables() for the case when error occures
sql/sql_table.cc:
The crash happens because we change share->partition_info where 'share' is global struct.
It causes discrepancy between 'share' and handler data.
The fix:
Move share->partition_info update into WFRM_INSTALL_SHADOW part which is protected by OPEN_lock.
Diffstat (limited to 'sql/sql_partition.cc')
-rw-r--r-- | sql/sql_partition.cc | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index a06ad0a4612..1f365ac991b 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -3984,6 +3984,7 @@ static int fast_end_partition(THD *thd, ulonglong copied, DBUG_RETURN(FALSE); } table->file->print_error(error, MYF(0)); + close_thread_tables(thd); DBUG_RETURN(TRUE); } @@ -6106,7 +6107,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, (error= table->file->repair_partitions(thd)))) { table->file->print_error(error, MYF(0)); - DBUG_RETURN(TRUE); + goto err; } } else if (fast_alter_partition & HA_PARTITION_ONE_PHASE) @@ -6153,7 +6154,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, if (mysql_write_frm(lpt, WFRM_WRITE_SHADOW | WFRM_PACK_FRM) || mysql_change_partitions(lpt)) { - DBUG_RETURN(TRUE); + goto err; } } else if (alter_info->flags == ALTER_DROP_PARTITION) @@ -6246,7 +6247,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, (release_name_lock(lpt), FALSE)) { handle_alter_part_error(lpt, not_completed, TRUE, frm_install); - DBUG_RETURN(TRUE); + goto err; } } else if ((alter_info->flags & ALTER_ADD_PARTITION) && @@ -6315,7 +6316,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, (release_name_lock(lpt), FALSE)) { handle_alter_part_error(lpt, not_completed, FALSE, frm_install); - DBUG_RETURN(TRUE); + goto err; } } else @@ -6408,7 +6409,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, (release_name_lock(lpt), FALSE)) { handle_alter_part_error(lpt, not_completed, FALSE, frm_install); - DBUG_RETURN(TRUE); + goto err; } } /* @@ -6418,6 +6419,9 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, DBUG_RETURN(fast_end_partition(thd, lpt->copied, lpt->deleted, table, table_list, FALSE, NULL, written_bin_log)); +err: + close_thread_tables(thd); + DBUG_RETURN(TRUE); } #endif |