#At file:///G:/bzr/mysql-6.0-falcon-team/ based on revid:vvaintroub@stripped
3110 Vladislav Vaintroub 2009-04-09
Bug #43765 falcon_bug_22173a crashes in IndexPage::findNodeInLeaf
Falcon crashes with assertion (level==0)in high-concurrent
index updates
Reason is that recent code refactoring in IndexPage code introduced a
regression.
When index is small and consists of a single root page only, findInsertionLeaf(), would check lock the root page with shared lock, check if the root page level is 0 (page is a leaf), unlock the page, lock it again excusively and return this page. The problem is that during the gap while page was not locked, it could have beens spli. In this case returning root page is wrong, as it is not a "insertion leaf", and generally not leaf page at all.
The fix is not to return from the function prematurely, when reacquiring lock in the root and root page changes the level from 0 to greater number.
modified:
storage/falcon/IndexRootPage.cpp
=== modified file 'storage/falcon/IndexRootPage.cpp'
--- a/storage/falcon/IndexRootPage.cpp 2009-04-06 11:44:49 +0000
+++ b/storage/falcon/IndexRootPage.cpp 2009-04-09 07:06:45 +0000
@@ -283,9 +283,11 @@ Bdb* IndexRootPage::findInsertionLeaf(Db
page = (IndexPage*) bdb->buffer;
if (page->level == 0)
+ {
if (isRoot)
*isRoot = true;
return bdb;
+ }
}
while (page->level > 0)
Attachment: [text/bzr-bundle] bzr/vvaintroub@mysql.com-20090409070645-katx7bwydr9y6ftt.bundle
| Thread |
|---|
| • bzr commit into mysql-6.0-falcon-team branch (vvaintroub:3110)Bug#43765 | Vladislav Vaintroub | 9 Apr |