Description:
When executing a concurrent transactional workload, Falcon crashed as follows:
#2 0x00000000006ba74c in handle_segfault (sig=11) at mysqld.cc:2658
#3 <signal handler called>
#4 0x00000000009dc71c in Index::garbageCollect (this=0x7f0231b57fe8, leaving=0x7f022af2bc48, staying=0x0, transaction=0x7f021ca7d218, quiet=true)
at Index.cpp:619
#5 0x000000000097c304 in Table::garbageCollect (this=0x7f0231f0ca98, leaving=0x7f022af2bc48, staying=0x0, transaction=0x7f021ca7d218, quiet=true)
at Table.cpp:2137
#6 0x000000000097c8dd in Table::rollbackRecord (this=0x7f0231f0ca98, recordToRollback=0x7f022af2bc48, transaction=0x7f021ca7d218) at Table.cpp:1024
#7 0x0000000000a0c8b8 in RecordVersion::rollback (this=0x7f022af2bc48, transaction=0x7f021ca7d218) at RecordVersion.cpp:165
#8 0x000000000098b92b in Transaction::rollback (this=0x7f021ca7d218) at Transaction.cpp:397
#9 0x00000000009ad188 in Connection::rollback (this=0x7f0231b6cf78) at Connection.cpp:282
#10 0x000000000095de15 in StorageConnection::rollback (this=0x7f0231b6cee0) at StorageConnection.cpp:191
#11 0x0000000000956dc5 in StorageInterface::rollback (hton=0x3a54038, thd=0x447ecf8, all=true) at ha_falcon.cpp:1275
#12 0x0000000000805b11 in ha_rollback_trans (thd=0x447ecf8, all=true) at handler.cc:1279
#13 0x00000000008d18ad in trans_rollback (thd=0x447ecf8) at transaction.cc:206
#14 0x00000000006d14b4 in mysql_execute_command (thd=0x447ecf8) at sql_parse.cc:4037
#15 0x00000000006d37d1 in mysql_parse (thd=0x447ecf8, inBuf=0x4492e10 "ROLLBACK", length=8, found_semicolon=0x7f0222f43f00) at sql_parse.cc:5732
#16 0x00000000006d43bc in dispatch_command (command=COM_QUERY, thd=0x447ecf8, packet=0x4488dc9 " ROLLBACK", packet_length=9) at sql_parse.cc:1007
#17 0x00000000006d58e5 in do_command (thd=0x447ecf8) at sql_parse.cc:690
#18 0x00000000006c3a69 in handle_one_connection (arg=0x447ecf8) at sql_connect.cc:1154
#19 0x000000315b0073da in start_thread () from /lib64/libpthread.so.0
#20 0x000000315a4e627d in clone () from /lib64/libc.so.6
(gdb) list
614
615 void Index::garbageCollect(Record * leaving, Record * staying, Transaction *transaction, bool quiet)
616 {
617 int n = 0;
618
619 for (Record *record = leaving; record && record != staying; record = record->getGCPriorVersion(), ++n)
620 if (record->hasRecord() && record->recordNumber >= 0)
621 {
622 IndexKey key(this);
623 makeKey (record, &key);
(gdb) print record
$2 = (class Record *) 0x7f022af2bc48
(gdb) print leaving
$3 = (class Record *) 0x7f022af2bc48
(gdb) print staying
$4 = (class Record *) 0x0
(gdb) print n
$5 = 0
(gdb) print record->recordNumber
$6 = -572662307
How to repeat:
If this is repeatable, a simplifed test case will be provided.