From da29c528d3ed59182ad3013ee225e2107cab93a7 Mon Sep 17 00:00:00 2001 From: Mattias Jonsson Date: Mon, 7 Jul 2008 17:54:42 +0200 Subject: Bug#35161: --myisam-recover does not work for partitioned MyISAM tables Problem was that auto_repair, is_crashed and check_and_repair was not implemented in ha_partition. Solution, implemented them as loop over all partitions for is_crashed and check_and_repair, and using the first partition for auto_repair. (Recommit after fixing review comments) --- mysql-test/lib/mtr_report.pl | 5 +- mysql-test/std_data/corrupt_t1#P#p1.MYI | Bin 0 -> 1024 bytes mysql-test/std_data/corrupt_t1.MYI | Bin 0 -> 1024 bytes .../suite/parts/r/partition_repair_myisam.result | 56 ++++++++++++++++++ .../parts/t/partition_repair_myisam-master.opt | 1 + .../suite/parts/t/partition_repair_myisam.test | 30 ++++++++++ sql/ha_partition.cc | 64 +++++++++++++++++++++ sql/ha_partition.h | 6 +- 8 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 mysql-test/std_data/corrupt_t1#P#p1.MYI create mode 100644 mysql-test/std_data/corrupt_t1.MYI create mode 100644 mysql-test/suite/parts/r/partition_repair_myisam.result create mode 100644 mysql-test/suite/parts/t/partition_repair_myisam-master.opt create mode 100644 mysql-test/suite/parts/t/partition_repair_myisam.test diff --git a/mysql-test/lib/mtr_report.pl b/mysql-test/lib/mtr_report.pl index b83f40626aa..bee03e82e24 100644 --- a/mysql-test/lib/mtr_report.pl +++ b/mysql-test/lib/mtr_report.pl @@ -402,7 +402,10 @@ sub mtr_report_stats ($) { )) or # Test case for Bug#31590 produces the following error: - /Out of sort memory; increase server sort buffer size/ + /Out of sort memory; increase server sort buffer size/ or + + # Bug#35161, test of auto repair --myisam-recover + /able.*_will_crash/ ) { next; # Skip these lines diff --git a/mysql-test/std_data/corrupt_t1#P#p1.MYI b/mysql-test/std_data/corrupt_t1#P#p1.MYI new file mode 100644 index 00000000000..27a37c710b4 Binary files /dev/null and b/mysql-test/std_data/corrupt_t1#P#p1.MYI differ diff --git a/mysql-test/std_data/corrupt_t1.MYI b/mysql-test/std_data/corrupt_t1.MYI new file mode 100644 index 00000000000..10df2e8c3e1 Binary files /dev/null and b/mysql-test/std_data/corrupt_t1.MYI differ diff --git a/mysql-test/suite/parts/r/partition_repair_myisam.result b/mysql-test/suite/parts/r/partition_repair_myisam.result new file mode 100644 index 00000000000..df737ec2853 --- /dev/null +++ b/mysql-test/suite/parts/r/partition_repair_myisam.result @@ -0,0 +1,56 @@ +CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM; +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +FLUSH TABLES; +# replacing t1.MYI with a corrupt + unclosed one created by doing: +# 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI +SELECT * FROM t1_will_crash; +a +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +Warnings: +Error 145 Table './test/t1_will_crash' is marked as crashed and should be repaired +Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired +Error 1034 1 client is using or hasn't closed the table properly +Error 1034 Size of indexfile is: 1024 Should be: 2048 +Error 1034 Size of datafile is: 77 Should be: 7 +Error 1034 Number of rows changed from 1 to 11 +DROP TABLE t1_will_crash; +CREATE TABLE t1_will_crash (a INT, KEY (a)) +ENGINE=MyISAM +PARTITION BY HASH(a) +PARTITIONS 3; +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +FLUSH TABLES; +# replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing: +# 'create table t1 (a int key(a)) partition by hash (a) partitions 3' +# head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI +SELECT * FROM t1_will_crash; +a +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +Warnings: +Error 145 Table './test/t1_will_crash#P#p1' is marked as crashed and should be repaired +Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired +Error 1034 1 client is using or hasn't closed the table properly +Error 1034 Size of indexfile is: 1024 Should be: 2048 +Error 1034 Size of datafile is: 28 Should be: 7 +Error 1034 Number of rows changed from 1 to 4 +DROP TABLE t1_will_crash; diff --git a/mysql-test/suite/parts/t/partition_repair_myisam-master.opt b/mysql-test/suite/parts/t/partition_repair_myisam-master.opt new file mode 100644 index 00000000000..787371a854a --- /dev/null +++ b/mysql-test/suite/parts/t/partition_repair_myisam-master.opt @@ -0,0 +1 @@ +--myisam-recover diff --git a/mysql-test/suite/parts/t/partition_repair_myisam.test b/mysql-test/suite/parts/t/partition_repair_myisam.test new file mode 100644 index 00000000000..551d344f60e --- /dev/null +++ b/mysql-test/suite/parts/t/partition_repair_myisam.test @@ -0,0 +1,30 @@ +--source include/have_partition.inc +--disable_warnings +--disable_query_log +drop table if exists t1_will_crash; +--enable_query_log +--enable_warnings + + +CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM; +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +FLUSH TABLES; +--echo # replacing t1.MYI with a corrupt + unclosed one created by doing: +--echo # 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI +--copy_file std_data/corrupt_t1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI +SELECT * FROM t1_will_crash; +DROP TABLE t1_will_crash; +CREATE TABLE t1_will_crash (a INT, KEY (a)) +ENGINE=MyISAM +PARTITION BY HASH(a) +PARTITIONS 3; +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +FLUSH TABLES; +--echo # replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing: +--echo # 'create table t1 (a int key(a)) partition by hash (a) partitions 3' +--echo # head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI +--copy_file std_data/corrupt_t1#P#p1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI +SELECT * FROM t1_will_crash; +DROP TABLE t1_will_crash; diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 2e0bb090ad2..0959d6db974 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -1129,6 +1129,70 @@ int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt, #endif } + +/** + @brief Check and repair the table if neccesary + + @param thd Thread object + + @retval TRUE Error/Not supported + @retval FALSE Success +*/ + +bool ha_partition::check_and_repair(THD *thd) +{ + handler **file= m_file; + DBUG_ENTER("ha_partition::check_and_repair"); + + do + { + if ((*file)->ha_check_and_repair(thd)) + DBUG_RETURN(TRUE); + } while (*(++file)); + DBUG_RETURN(FALSE); +} + + +/** + @breif Check if the table can be automatically repaired + + @retval TRUE Can be auto repaired + @retval FALSE Cannot be auto repaired +*/ + +bool ha_partition::auto_repair() const +{ + DBUG_ENTER("ha_partition::auto_repair"); + + /* + 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()); +} + + +/** + @breif Check if the table is crashed + + @retval TRUE Crashed + @retval FALSE Not crashed +*/ + +bool ha_partition::is_crashed() const +{ + handler **file= m_file; + DBUG_ENTER("ha_partition::is_crashed"); + + do + { + if ((*file)->is_crashed()) + DBUG_RETURN(TRUE); + } while (*(++file)); + DBUG_RETURN(FALSE); +} + + /* Prepare by creating a new partition diff --git a/sql/ha_partition.h b/sql/ha_partition.h index ac00581fae0..e758dd1eeee 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -935,6 +935,9 @@ public: virtual int analyze_partitions(THD *thd); virtual int check_partitions(THD *thd); virtual int repair_partitions(THD *thd); + virtual bool check_and_repair(THD *thd); + virtual bool auto_repair() const; + virtual bool is_crashed() const; private: int handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt, @@ -950,12 +953,9 @@ public: virtual int restore(THD* thd, HA_CHECK_OPT *check_opt); virtual int assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt); virtual int preload_keys(THD *thd, HA_CHECK_OPT *check_opt); - virtual bool check_and_repair(THD *thd); virtual int dump(THD* thd, int fd = -1); virtual int net_read_dump(NET* net); virtual uint checksum() const; - virtual bool is_crashed() const; - virtual bool auto_repair() const; */ /* -- cgit v1.2.1