summaryrefslogtreecommitdiff
path: root/storage/innobase/btr
diff options
context:
space:
mode:
authorTimothy Smith <timothy.smith@sun.com>2009-03-11 18:14:24 -0600
committerTimothy Smith <timothy.smith@sun.com>2009-03-11 18:14:24 -0600
commit556135a1a1126443faf4a9508ef1432cb6968df2 (patch)
tree91811d26e9c1b41a3c903bbb843230e1e90d8361 /storage/innobase/btr
parent5c2114285549efb625ca2dc36dfa6406ca83f3fe (diff)
downloadmariadb-git-556135a1a1126443faf4a9508ef1432cb6968df2.tar.gz
Applying InnoDB snashot 5.1-ss4350, part 1. Fixes
Bug #42279 Race condition in btr_search_drop_page_hash_when_freed() Detailed revision comments: r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines branches/5.1: Merge r4031 from branches/5.0: btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen() returns NULL. The page may have been evicted from the buffer pool between buf_page_peek_if_search_hashed() and buf_page_get_gen(), because the buffer pool mutex will be released between these two calls. (Bug #42279) rb://82 approved by Heikki Tuuri
Diffstat (limited to 'storage/innobase/btr')
-rw-r--r--storage/innobase/btr/btr0sea.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/storage/innobase/btr/btr0sea.c b/storage/innobase/btr/btr0sea.c
index 3482e16497a..84ad0e27110 100644
--- a/storage/innobase/btr/btr0sea.c
+++ b/storage/innobase/btr/btr0sea.c
@@ -1105,12 +1105,20 @@ btr_search_drop_page_hash_when_freed(
page = buf_page_get_gen(space, page_no, RW_S_LATCH, NULL,
BUF_GET_IF_IN_POOL, __FILE__, __LINE__,
&mtr);
+ /* Because the buffer pool mutex was released by
+ buf_page_peek_if_search_hashed(), it is possible that the
+ block was removed from the buffer pool by another thread
+ before buf_page_get_gen() got a chance to acquire the buffer
+ pool mutex again. Thus, we must check for a NULL return. */
+
+ if (UNIV_LIKELY(page != NULL)) {
#ifdef UNIV_SYNC_DEBUG
- buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH);
+ buf_page_dbg_add_level(page, SYNC_TREE_NODE_FROM_HASH);
#endif /* UNIV_SYNC_DEBUG */
- btr_search_drop_page_hash_index(page);
+ btr_search_drop_page_hash_index(page);
+ }
mtr_commit(&mtr);
}