summaryrefslogtreecommitdiff
path: root/mysql-test
diff options
context:
space:
mode:
authorSatya Bodapati <satya.bodapati@oracle.com>2013-02-20 18:25:18 +0530
committerSatya Bodapati <satya.bodapati@oracle.com>2013-02-20 18:25:18 +0530
commit5a0bf1ae7281f8e13fd47c9607da0b9a40e006e3 (patch)
tree85280f7fab744640b4f888ae2f12f637e5fea48b /mysql-test
parent92f81439a91964e7b875c6975c97069c92fe29fc (diff)
downloadmariadb-git-5a0bf1ae7281f8e13fd47c9607da0b9a40e006e3.tar.gz
Testcase fix for BUG#14147491
The random failure will be fixed by Bug#16263506 and this patch Approved by Marko. rb#1988
Diffstat (limited to 'mysql-test')
-rw-r--r--mysql-test/suite/innodb/r/innodb_bug14147491.result19
-rw-r--r--mysql-test/suite/innodb/t/innodb_bug14147491.test46
2 files changed, 53 insertions, 12 deletions
diff --git a/mysql-test/suite/innodb/r/innodb_bug14147491.result b/mysql-test/suite/innodb/r/innodb_bug14147491.result
index 6279f85f676..ea7c303624b 100644
--- a/mysql-test/suite/innodb/r/innodb_bug14147491.result
+++ b/mysql-test/suite/innodb/r/innodb_bug14147491.result
@@ -4,14 +4,25 @@ CALL mtr.add_suppression("InnoDB: Warning: database page corruption or a failed"
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB;
INSERT INTO t1 (b) VALUES ('corrupt me');
INSERT INTO t1 (b) VALUES ('corrupt me');
-# Restart server to flush buffers
+# Write file to make mysql-test-run.pl expect the "crash", but don't
+# start it until it's told to
+# We give 30 seconds to do a clean shutdown because we do not want
+# to redo apply the pages of t1.ibd at the time of recovery.
+# We want SQL to initiate the first access to t1.ibd.
+# Wait until disconnected.
+# Backup the t1.ibd before corrupting
# Corrupt the table
Munged a string.
Munged a string.
-# Write file to make mysql-test-run.pl expect crash and restart
+# Write file to make mysql-test-run.pl start up the server again
+SET DEBUG = '+d,innodb_page_corruption_retries';
+# Write file to make mysql-test-run.pl expect the "crash", but don't
+# start it until it's told to
+# The below SELECT query will crash the server because some pages
+# on the disk are corrupted
SELECT * FROM t1;
ERROR HY000: Lost connection to MySQL server during query
-# Turn on reconnect
-# Wait for server to fully start
+# Restore the original t1.ibd
+# Write file to make mysql-test-run.pl start up the server again
# Cleanup
DROP TABLE t1;
diff --git a/mysql-test/suite/innodb/t/innodb_bug14147491.test b/mysql-test/suite/innodb/t/innodb_bug14147491.test
index ee3519c53fc..8758631c344 100644
--- a/mysql-test/suite/innodb/t/innodb_bug14147491.test
+++ b/mysql-test/suite/innodb/t/innodb_bug14147491.test
@@ -10,6 +10,8 @@ source include/not_crashrep.inc;
source include/not_embedded.inc;
# Require InnoDB
source include/have_innodb.inc;
+# Require Debug for SET DEBUG
+source include/have_debug.inc;
CALL mtr.add_suppression("InnoDB: Error: Unable to read tablespace .* page no .* into the buffer pool after 100 attempts");
CALL mtr.add_suppression("InnoDB: Warning: database page corruption or a failed");
@@ -27,13 +29,26 @@ while ($i)
--enable_query_log
INSERT INTO t1 (b) VALUES ('corrupt me');
---echo # Restart server to flush buffers
-source include/restart_mysqld.inc;
-
---echo # Corrupt the table
let $MYSQLD_DATADIR=`select @@datadir`;
let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd;
+--echo # Write file to make mysql-test-run.pl expect the "crash", but don't
+--echo # start it until it's told to
+--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
+
+--echo # We give 30 seconds to do a clean shutdown because we do not want
+--echo # to redo apply the pages of t1.ibd at the time of recovery.
+--echo # We want SQL to initiate the first access to t1.ibd.
+shutdown_server 30;
+
+--echo # Wait until disconnected.
+--source include/wait_until_disconnected.inc
+
+--echo # Backup the t1.ibd before corrupting
+--copy_file $t1_IBD $MYSQLD_DATADIR/test/t1.ibd.backup
+
+--echo # Corrupt the table
+
perl;
use strict;
use warnings;
@@ -59,17 +74,32 @@ while ($len = sysread IBD_FILE, $chunk, 1024)
close IBD_FILE;
EOF
---echo # Write file to make mysql-test-run.pl expect crash and restart
+--echo # Write file to make mysql-test-run.pl start up the server again
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
+--enable_reconnect
+--source include/wait_until_connected_again.inc
+
+SET DEBUG = '+d,innodb_page_corruption_retries';
+
+--echo # Write file to make mysql-test-run.pl expect the "crash", but don't
+--echo # start it until it's told to
+--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
+--echo # The below SELECT query will crash the server because some pages
+--echo # on the disk are corrupted
--error 2013
SELECT * FROM t1;
---echo # Turn on reconnect
---enable_reconnect
+--echo # Restore the original t1.ibd
+--move_file $MYSQLD_DATADIR/test/t1.ibd.backup $MYSQLD_DATADIR/test/t1.ibd
---echo # Wait for server to fully start
+--echo # Write file to make mysql-test-run.pl start up the server again
+--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
+--enable_reconnect
--source include/wait_until_connected_again.inc
+# Note SET DEBUG = '-d,innodb_page_corruption_retries' is not required
+# because the session information is lost after server restart
+
--echo # Cleanup
DROP TABLE t1;