Commit 6ca27dde authored by Satya Bodapati's avatar Satya Bodapati

Testcase fix for BUG#14147491

The random failure will be fixed by Bug#16263506 and this patch

Approved by Marko. rb#1988
parent 1048aed5
...@@ -4,14 +4,25 @@ CALL mtr.add_suppression("InnoDB: Warning: database page corruption or a failed" ...@@ -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; 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');
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 # Corrupt the table
Munged a string. Munged a string.
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; SELECT * FROM t1;
ERROR HY000: Lost connection to MySQL server during query ERROR HY000: Lost connection to MySQL server during query
# Turn on reconnect # Restore the original t1.ibd
# Wait for server to fully start # Write file to make mysql-test-run.pl start up the server again
# Cleanup # Cleanup
DROP TABLE t1; DROP TABLE t1;
...@@ -10,6 +10,8 @@ source include/not_crashrep.inc; ...@@ -10,6 +10,8 @@ source include/not_crashrep.inc;
source include/not_embedded.inc; source include/not_embedded.inc;
# Require InnoDB # Require InnoDB
source include/have_innodb.inc; 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: 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"); CALL mtr.add_suppression("InnoDB: Warning: database page corruption or a failed");
...@@ -27,13 +29,26 @@ while ($i) ...@@ -27,13 +29,26 @@ while ($i)
--enable_query_log --enable_query_log
INSERT INTO t1 (b) VALUES ('corrupt me'); 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 $MYSQLD_DATADIR=`select @@datadir`;
let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd; 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; perl;
use strict; use strict;
use warnings; use warnings;
...@@ -59,17 +74,32 @@ while ($len = sysread IBD_FILE, $chunk, 1024) ...@@ -59,17 +74,32 @@ while ($len = sysread IBD_FILE, $chunk, 1024)
close IBD_FILE; close IBD_FILE;
EOF 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 --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 --error 2013
SELECT * FROM t1; SELECT * FROM t1;
--echo # Turn on reconnect --echo # Restore the original t1.ibd
--enable_reconnect --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 --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 --echo # Cleanup
DROP TABLE t1; DROP TABLE t1;
...@@ -2322,6 +2322,10 @@ loop2: ...@@ -2322,6 +2322,10 @@ loop2:
retries = 0; retries = 0;
} else if (retries < BUF_PAGE_READ_MAX_RETRIES) { } else if (retries < BUF_PAGE_READ_MAX_RETRIES) {
++retries; ++retries;
DBUG_EXECUTE_IF(
"innodb_page_corruption_retries",
retries = BUF_PAGE_READ_MAX_RETRIES;
);
} else { } else {
fprintf(stderr, "InnoDB: Error: Unable" fprintf(stderr, "InnoDB: Error: Unable"
" to read tablespace %lu page no" " to read tablespace %lu page no"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment