Bug #44223 | Falcon assertion state != recQueuedForDelete in Record::queueForDelete | ||
---|---|---|---|
Submitted: | 12 Apr 2009 15:26 | Modified: | 26 May 2010 17:47 |
Reporter: | Philip Stoev | Email Updates: | |
Status: | Unsupported | Impact on me: | |
Category: | MySQL Server: Falcon storage engine | Severity: | S1 (Critical) |
Version: | 6.0-falcon-team | OS: | Any |
Assigned to: | Kevin Lewis | CPU Architecture: | Any |
Tags: | F_RECORD TREE |
[12 Apr 2009 15:26]
Philip Stoev
[28 Apr 2009 19:28]
Philip Stoev
The initial report says this bug happened "3 out of 60 test runs". In my testing on the 6.0-falcon-kevin tree, it only happened once out of 150 test runs. Therefore unscientifically, this bug may now be less frequent.
[14 May 2009 7:07]
Xuekun Hu
When I tested DBT2 with 100 WH on falcon-tree (rev2701, 2009-5-7), this assertion occured very time.
[3 Jun 2009 20:50]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/75562 2717 Kevin Lewis 2009-06-03 Bug#43961 & Bug#44223 Both of these bugs are caused by a record that gets queued for delete while still chained up to the transaction. Then during Transaction::rolback (44223) a record to rollback is queued for delete a second time. Or during Transaction::rollbackSavepoint (43961), the code assumes that this record on the transaction and savepoint is still the base record since it has Record::superceded=false, and tries to call insertIntoTree to rerplace it with its prior. But this record is not the base record either. This can happen in Table::update(Transaction * transaction, Record *orgRecord, Stream *stream); If this update replaces a lock record with an updated record and an exception occurred, it may or may not take the record off the transaction and the tree, but it would always queue the lock record for delete. This code has gone through some iterations lately. But in the most recent code, I was able to reporduce 44223. This patch cleans it up even more by distinguishing whether a record is actually inserted into the tree and added to the transaction. It undoes those actions only if they were done. Then if the update started with a lock record, that recordversion will remain on the tree with superceded=false and it will not be queued for delete. It correctly uses the 'wasLock' variable instead of the 'updated' or 'wasUpdated' flag.