| Bug #25017 | Falcon: crash recovery failure with alterations | ||
|---|---|---|---|
| Submitted: | 12 Dec 2006 18:52 | Modified: | 13 Nov 2007 18:11 |
| Reporter: | Peter Gulutzan | Email Updates: | |
| Status: | Can't repeat | Impact on me: | |
| Category: | MySQL Server: Falcon storage engine | Severity: | S3 (Non-critical) |
| Version: | 5.1.13-falcon-alpha-debug | OS: | Linux (SUSE 10.0 / 64-bit) |
| Assigned to: | CPU Architecture: | Any | |
[12 Dec 2006 18:52]
Peter Gulutzan
[13 Dec 2006 16:48]
Peter Gulutzan
For
#25017 Falcon: crash recovery failure with alterations
I fiddled with the test case until I had something
that failed (for me) five times in a row. Either I
saw a crash, or I saw a 'table not found' error.
The new test case is:
delimiter //
delete from mysql.proc//
create database d50//
use d50//
create table ty (s1 int) engine=myisam//
create procedure py ()
begin
declare v int default 0;
drop table ty;
create table ty (s1 int, s2 varchar(0)) engine=falcon;
create index iy on ty (s1);
while v < 10000 do
select v; insert into ty values (v,repeat('a',v));
set @v = concat('alter table ty modify column s2 varchar(',v,')');
prepare stmt1 from @v;
execute stmt1;
update ty set s1 = s1 - rand()*10000;
set v = v + 1;
end while;
end//
call py()//
/*
Wait till v > 200.
Say 'kill -9' on other console. */
Start mysqld again.
*/
delimiter //
create database d51//
use d51//
create table ty (s1 int) engine=myisam//
create procedure py ()
begin
declare v int default 0;
drop table ty;
create table ty (s1 int, s2 varchar(0)) engine=falcon;
create index iy on ty (s1);
while v < 10000 do
select v; insert into ty values (v,repeat('a',v));
set @v = concat('alter table ty modify column s2 varchar(',v,')');
prepare stmt1 from @v;
execute stmt1;
update ty set s1 = s1 - rand()*10000;
set v = v + 1;
end while;
end//
call py()//
/*
Wait till v > 200.
Say 'kill -9' on other console. */
Start mysqld again.
*/
select count(s2) from d50.ty//
select count(s2) from d51.ty//
drop table d50.ty//
drop table d51.ty//
[27 Feb 2007 15:20]
MySQL Verification Team
Thank you for the bug report. Verified with last test case.
[20 Mar 2007 14:59]
Jim Starkey
Problem was in the delete data section code executing a drop table. In specific, if the server was stopped during the section page tree deletion, it would restart at recovery time, leading to bad results. The fix was to log a slot change (page number to zero) before deleting a section page. Nice bug, very well documented, and easily reproduceable. I greatly appreciate the time and effort that went into reducing a rare event to predictable script. Thanks.
[15 Apr 2007 19:42]
Hakan Küçükyılmaz
Not fixed. I get following error:
delimiter //
delete from mysql.proc//
create database d50//
use d50//
create table ty (s1 int) engine=myisam//
create procedure py ()
begin
declare v int default 0;
drop table ty;
create table ty (s1 int, s2 varchar(0)) engine=falcon;
create index iy on ty (s1);
while v < 10000 do
select v; insert into ty values (v,repeat('a',v));
set @v = concat('alter table ty modify column s2 varchar(',v,')');
prepare stmt1 from @v;
execute stmt1;
update ty set s1 = s1 - rand()*10000;
set v = v + 1;
end while;
end//
call py()//
/*
Wait till v > 200.
Say 'kill -9' on other console.
Start mysqld again.
*/
delimiter //
create database d51//
use d51//
create table ty (s1 int) engine=myisam//
create procedure py ()
begin
declare v int default 0;
drop table ty;
create table ty (s1 int, s2 varchar(0)) engine=falcon;
create index iy on ty (s1);
while v < 10000 do
select v; insert into ty values (v,repeat('a',v));
set @v = concat('alter table ty modify column s2 varchar(',v,')');
prepare stmt1 from @v;
execute stmt1;
update ty set s1 = s1 - rand()*10000;
set v = v + 1;
end while;
end//
call py()//
/*
Wait till v > 200.
Say 'kill -9' on other console.
Start mysqld again.
*/
select count(s2) from d50.ty//
[21:39] root@d51>select count(s2) from d50.ty//
ERROR 1030 (HY000): Got error 157 from storage engine
[31 May 2007 17:36]
Kevin Lewis
This is similar to Bug#28351
[26 Jun 2007 18:29]
Jim Starkey
Rather three clients in parallel for a full minute, twice. Successful recoveries each time. The test was run on a four processor SuSE 64 bit Linux.
[26 Jun 2007 20:55]
Hakan Küçükyılmaz
Still fails. Hit's assertion. I used following procedure with three clients and killed mysqld.
delimiter //
create table t (s1 int primary key, s2 int) engine=falcon//
create procedure p ()
begin
declare v int default 0;
declare continue handler for sqlexception select 'error';
while v < 10000 do
alter table t partition by hash (s1);
select v;
insert into t values (v,null);
alter table t remove partitioning;
set v = v + 1;
end while;
end//
delimiter ;
[Switching to LWP 20367]
0x00002b516d717fed in ?? ()
(gdb) f 4
#4 0x00000000007a6f45 in ~SyncObject (this=0x2b516ede5128) at SyncObject.cpp:119
119 ASSERT(lockState == 0);
(gdb) p lockState
(gdb) bt
#0 0x00002b516d717fed in ?? ()
#1 0x00000000007d3af2 in Error::debugBreak () at Error.cpp:92
#2 0x00000000007d3be8 in Error::error (string=<value optimized out>) at Error.cpp:69
#3 0x00000000007d3c48 in Error::assertionFailed (fileName=0x4 <Address 0x4 out of bounds>, line=20367)
at Error.cpp:76
#4 0x00000000007a6f45 in ~SyncObject (this=0x2b516ede5128) at SyncObject.cpp:119
#5 0x000000000082e34f in ~Bdb (this=0x2b516ede50c0) at BDB.cpp:65
#6 0x0000000000830180 in ~Cache (this=0x2b516ef80198) at Cache.cpp:117
#7 0x00000000007c96eb in ~Database (this=0x2b516ed7eb98) at Database.cpp:572
#8 0x00000000007c02b5 in Connection::getDatabase (this=0x2b516ef7f9b0, dbName=0x2b516ef7f6ac "falcon_master",
dbFileName=0x4007e1d0 "/data/mysql-sap/falcon_master.fts", threads=0x2b516ef7f718) at Connection.cpp:1656
#9 0x00000000007c0f51 in Connection::openDatabase (this=0x2b516ef7f9b0, dbName=0x2b516ef7f6ac "falcon_master",
filename=<value optimized out>, account=0x9f29fc "mysql", password=0x9f29fc "mysql", address=0x0,
parent=0x2b516ef7f718) at Connection.cpp:928
#10 0x000000000079f7d3 in StorageDatabase::getOpenConnection (this=0x2b516ef7f538) at StorageDatabase.cpp:127
#11 0x00000000007a0ff7 in StorageHandler::initialize (this=0x2b516ed7e048) at StorageHandler.cpp:913
#12 0x00000000007a1f82 in StorageHandler::getStorageConnection (this=0x2b516ed7e048, tableShare=0x2b516ef7f1c8,
mySqlThread=0xf4b618, mySqlThdId=1, createFlag=OpenDatabase, tableSpaceMode=0) at StorageHandler.cpp:576
#13 0x000000000079abba in StorageInterface::open (this=0xfa3828, name=0xf967f8 "./test/t",
mode=<value optimized out>, test_if_locked=<value optimized out>) at ha_falcon.cpp:402
#14 0x00000000006ef81a in handler::ha_open (this=0xfa3828, table_arg=0xf95bb8, name=0xf967f8 "./test/t",
mode=2, test_if_locked=<value optimized out>) at handler.cc:1555
#15 0x0000000000660225 in open_table_from_share (thd=0xf4b618, share=0xf96478, alias=<value optimized out>,
db_stat=39, prgflag=<value optimized out>, ha_open_flags=0, outparam=0xf95bb8, is_create_table=false)
at table.cc:1625
#16 0x00000000006572e8 in open_unireg_entry (thd=0xf4b618, entry=0xf95bb8, table_list=0x40080d20,
alias=0xfa5440 "t", cache_key=0x40080330 "test", cache_key_length=7, mem_root=0x40080560, flags=0)
at sql_base.cc:3301
[7 Sep 2007 16:42]
Kevin Lewis
WL#3726 is targeted for MySQL 5.2.
[12 Oct 2007 17:24]
Kevin Lewis
Miguel, Can you re-verify this against mysql-6.0-falcon?
[13 Nov 2007 0:00]
Bugs System
No feedback was provided for this bug for over a month, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open".
[13 Nov 2007 18:11]
Peter Gulutzan
I tried this again today, using the last script by Hakan Kuecuekyilmaz. I cannot repeat the buggy behaviour.
