summaryrefslogtreecommitdiff
path: root/storage/maria
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2012-03-28 13:22:21 +0300
committerMichael Widenius <monty@askmonty.org>2012-03-28 13:22:21 +0300
commit74b064933267f58b9201c46eb67454237d7664d3 (patch)
tree0edbcdc70f9ca702a1e95782f8f20472ff6849a5 /storage/maria
parentd1f311799988266159310afce3cf19eaf58a1fa5 (diff)
downloadmariadb-git-74b064933267f58b9201c46eb67454237d7664d3.tar.gz
Fixed lp:944422 "mysql_upgrade destroys Maria tables?"
The issue was that check/optimize/anaylze did not zerofill the table before they started to work on it. Added one more element to not often used function handler::auto_repair() to allow handler to decide when to auto repair. mysql-test/suite/maria/r/maria-autozerofill.result: Test case for lp:944422 mysql-test/suite/maria/t/maria-autozerofill.test: Test case for lp:944422 sql/ha_partition.cc: Added argument to auto_repair() sql/ha_partition.h: Added argument to auto_repair() sql/handler.h: Added argument to auto_repair() sql/table.cc: Let auto_repair() decide which errors to trigger auto-repair storage/archive/ha_archive.h: Added argument to auto_repair() storage/csv/ha_tina.h: Added argument to auto_repair() storage/maria/ha_maria.cc: Give better error & warning messages for auto-repaired tables. storage/maria/ha_maria.h: Added argument to auto_repair() Always auto-repair in case of moved table. storage/maria/ma_open.c: Remove special handling of HA_ERR_OLD_FILE (this is now handled in auto_repair()) storage/myisam/ha_myisam.h: Added argument to auto_repair()
Diffstat (limited to 'storage/maria')
-rw-r--r--storage/maria/ha_maria.cc23
-rw-r--r--storage/maria/ha_maria.h10
-rw-r--r--storage/maria/ma_open.c2
3 files changed, 31 insertions, 4 deletions
diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc
index e02c8c5e2cd..6c0914ab751 100644
--- a/storage/maria/ha_maria.cc
+++ b/storage/maria/ha_maria.cc
@@ -52,6 +52,9 @@ C_MODE_END
ulong pagecache_division_limit, pagecache_age_threshold;
ulonglong pagecache_buffer_size;
+const char *zerofill_error_msg=
+ "Table is from another system and must be zerofilled or repaired to be "
+ "usable on this system";
/**
As the auto-repair is initiated when opened from the SQL layer
@@ -972,7 +975,15 @@ int ha_maria::open(const char *name, int mode, uint test_if_locked)
}
if (!(file= maria_open(name, mode, test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
+ {
+ if (my_errno == HA_ERR_OLD_FILE)
+ {
+ push_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
+ ER_CRASHED_ON_USAGE,
+ zerofill_error_msg);
+ }
return (my_errno ? my_errno : -1);
+ }
file->s->chst_invalidator= query_cache_invalidate_by_MyISAM_filename_ref;
@@ -1074,6 +1085,13 @@ int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt)
return HA_ADMIN_ALREADY_DONE;
maria_chk_init_for_check(&param, file);
+ if ((file->s->state.changed & (STATE_CRASHED_FLAGS | STATE_MOVED)) ==
+ STATE_MOVED)
+ {
+ _ma_check_print_error(&param, zerofill_error_msg);
+ return HA_ADMIN_CORRUPT;
+ }
+
(void) maria_chk_status(&param, file); // Not fatal
error= maria_chk_size(&param, file);
if (!error)
@@ -2024,6 +2042,11 @@ bool ha_maria::check_and_repair(THD *thd)
if ((file->s->state.changed & (STATE_CRASHED_FLAGS | STATE_MOVED)) ==
STATE_MOVED)
{
+ /* Remove error about crashed table */
+ mysql_reset_errors(thd, true);
+ push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
+ ER_CRASHED_ON_USAGE,
+ "Zerofilling moved table %s", table->s->path.str);
sql_print_information("Zerofilling moved table: '%s'",
table->s->path.str);
if (!(error= zerofill(thd, &check_opt)))
diff --git a/storage/maria/ha_maria.h b/storage/maria/ha_maria.h
index 47545b67ff3..343675e9452 100644
--- a/storage/maria/ha_maria.h
+++ b/storage/maria/ha_maria.h
@@ -142,8 +142,14 @@ public:
bool check_and_repair(THD * thd);
bool is_crashed() const;
bool is_changed() const;
- bool auto_repair() const
- { return test(maria_recover_options & HA_RECOVER_ANY); }
+ bool auto_repair(int error) const
+ {
+ /* Always auto-repair moved tables (error == HA_ERR_OLD_FILE) */
+ return ((test(maria_recover_options & HA_RECOVER_ANY) &&
+ error == HA_ERR_CRASHED_ON_USAGE) ||
+ error == HA_ERR_OLD_FILE);
+
+ }
int optimize(THD * thd, HA_CHECK_OPT * check_opt);
int restore(THD * thd, HA_CHECK_OPT * check_opt);
int backup(THD * thd, HA_CHECK_OPT * check_opt);
diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c
index eb7ef510d88..cf2e2ceb704 100644
--- a/storage/maria/ma_open.c
+++ b/storage/maria/ma_open.c
@@ -968,8 +968,6 @@ err:
tmp_name.length= strlen(name);
_ma_report_error(save_errno, &tmp_name);
}
- if (save_errno == HA_ERR_OLD_FILE) /* uuid is different ? */
- save_errno= HA_ERR_CRASHED_ON_USAGE; /* the code to trigger auto-repair */
switch (errpos) {
case 5:
if (data_file >= 0)