Commit 58fa483a authored by Satya B's avatar Satya B

merge 5.0-bugteam to 5.1-bugteam

parents ff9803ac b1d74c9b
#
# BUG#41330 - Myisam table open count set to zero before index blocks are written.
#
# Don't test this under valgrind, memory leaks will occur
# Binary must be compiled with debug for crash to occur
SET GLOBAL delay_key_write=ALL;
CREATE TABLE t1(a INT,
b INT,
PRIMARY KEY(a , b),
KEY(b)) ENGINE=MyISAM DELAY_KEY_WRITE = 1;
INSERT INTO t1 VALUES (1,2),(2,3),(3,4),(4,5),(5,6);
# Setup the mysqld to crash at certain point
SET SESSION debug="d,crash_before_flush_keys";
# Write file to make mysql-test-run.pl expect crash
# Run the crashing query
FLUSH TABLE t1;
ERROR HY000: Lost connection to MySQL server during query
# Run MYISAMCHK tool to check the table t1 and repair
myisamchk: MyISAM file MYSQLD_DATADIR/test/t1
myisamchk: warning: 1 client is using or hasn't closed the table properly
myisamchk: error: Size of indexfile is: 1024 Should be: 3072
MYISAMCHK: Unknown error 126
myisamchk: error: Can't read indexpage from filepos: 1024
MyISAM-table 'MYSQLD_DATADIR/test/t1' is corrupted
Fix it using switch "-r" or "-o"
# Write file to make mysql-test-run.pl start the server
# Turn on reconnect
# Call script that will poll the server waiting for
# it to be back online again
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL DEFAULT '0',
`b` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`a`,`b`),
KEY `b` (`b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DELAY_KEY_WRITE=1
SELECT * FROM t1 FORCE INDEX (PRIMARY);
a b
1 2
2 3
3 4
4 5
5 6
DROP TABLE t1;
--echo #
--echo # BUG#41330 - Myisam table open count set to zero before index blocks are written.
--echo #
--source include/not_embedded.inc
--echo # Don't test this under valgrind, memory leaks will occur
--source include/not_valgrind.inc
--echo # Binary must be compiled with debug for crash to occur
--source include/have_debug.inc
let $MYSQLD_DATADIR= `select @@datadir`;
SET GLOBAL delay_key_write=ALL;
CREATE TABLE t1(a INT,
b INT,
PRIMARY KEY(a , b),
KEY(b)) ENGINE=MyISAM DELAY_KEY_WRITE = 1;
INSERT INTO t1 VALUES (1,2),(2,3),(3,4),(4,5),(5,6);
--echo # Setup the mysqld to crash at certain point
SET SESSION debug="d,crash_before_flush_keys";
--echo # Write file to make mysql-test-run.pl expect crash
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--echo # Run the crashing query
--error 2013
FLUSH TABLE t1;
--echo # Run MYISAMCHK tool to check the table t1 and repair
--replace_result $MYISAMCHK MYISAMCHK $MYSQLD_DATADIR MYSQLD_DATADIR
--error 255
--exec $MYISAMCHK -cs $MYSQLD_DATADIR/test/t1 2>&1
--exec $MYISAMCHK -rs $MYSQLD_DATADIR/test/t1
--echo # Write file to make mysql-test-run.pl start the server
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--echo # Turn on reconnect
--enable_reconnect
--echo # Call script that will poll the server waiting for
--echo # it to be back online again
--source include/wait_until_connected_again.inc
SHOW CREATE TABLE t1;
SELECT * FROM t1 FORCE INDEX (PRIMARY);
DROP TABLE t1;
...@@ -35,9 +35,6 @@ int mi_close(register MI_INFO *info) ...@@ -35,9 +35,6 @@ int mi_close(register MI_INFO *info)
if (info->lock_type == F_EXTRA_LCK) if (info->lock_type == F_EXTRA_LCK)
info->lock_type=F_UNLCK; /* HA_EXTRA_NO_USER_CHANGE */ info->lock_type=F_UNLCK; /* HA_EXTRA_NO_USER_CHANGE */
if (share->reopen == 1 && share->kfile >= 0)
_mi_decrement_open_count(info);
if (info->lock_type != F_UNLCK) if (info->lock_type != F_UNLCK)
{ {
if (mi_lock_database(info,F_UNLCK)) if (mi_lock_database(info,F_UNLCK))
...@@ -63,6 +60,8 @@ int mi_close(register MI_INFO *info) ...@@ -63,6 +60,8 @@ int mi_close(register MI_INFO *info)
my_free(mi_get_rec_buff_ptr(info, info->rec_buff), MYF(MY_ALLOW_ZERO_PTR)); my_free(mi_get_rec_buff_ptr(info, info->rec_buff), MYF(MY_ALLOW_ZERO_PTR));
if (flag) if (flag)
{ {
DBUG_EXECUTE_IF("crash_before_flush_keys",
if (share->kfile >= 0) abort(););
if (share->kfile >= 0 && if (share->kfile >= 0 &&
flush_key_blocks(share->key_cache, share->kfile, flush_key_blocks(share->key_cache, share->kfile,
share->temporary ? FLUSH_IGNORE_CHANGED : share->temporary ? FLUSH_IGNORE_CHANGED :
...@@ -78,6 +77,8 @@ int mi_close(register MI_INFO *info) ...@@ -78,6 +77,8 @@ int mi_close(register MI_INFO *info)
*/ */
if (share->mode != O_RDONLY && mi_is_crashed(info)) if (share->mode != O_RDONLY && mi_is_crashed(info))
mi_state_info_write(share->kfile, &share->state, 1); mi_state_info_write(share->kfile, &share->state, 1);
/* Decrement open count must be last I/O on this file. */
_mi_decrement_open_count(info);
if (my_close(share->kfile,MYF(0))) if (my_close(share->kfile,MYF(0)))
error = my_errno; error = my_errno;
} }
......
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