Description:
Assertion happens while running falcon_bug_22154 test
in Table.cpp, function Table::validateUpdate()
on this place
if (!next)
{
Log::debug("Table::validateUpdate: bad record\n");
initial->print();
Record *newRecord = fetch(recordNumber);
Log::debug("Table::validateUpdate: currentRecord\n");
newRecord->print();
--> ASSERT(false);
}
The stack backtrace of the failing thread is
ntdll.dll!DbgBreakPoint()
mysqld.exe!Error::debugBreak() Line 94 C++
mysqld.exe!Error::error(const char * string=0x0000000140d328e0, ...) Line 71 C++
mysqld.exe!Error::assertionFailed(const char * fileName=0x0000000140d36610, int line=3545) Line 77 C++
> mysqld.exe!Table::validateUpdate(int recordNumber=467, unsigned int transactionId=6698) Line 3545 + 0x18 bytes C++
mysqld.exe!Dbb::validateAndUpdateRecord(int sectionId=0, int recordId=467, Stream * stream=0x000000000512f010, unsigned int transId=6698, bool earlyWrite=false) Line 339 + 0x29 bytes C++
mysqld.exe!SRLUpdateRecords::commit() Line 338 + 0x38 bytes C++
mysqld.exe!SerialLogTransaction::commit() Line 90 C++
mysqld.exe!SerialLogTransaction::doAction() Line 155 C++
mysqld.exe!Gopher::gopherThread() Line 67 C++
mysqld.exe!Gopher::gopherThread(void * arg=0x0000000002941c18) Line 38 C++
mysqld.exe!Thread::thread() Line 163 C++
mysqld.exe!Thread::thread(void * parameter=0x000000000294cec8) Line 141 C++
kernel32.dll!BaseThreadInitThunk() + 0xd bytes
ntdll.dll!RtlUserThreadStart() + 0x21 bytes
Additionally, there are 2 another threads running in parallel, one doing drop table and also scavenger.
Note that the 32 bit version does not crash - it finishes earlier with "record
cache exhausted" error.
Note also that possibilities for post-mortem analysis are available : I saved memory dump, PDB, executable and source.
How to repeat:
Get fresh bitkeeper tree for Falcon. Compile in debug mode for x64.
run the test with
perl mysql-test-run.pl --enable-disabled --suite=falcon falcon_bug_22154
Be patient it takes a while, until mysqld asserts.
Suggested fix:
?