summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2012-03-28 13:49:07 +0300
committerMichael Widenius <monty@askmonty.org>2012-03-28 13:49:07 +0300
commit3bc932ec175ae9ac2fc6c0c5be29002819c9b102 (patch)
tree142e8c1fdf2e1cd20740c27716b4fb692895db41
parentc88e2679c60f56719b6d347c30374e69ffd3d5c4 (diff)
parent74b064933267f58b9201c46eb67454237d7664d3 (diff)
downloadmariadb-git-3bc932ec175ae9ac2fc6c0c5be29002819c9b102.tar.gz
Merge with 5.1
-rw-r--r--mysql-test/suite/maria/r/maria-autozerofill.result29
-rw-r--r--mysql-test/suite/maria/t/maria-autozerofill.test20
-rw-r--r--sql/ha_partition.cc4
-rw-r--r--sql/ha_partition.h2
-rw-r--r--sql/handler.h2
-rw-r--r--sql/table.cc3
-rw-r--r--storage/archive/ha_archive.h4
-rw-r--r--storage/csv/ha_tina.h2
-rw-r--r--storage/maria/ha_maria.cc23
-rw-r--r--storage/maria/ha_maria.h10
-rw-r--r--storage/maria/ma_open.c2
-rw-r--r--storage/myisam/ha_myisam.h6
12 files changed, 92 insertions, 15 deletions
diff --git a/mysql-test/suite/maria/r/maria-autozerofill.result b/mysql-test/suite/maria/r/maria-autozerofill.result
index 81df4cbab90..dc3d47bc6cc 100644
--- a/mysql-test/suite/maria/r/maria-autozerofill.result
+++ b/mysql-test/suite/maria/r/maria-autozerofill.result
@@ -4,17 +4,42 @@ create database mysqltest;
use mysqltest;
create table t1(a int) engine=aria;
insert into t1 values(1);
-flush table t1;
+create table t2 (a int) engine=aria;
+INSERT INTO t2 VALUES (1),(2);
+create table t3 (a int) engine=aria;
+INSERT INTO t3 VALUES (1),(2);
+create table t4 (a int) engine=aria;
+INSERT INTO t4 VALUES (1),(2);
+flush tables;
create_rename_lsn has non-magic value
* shut down mysqld, removed logs, restarted it
select * from t1;
a
1
Warnings:
-Error 1194 t1' is marked as crashed and should be repaired
+Note 1194 Zerofilling moved table ./mysqltest/t1
flush table t1;
Status: changed,sorted index pages,zerofilled
insert into t1 values(2);
flush table t1;
create_rename_lsn has non-magic value
+check table t2;
+Table Op Msg_type Msg_text
+mysqltest.t2 check error Table is from another system and must be zerofilled or repaired to be usable on this system
+mysqltest.t2 check error Corrupt
+check table t2;
+Table Op Msg_type Msg_text
+mysqltest.t2 check error Table is from another system and must be zerofilled or repaired to be usable on this system
+mysqltest.t2 check error Corrupt
+repair table t2;
+Table Op Msg_type Msg_text
+mysqltest.t2 repair status OK
+optimize table t3;
+Table Op Msg_type Msg_text
+mysqltest.t3 optimize Note Zerofilling moved table ./mysqltest/t3
+mysqltest.t3 optimize status OK
+analyze table t4;
+Table Op Msg_type Msg_text
+mysqltest.t4 analyze Note Zerofilling moved table ./mysqltest/t4
+mysqltest.t4 analyze status OK
drop database mysqltest;
diff --git a/mysql-test/suite/maria/t/maria-autozerofill.test b/mysql-test/suite/maria/t/maria-autozerofill.test
index b42b8e177dc..0b0f3b97e0f 100644
--- a/mysql-test/suite/maria/t/maria-autozerofill.test
+++ b/mysql-test/suite/maria/t/maria-autozerofill.test
@@ -22,9 +22,17 @@ connection default;
use mysqltest;
--enable_reconnect
+# Create some tables for future tests
create table t1(a int) engine=aria;
insert into t1 values(1);
-flush table t1;
+create table t2 (a int) engine=aria;
+INSERT INTO t2 VALUES (1),(2);
+create table t3 (a int) engine=aria;
+INSERT INTO t3 VALUES (1),(2);
+create table t4 (a int) engine=aria;
+INSERT INTO t4 VALUES (1),(2);
+flush tables;
+
# Check that table is not zerofilled, not movable
let $MYSQLD_DATADIR= `select @@datadir`;
--exec $MARIA_CHK -dv $MYSQLD_DATADIR/mysqltest/t1 >$MYSQLTEST_VARDIR/tmp/ariachk.txt
@@ -80,4 +88,14 @@ perl;
close FILE;
EOF
+#
+# BUG#44422 "mysql_upgrade destroys Maria tables?"
+# Check repair and optimize of moved table
+#
+check table t2;
+check table t2;
+repair table t2;
+optimize table t3;
+analyze table t4;
+
drop database mysqltest;
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index 412734faf23..542af265f52 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -1226,7 +1226,7 @@ bool ha_partition::check_and_repair(THD *thd)
@retval FALSE Cannot be auto repaired
*/
-bool ha_partition::auto_repair() const
+bool ha_partition::auto_repair(int error) const
{
DBUG_ENTER("ha_partition::auto_repair");
@@ -1234,7 +1234,7 @@ bool ha_partition::auto_repair() const
As long as we only support one storage engine per table,
we can use the first partition for this function.
*/
- DBUG_RETURN(m_file[0]->auto_repair());
+ DBUG_RETURN(m_file[0]->auto_repair(error));
}
diff --git a/sql/ha_partition.h b/sql/ha_partition.h
index 73d1c25c0c4..59449ef9634 100644
--- a/sql/ha_partition.h
+++ b/sql/ha_partition.h
@@ -1102,7 +1102,7 @@ public:
virtual int check(THD* thd, HA_CHECK_OPT *check_opt);
virtual int repair(THD* thd, HA_CHECK_OPT *check_opt);
virtual bool check_and_repair(THD *thd);
- virtual bool auto_repair() const;
+ virtual bool auto_repair(int error) const;
virtual bool is_crashed() const;
private:
diff --git a/sql/handler.h b/sql/handler.h
index 79e838d2ca6..16bf3daa08c 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -1833,7 +1833,7 @@ public:
virtual bool low_byte_first() const { return 1; }
virtual uint checksum() const { return 0; }
virtual bool is_crashed() const { return 0; }
- virtual bool auto_repair() const { return 0; }
+ virtual bool auto_repair(int error) const { return 0; }
void update_global_table_stats();
void update_global_index_stats();
diff --git a/sql/table.cc b/sql/table.cc
index 5bcc85e3cc8..5b1db9ef1e4 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -2380,8 +2380,7 @@ partititon_err:
HA_OPEN_IGNORE_IF_LOCKED) | ha_open_flags))))
{
/* Set a flag if the table is crashed and it can be auto. repaired */
- share->crashed= ((ha_err == HA_ERR_CRASHED_ON_USAGE) &&
- outparam->file->auto_repair() &&
+ share->crashed= (outparam->file->auto_repair(ha_err) &&
!(ha_open_flags & HA_OPEN_FOR_REPAIR));
switch (ha_err)
diff --git a/storage/archive/ha_archive.h b/storage/archive/ha_archive.h
index 653a13b242d..6f0c0b529fb 100644
--- a/storage/archive/ha_archive.h
+++ b/storage/archive/ha_archive.h
@@ -125,7 +125,9 @@ public:
int free_share();
int init_archive_writer();
int init_archive_reader();
- bool auto_repair() const { return 1; } // For the moment we just do this
+ // Always try auto_repair in case of HA_ERR_CRASHED_ON_USAGE
+ bool auto_repair(int error) const
+ { return error == HA_ERR_CRASHED_ON_USAGE; }
int read_data_header(azio_stream *file_to_read);
void position(const uchar *record);
int info(uint);
diff --git a/storage/csv/ha_tina.h b/storage/csv/ha_tina.h
index 8572a53a94d..54860ecb3fb 100644
--- a/storage/csv/ha_tina.h
+++ b/storage/csv/ha_tina.h
@@ -151,6 +151,8 @@ public:
int rnd_end();
int repair(THD* thd, HA_CHECK_OPT* check_opt);
/* This is required for SQL layer to know that we support autorepair */
+ bool auto_repair(int error) const
+ { return error == HA_ERR_CRASHED_ON_USAGE; }
bool auto_repair() const { return 1; }
void position(const uchar *record);
int info(uint);
diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc
index 1e8a03d3990..f47ad47df41 100644
--- a/storage/maria/ha_maria.cc
+++ b/storage/maria/ha_maria.cc
@@ -53,6 +53,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
@@ -1024,7 +1027,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;
@@ -1124,6 +1135,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)
@@ -2080,6 +2098,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 2cfa2d8cd9b..8062b235d7d 100644
--- a/storage/maria/ha_maria.h
+++ b/storage/maria/ha_maria.h
@@ -136,8 +136,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 2ffbfecb854..d3e758ada58 100644
--- a/storage/maria/ma_open.c
+++ b/storage/maria/ma_open.c
@@ -987,8 +987,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)
diff --git a/storage/myisam/ha_myisam.h b/storage/myisam/ha_myisam.h
index 3a3b5536a30..99d0a1b3369 100644
--- a/storage/myisam/ha_myisam.h
+++ b/storage/myisam/ha_myisam.h
@@ -127,7 +127,11 @@ class ha_myisam: public handler
int repair(THD* thd, HA_CHECK_OPT* check_opt);
bool check_and_repair(THD *thd);
bool is_crashed() const;
- bool auto_repair() const { return myisam_recover_options != 0; }
+ bool auto_repair(int error) const
+ {
+ return (myisam_recover_options != 0 &&
+ error == HA_ERR_CRASHED_ON_USAGE);
+ }
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);