mirror of
https://github.com/MariaDB/server.git
synced 2025-09-02 09:41:40 +03:00
BUG#5625 - MyISAM Index corruption on ALTER TABLE x ENABLE KEYS due to full tmpdir.
Added a try to a normal repair() if repair_by_sort() failed. This was not done with ENABLE KEYS and OPTIMIZE TABLE. Fixed error code handling in mysql_alter_table(). sql/ha_myisam.cc: BUG#5625 - MyISAM Index corruption on ALTER TABLE x ENABLE KEYS due to full tmpdir. Added a try to a normal repair() if repair_by_sort() failed. This was not done with ENABLE KEYS and OPTIMIZE TABLE. sql/sql_table.cc: BUG#5625 - MyISAM Index corruption on ALTER TABLE x ENABLE KEYS due to full tmpdir. Added a translation from 'bool' return value to '< 0' error indication, which is used within mysql_execute_command() and must as such be handed over by mysql_alter_table(). A returncode >= 0 is interpreted as 'I have already called send_ok()'.
This commit is contained in:
@@ -525,6 +525,7 @@ int ha_myisam::repair(THD* thd, HA_CHECK_OPT *check_opt)
|
|||||||
|
|
||||||
int ha_myisam::optimize(THD* thd, HA_CHECK_OPT *check_opt)
|
int ha_myisam::optimize(THD* thd, HA_CHECK_OPT *check_opt)
|
||||||
{
|
{
|
||||||
|
int error;
|
||||||
if (!file) return HA_ADMIN_INTERNAL_ERROR;
|
if (!file) return HA_ADMIN_INTERNAL_ERROR;
|
||||||
MI_CHECK param;
|
MI_CHECK param;
|
||||||
|
|
||||||
@@ -534,7 +535,14 @@ int ha_myisam::optimize(THD* thd, HA_CHECK_OPT *check_opt)
|
|||||||
param.testflag = (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
param.testflag = (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
||||||
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
||||||
param.sort_buffer_length= check_opt->sort_buffer_size;
|
param.sort_buffer_length= check_opt->sort_buffer_size;
|
||||||
return repair(thd,param,1);
|
if ((error= repair(thd,param,1)) && param.retry_repair)
|
||||||
|
{
|
||||||
|
sql_print_warning("Warning: Optimize table got errno %d, retrying",
|
||||||
|
my_errno);
|
||||||
|
param.testflag&= ~T_REP_BY_SORT;
|
||||||
|
error= repair(thd,param,1);
|
||||||
|
}
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -744,7 +752,13 @@ bool ha_myisam::activate_all_index(THD *thd)
|
|||||||
param.myf_rw&= ~MY_WAIT_IF_FULL;
|
param.myf_rw&= ~MY_WAIT_IF_FULL;
|
||||||
param.sort_buffer_length= thd->variables.myisam_sort_buff_size;
|
param.sort_buffer_length= thd->variables.myisam_sort_buff_size;
|
||||||
param.tmpdir=mysql_tmpdir;
|
param.tmpdir=mysql_tmpdir;
|
||||||
error=repair(thd,param,0) != HA_ADMIN_OK;
|
if ((error= (repair(thd,param,0) != HA_ADMIN_OK)) && param.retry_repair)
|
||||||
|
{
|
||||||
|
sql_print_warning("Warning: Enabling keys got errno %d, retrying",
|
||||||
|
my_errno);
|
||||||
|
param.testflag&= ~(T_REP_BY_SORT | T_QUICK);
|
||||||
|
error= (repair(thd,param,0) != HA_ADMIN_OK);
|
||||||
|
}
|
||||||
info(HA_STATUS_CONST);
|
info(HA_STATUS_CONST);
|
||||||
thd->proc_info=save_proc_info;
|
thd->proc_info=save_proc_info;
|
||||||
}
|
}
|
||||||
|
@@ -1614,7 +1614,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||||||
VOID(pthread_mutex_lock(&LOCK_open));
|
VOID(pthread_mutex_lock(&LOCK_open));
|
||||||
wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN);
|
wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN);
|
||||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||||
error= table->file->activate_all_index(thd);
|
error= (table->file->activate_all_index(thd) ? -1 : 0);
|
||||||
/* COND_refresh will be signaled in close_thread_tables() */
|
/* COND_refresh will be signaled in close_thread_tables() */
|
||||||
break;
|
break;
|
||||||
case DISABLE:
|
case DISABLE:
|
||||||
|
Reference in New Issue
Block a user