Commit 7f030634 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge mysql-5.1 to mysql-5.5. Add a test case.

parents 84db3fb4 669ff037
CREATE TABLE bug59733(a INT AUTO_INCREMENT PRIMARY KEY,b CHAR(1))ENGINE=InnoDB;
INSERT INTO bug59733 VALUES(0,'x');
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
CREATE INDEX b ON bug59733 (b);
DELETE FROM bug59733 WHERE (a%100)=0;
DROP INDEX b ON bug59733;
CREATE INDEX b ON bug59733 (b);
DROP TABLE bug59733;
#
# Bug #59733 Possible deadlock when buffered changes are to be discarded
# in buf_page_create
#
-- source include/have_innodb.inc
-- disable_query_log
# The flag innodb_change_buffering_debug is only available in debug builds.
# It instructs InnoDB to try to evict pages from the buffer pool when
# change buffering is possible, so that the change buffer will be used
# whenever possible.
-- error 0,ER_UNKNOWN_SYSTEM_VARIABLE
SET @innodb_change_buffering_debug_orig = @@innodb_change_buffering_debug;
-- error 0,ER_UNKNOWN_SYSTEM_VARIABLE
SET GLOBAL innodb_change_buffering_debug = 1;
-- enable_query_log
CREATE TABLE bug59733(a INT AUTO_INCREMENT PRIMARY KEY,b CHAR(1))ENGINE=InnoDB;
# Create enough rows for the table, so that the insert buffer will be
# used. There must be multiple index pages, because changes to the
# root page are never buffered.
INSERT INTO bug59733 VALUES(0,'x');
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
INSERT INTO bug59733 SELECT 0,b FROM bug59733;
# Create the secondary index for which changes will be buffered.
CREATE INDEX b ON bug59733 (b);
# This should be buffered, if innodb_change_buffering_debug = 1 is in effect.
DELETE FROM bug59733 WHERE (a%100)=0;
# Drop the index in order to get free pages with orphaned buffered changes.
DROP INDEX b ON bug59733;
# Create the index and attempt to reuse pages for which buffered changes exist.
CREATE INDEX b ON bug59733 (b);
DROP TABLE bug59733;
-- disable_query_log
-- error 0, ER_UNKNOWN_SYSTEM_VARIABLE
SET GLOBAL innodb_change_buffering_debug = @innodb_change_buffering_debug_orig;
...@@ -690,7 +690,8 @@ btr_root_block_get( ...@@ -690,7 +690,8 @@ btr_root_block_get(
zip_size = dict_table_zip_size(index->table); zip_size = dict_table_zip_size(index->table);
root_page_no = dict_index_get_page(index); root_page_no = dict_index_get_page(index);
block = btr_block_get(space, zip_size, root_page_no, RW_X_LATCH, mtr); block = btr_block_get(space, zip_size, root_page_no, RW_X_LATCH,
index, mtr);
ut_a((ibool)!!page_is_comp(buf_block_get_frame(block)) ut_a((ibool)!!page_is_comp(buf_block_get_frame(block))
== dict_table_is_comp(index->table)); == dict_table_is_comp(index->table));
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
...@@ -891,7 +892,7 @@ btr_page_alloc_for_ibuf( ...@@ -891,7 +892,7 @@ btr_page_alloc_for_ibuf(
dict_table_zip_size(index->table), dict_table_zip_size(index->table),
node_addr.page, RW_X_LATCH, mtr); node_addr.page, RW_X_LATCH, mtr);
new_page = buf_block_get_frame(new_block); new_page = buf_block_get_frame(new_block);
buf_block_dbg_add_level(new_block, SYNC_TREE_NODE_NEW); buf_block_dbg_add_level(new_block, SYNC_IBUF_TREE_NODE_NEW);
flst_remove(root + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, flst_remove(root + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST,
new_page + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, new_page + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE,
...@@ -1139,7 +1140,7 @@ btr_node_ptr_get_child( ...@@ -1139,7 +1140,7 @@ btr_node_ptr_get_child(
page_no = btr_node_ptr_get_child_page_no(node_ptr, offsets); page_no = btr_node_ptr_get_child_page_no(node_ptr, offsets);
return(btr_block_get(space, dict_table_zip_size(index->table), return(btr_block_get(space, dict_table_zip_size(index->table),
page_no, RW_X_LATCH, mtr)); page_no, RW_X_LATCH, index, mtr));
} }
/************************************************************//** /************************************************************//**
...@@ -1312,7 +1313,8 @@ btr_create( ...@@ -1312,7 +1313,8 @@ btr_create(
space, 0, space, 0,
IBUF_HEADER + IBUF_TREE_SEG_HEADER, mtr); IBUF_HEADER + IBUF_TREE_SEG_HEADER, mtr);
buf_block_dbg_add_level(ibuf_hdr_block, SYNC_TREE_NODE_NEW); buf_block_dbg_add_level(
ibuf_hdr_block, SYNC_IBUF_TREE_NODE_NEW);
ut_ad(buf_block_get_page_no(ibuf_hdr_block) ut_ad(buf_block_get_page_no(ibuf_hdr_block)
== IBUF_HEADER_PAGE_NO); == IBUF_HEADER_PAGE_NO);
...@@ -1350,10 +1352,9 @@ btr_create( ...@@ -1350,10 +1352,9 @@ btr_create(
page_no = buf_block_get_page_no(block); page_no = buf_block_get_page_no(block);
frame = buf_block_get_frame(block); frame = buf_block_get_frame(block);
buf_block_dbg_add_level(block, SYNC_TREE_NODE_NEW);
if (type & DICT_IBUF) { if (type & DICT_IBUF) {
/* It is an insert buffer tree: initialize the free list */ /* It is an insert buffer tree: initialize the free list */
buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE_NEW);
ut_ad(page_no == IBUF_TREE_ROOT_PAGE_NO); ut_ad(page_no == IBUF_TREE_ROOT_PAGE_NO);
...@@ -1361,6 +1362,8 @@ btr_create( ...@@ -1361,6 +1362,8 @@ btr_create(
} else { } else {
/* It is a non-ibuf tree: create a file segment for leaf /* It is a non-ibuf tree: create a file segment for leaf
pages */ pages */
buf_block_dbg_add_level(block, SYNC_TREE_NODE_NEW);
if (!fseg_create(space, page_no, if (!fseg_create(space, page_no,
PAGE_HEADER + PAGE_BTR_SEG_LEAF, mtr)) { PAGE_HEADER + PAGE_BTR_SEG_LEAF, mtr)) {
/* Not enough space for new segment, free root /* Not enough space for new segment, free root
...@@ -1432,7 +1435,8 @@ btr_free_but_not_root( ...@@ -1432,7 +1435,8 @@ btr_free_but_not_root(
leaf_loop: leaf_loop:
mtr_start(&mtr); mtr_start(&mtr);
root = btr_page_get(space, zip_size, root_page_no, RW_X_LATCH, &mtr); root = btr_page_get(space, zip_size, root_page_no, RW_X_LATCH,
NULL, &mtr);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_LEAF ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_LEAF
+ root, space)); + root, space));
...@@ -1454,7 +1458,8 @@ leaf_loop: ...@@ -1454,7 +1458,8 @@ leaf_loop:
top_loop: top_loop:
mtr_start(&mtr); mtr_start(&mtr);
root = btr_page_get(space, zip_size, root_page_no, RW_X_LATCH, &mtr); root = btr_page_get(space, zip_size, root_page_no, RW_X_LATCH,
NULL, &mtr);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_TOP ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_TOP
+ root, space)); + root, space));
...@@ -1480,13 +1485,13 @@ btr_free_root( ...@@ -1480,13 +1485,13 @@ btr_free_root(
ulint zip_size, /*!< in: compressed page size in bytes ulint zip_size, /*!< in: compressed page size in bytes
or 0 for uncompressed pages */ or 0 for uncompressed pages */
ulint root_page_no, /*!< in: root page number */ ulint root_page_no, /*!< in: root page number */
mtr_t* mtr) /*!< in: a mini-transaction which has already mtr_t* mtr) /*!< in/out: mini-transaction */
been started */
{ {
buf_block_t* block; buf_block_t* block;
fseg_header_t* header; fseg_header_t* header;
block = btr_block_get(space, zip_size, root_page_no, RW_X_LATCH, mtr); block = btr_block_get(space, zip_size, root_page_no, RW_X_LATCH,
NULL, mtr);
btr_search_drop_page_hash_index(block); btr_search_drop_page_hash_index(block);
...@@ -2365,9 +2370,8 @@ btr_attach_half_pages( ...@@ -2365,9 +2370,8 @@ btr_attach_half_pages(
/* Update page links of the level */ /* Update page links of the level */
if (prev_page_no != FIL_NULL) { if (prev_page_no != FIL_NULL) {
buf_block_t* prev_block = btr_block_get(space, zip_size, buf_block_t* prev_block = btr_block_get(
prev_page_no, space, zip_size, prev_page_no, RW_X_LATCH, index, mtr);
RW_X_LATCH, mtr);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(prev_block->frame) == page_is_comp(page)); ut_a(page_is_comp(prev_block->frame) == page_is_comp(page));
ut_a(btr_page_get_next(prev_block->frame, mtr) ut_a(btr_page_get_next(prev_block->frame, mtr)
...@@ -2380,9 +2384,8 @@ btr_attach_half_pages( ...@@ -2380,9 +2384,8 @@ btr_attach_half_pages(
} }
if (next_page_no != FIL_NULL) { if (next_page_no != FIL_NULL) {
buf_block_t* next_block = btr_block_get(space, zip_size, buf_block_t* next_block = btr_block_get(
next_page_no, space, zip_size, next_page_no, RW_X_LATCH, index, mtr);
RW_X_LATCH, mtr);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(next_block->frame) == page_is_comp(page)); ut_a(page_is_comp(next_block->frame) == page_is_comp(page));
ut_a(btr_page_get_prev(next_block->frame, mtr) ut_a(btr_page_get_prev(next_block->frame, mtr)
...@@ -2804,17 +2807,42 @@ func_exit: ...@@ -2804,17 +2807,42 @@ func_exit:
return(rec); return(rec);
} }
#ifdef UNIV_SYNC_DEBUG
/*************************************************************//**
Removes a page from the level list of pages.
@param space in: space where removed
@param zip_size in: compressed page size in bytes, or 0 for uncompressed
@param page in/out: page to remove
@param index in: index tree
@param mtr in/out: mini-transaction */
# define btr_level_list_remove(space,zip_size,page,index,mtr) \
btr_level_list_remove_func(space,zip_size,page,index,mtr)
#else /* UNIV_SYNC_DEBUG */
/*************************************************************//**
Removes a page from the level list of pages.
@param space in: space where removed
@param zip_size in: compressed page size in bytes, or 0 for uncompressed
@param page in/out: page to remove
@param index in: index tree
@param mtr in/out: mini-transaction */
# define btr_level_list_remove(space,zip_size,page,index,mtr) \
btr_level_list_remove_func(space,zip_size,page,mtr)
#endif /* UNIV_SYNC_DEBUG */
/*************************************************************//** /*************************************************************//**
Removes a page from the level list of pages. */ Removes a page from the level list of pages. */
static static __attribute__((nonnull))
void void
btr_level_list_remove( btr_level_list_remove_func(
/*==================*/ /*=======================*/
ulint space, /*!< in: space where removed */ ulint space, /*!< in: space where removed */
ulint zip_size,/*!< in: compressed page size in bytes ulint zip_size,/*!< in: compressed page size in bytes
or 0 for uncompressed pages */ or 0 for uncompressed pages */
page_t* page, /*!< in: page to remove */ page_t* page, /*!< in/out: page to remove */
mtr_t* mtr) /*!< in: mtr */ #ifdef UNIV_SYNC_DEBUG
const dict_index_t* index, /*!< in: index tree */
#endif /* UNIV_SYNC_DEBUG */
mtr_t* mtr) /*!< in/out: mini-transaction */
{ {
ulint prev_page_no; ulint prev_page_no;
ulint next_page_no; ulint next_page_no;
...@@ -2832,7 +2860,7 @@ btr_level_list_remove( ...@@ -2832,7 +2860,7 @@ btr_level_list_remove(
if (prev_page_no != FIL_NULL) { if (prev_page_no != FIL_NULL) {
buf_block_t* prev_block buf_block_t* prev_block
= btr_block_get(space, zip_size, prev_page_no, = btr_block_get(space, zip_size, prev_page_no,
RW_X_LATCH, mtr); RW_X_LATCH, index, mtr);
page_t* prev_page page_t* prev_page
= buf_block_get_frame(prev_block); = buf_block_get_frame(prev_block);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
...@@ -2849,7 +2877,7 @@ btr_level_list_remove( ...@@ -2849,7 +2877,7 @@ btr_level_list_remove(
if (next_page_no != FIL_NULL) { if (next_page_no != FIL_NULL) {
buf_block_t* next_block buf_block_t* next_block
= btr_block_get(space, zip_size, next_page_no, = btr_block_get(space, zip_size, next_page_no,
RW_X_LATCH, mtr); RW_X_LATCH, index, mtr);
page_t* next_page page_t* next_page
= buf_block_get_frame(next_block); = buf_block_get_frame(next_block);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
...@@ -3175,7 +3203,7 @@ btr_compress( ...@@ -3175,7 +3203,7 @@ btr_compress(
if (is_left) { if (is_left) {
merge_block = btr_block_get(space, zip_size, left_page_no, merge_block = btr_block_get(space, zip_size, left_page_no,
RW_X_LATCH, mtr); RW_X_LATCH, index, mtr);
merge_page = buf_block_get_frame(merge_block); merge_page = buf_block_get_frame(merge_block);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(btr_page_get_next(merge_page, mtr) ut_a(btr_page_get_next(merge_page, mtr)
...@@ -3184,7 +3212,7 @@ btr_compress( ...@@ -3184,7 +3212,7 @@ btr_compress(
} else if (right_page_no != FIL_NULL) { } else if (right_page_no != FIL_NULL) {
merge_block = btr_block_get(space, zip_size, right_page_no, merge_block = btr_block_get(space, zip_size, right_page_no,
RW_X_LATCH, mtr); RW_X_LATCH, index, mtr);
merge_page = buf_block_get_frame(merge_block); merge_page = buf_block_get_frame(merge_block);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(btr_page_get_prev(merge_page, mtr) ut_a(btr_page_get_prev(merge_page, mtr)
...@@ -3273,7 +3301,7 @@ err_exit: ...@@ -3273,7 +3301,7 @@ err_exit:
btr_search_drop_page_hash_index(block); btr_search_drop_page_hash_index(block);
/* Remove the page from the level list */ /* Remove the page from the level list */
btr_level_list_remove(space, zip_size, page, mtr); btr_level_list_remove(space, zip_size, page, index, mtr);
btr_node_ptr_delete(index, block, mtr); btr_node_ptr_delete(index, block, mtr);
lock_update_merge_left(merge_block, orig_pred, block); lock_update_merge_left(merge_block, orig_pred, block);
...@@ -3330,7 +3358,7 @@ err_exit: ...@@ -3330,7 +3358,7 @@ err_exit:
#endif /* UNIV_BTR_DEBUG */ #endif /* UNIV_BTR_DEBUG */
/* Remove the page from the level list */ /* Remove the page from the level list */
btr_level_list_remove(space, zip_size, page, mtr); btr_level_list_remove(space, zip_size, page, index, mtr);
/* Replace the address of the old child node (= page) with the /* Replace the address of the old child node (= page) with the
address of the merge page to the right */ address of the merge page to the right */
...@@ -3522,7 +3550,7 @@ btr_discard_page( ...@@ -3522,7 +3550,7 @@ btr_discard_page(
if (left_page_no != FIL_NULL) { if (left_page_no != FIL_NULL) {
merge_block = btr_block_get(space, zip_size, left_page_no, merge_block = btr_block_get(space, zip_size, left_page_no,
RW_X_LATCH, mtr); RW_X_LATCH, index, mtr);
merge_page = buf_block_get_frame(merge_block); merge_page = buf_block_get_frame(merge_block);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(btr_page_get_next(merge_page, mtr) ut_a(btr_page_get_next(merge_page, mtr)
...@@ -3530,7 +3558,7 @@ btr_discard_page( ...@@ -3530,7 +3558,7 @@ btr_discard_page(
#endif /* UNIV_BTR_DEBUG */ #endif /* UNIV_BTR_DEBUG */
} else if (right_page_no != FIL_NULL) { } else if (right_page_no != FIL_NULL) {
merge_block = btr_block_get(space, zip_size, right_page_no, merge_block = btr_block_get(space, zip_size, right_page_no,
RW_X_LATCH, mtr); RW_X_LATCH, index, mtr);
merge_page = buf_block_get_frame(merge_block); merge_page = buf_block_get_frame(merge_block);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(btr_page_get_prev(merge_page, mtr) ut_a(btr_page_get_prev(merge_page, mtr)
...@@ -3565,7 +3593,7 @@ btr_discard_page( ...@@ -3565,7 +3593,7 @@ btr_discard_page(
btr_node_ptr_delete(index, block, mtr); btr_node_ptr_delete(index, block, mtr);
/* Remove the page from the level list */ /* Remove the page from the level list */
btr_level_list_remove(space, zip_size, page, mtr); btr_level_list_remove(space, zip_size, page, index, mtr);
#ifdef UNIV_ZIP_DEBUG #ifdef UNIV_ZIP_DEBUG
{ {
page_zip_des_t* merge_page_zip page_zip_des_t* merge_page_zip
...@@ -4083,7 +4111,7 @@ loop: ...@@ -4083,7 +4111,7 @@ loop:
if (right_page_no != FIL_NULL) { if (right_page_no != FIL_NULL) {
const rec_t* right_rec; const rec_t* right_rec;
right_block = btr_block_get(space, zip_size, right_page_no, right_block = btr_block_get(space, zip_size, right_page_no,
RW_X_LATCH, &mtr); RW_X_LATCH, index, &mtr);
right_page = buf_block_get_frame(right_block); right_page = buf_block_get_frame(right_block);
if (UNIV_UNLIKELY(btr_page_get_prev(right_page, &mtr) if (UNIV_UNLIKELY(btr_page_get_prev(right_page, &mtr)
!= page_get_page_no(page))) { != page_get_page_no(page))) {
...@@ -4309,7 +4337,7 @@ node_ptr_fails: ...@@ -4309,7 +4337,7 @@ node_ptr_fails:
mtr_start(&mtr); mtr_start(&mtr);
block = btr_block_get(space, zip_size, right_page_no, block = btr_block_get(space, zip_size, right_page_no,
RW_X_LATCH, &mtr); RW_X_LATCH, index, &mtr);
page = buf_block_get_frame(block); page = buf_block_get_frame(block);
goto loop; goto loop;
......
...@@ -249,7 +249,8 @@ btr_cur_latch_leaves( ...@@ -249,7 +249,8 @@ btr_cur_latch_leaves(
case BTR_SEARCH_LEAF: case BTR_SEARCH_LEAF:
case BTR_MODIFY_LEAF: case BTR_MODIFY_LEAF:
mode = latch_mode == BTR_SEARCH_LEAF ? RW_S_LATCH : RW_X_LATCH; mode = latch_mode == BTR_SEARCH_LEAF ? RW_S_LATCH : RW_X_LATCH;
get_block = btr_block_get(space, zip_size, page_no, mode, mtr); get_block = btr_block_get(
space, zip_size, page_no, mode, cursor->index, mtr);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame) == page_is_comp(page)); ut_a(page_is_comp(get_block->frame) == page_is_comp(page));
#endif /* UNIV_BTR_DEBUG */ #endif /* UNIV_BTR_DEBUG */
...@@ -260,9 +261,9 @@ btr_cur_latch_leaves( ...@@ -260,9 +261,9 @@ btr_cur_latch_leaves(
left_page_no = btr_page_get_prev(page, mtr); left_page_no = btr_page_get_prev(page, mtr);
if (left_page_no != FIL_NULL) { if (left_page_no != FIL_NULL) {
get_block = btr_block_get(space, zip_size, get_block = btr_block_get(
left_page_no, space, zip_size, left_page_no,
RW_X_LATCH, mtr); RW_X_LATCH, cursor->index, mtr);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame) ut_a(page_is_comp(get_block->frame)
== page_is_comp(page)); == page_is_comp(page));
...@@ -272,8 +273,9 @@ btr_cur_latch_leaves( ...@@ -272,8 +273,9 @@ btr_cur_latch_leaves(
get_block->check_index_page_at_flush = TRUE; get_block->check_index_page_at_flush = TRUE;
} }
get_block = btr_block_get(space, zip_size, page_no, get_block = btr_block_get(
RW_X_LATCH, mtr); space, zip_size, page_no,
RW_X_LATCH, cursor->index, mtr);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame) == page_is_comp(page)); ut_a(page_is_comp(get_block->frame) == page_is_comp(page));
#endif /* UNIV_BTR_DEBUG */ #endif /* UNIV_BTR_DEBUG */
...@@ -282,9 +284,9 @@ btr_cur_latch_leaves( ...@@ -282,9 +284,9 @@ btr_cur_latch_leaves(
right_page_no = btr_page_get_next(page, mtr); right_page_no = btr_page_get_next(page, mtr);
if (right_page_no != FIL_NULL) { if (right_page_no != FIL_NULL) {
get_block = btr_block_get(space, zip_size, get_block = btr_block_get(
right_page_no, space, zip_size, right_page_no,
RW_X_LATCH, mtr); RW_X_LATCH, cursor->index, mtr);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame) ut_a(page_is_comp(get_block->frame)
== page_is_comp(page)); == page_is_comp(page));
...@@ -303,8 +305,9 @@ btr_cur_latch_leaves( ...@@ -303,8 +305,9 @@ btr_cur_latch_leaves(
left_page_no = btr_page_get_prev(page, mtr); left_page_no = btr_page_get_prev(page, mtr);
if (left_page_no != FIL_NULL) { if (left_page_no != FIL_NULL) {
get_block = btr_block_get(space, zip_size, get_block = btr_block_get(
left_page_no, mode, mtr); space, zip_size,
left_page_no, mode, cursor->index, mtr);
cursor->left_block = get_block; cursor->left_block = get_block;
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame) ut_a(page_is_comp(get_block->frame)
...@@ -315,7 +318,8 @@ btr_cur_latch_leaves( ...@@ -315,7 +318,8 @@ btr_cur_latch_leaves(
get_block->check_index_page_at_flush = TRUE; get_block->check_index_page_at_flush = TRUE;
} }
get_block = btr_block_get(space, zip_size, page_no, mode, mtr); get_block = btr_block_get(
space, zip_size, page_no, mode, cursor->index, mtr);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(get_block->frame) == page_is_comp(page)); ut_a(page_is_comp(get_block->frame) == page_is_comp(page));
#endif /* UNIV_BTR_DEBUG */ #endif /* UNIV_BTR_DEBUG */
...@@ -669,7 +673,9 @@ retry_page_get: ...@@ -669,7 +673,9 @@ retry_page_get:
ut_a(!page_zip || page_zip_validate(page_zip, page)); ut_a(!page_zip || page_zip_validate(page_zip, page));
#endif /* UNIV_ZIP_DEBUG */ #endif /* UNIV_ZIP_DEBUG */
buf_block_dbg_add_level(block, SYNC_TREE_NODE); buf_block_dbg_add_level(
block, dict_index_is_ibuf(index)
? SYNC_IBUF_TREE_NODE : SYNC_TREE_NODE);
} }
ut_ad(index->id == btr_page_get_index_id(page)); ut_ad(index->id == btr_page_get_index_id(page));
...@@ -767,7 +773,7 @@ retry_page_get: ...@@ -767,7 +773,7 @@ retry_page_get:
if (level != 0) { if (level != 0) {
/* x-latch the page */ /* x-latch the page */
page = btr_page_get( page = btr_page_get(
space, zip_size, page_no, RW_X_LATCH, mtr); space, zip_size, page_no, RW_X_LATCH, index, mtr);
ut_a((ibool)!!page_is_comp(page) ut_a((ibool)!!page_is_comp(page)
== dict_table_is_comp(index->table)); == dict_table_is_comp(index->table));
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved. Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -266,8 +266,10 @@ btr_pcur_restore_position_func( ...@@ -266,8 +266,10 @@ btr_pcur_restore_position_func(
file, line, mtr))) { file, line, mtr))) {
cursor->pos_state = BTR_PCUR_IS_POSITIONED; cursor->pos_state = BTR_PCUR_IS_POSITIONED;
buf_block_dbg_add_level(btr_pcur_get_block(cursor), buf_block_dbg_add_level(
SYNC_TREE_NODE); btr_pcur_get_block(cursor),
dict_index_is_ibuf(index)
? SYNC_IBUF_TREE_NODE : SYNC_TREE_NODE);
if (cursor->rel_pos == BTR_PCUR_ON) { if (cursor->rel_pos == BTR_PCUR_ON) {
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
...@@ -417,7 +419,8 @@ btr_pcur_move_to_next_page( ...@@ -417,7 +419,8 @@ btr_pcur_move_to_next_page(
ut_ad(next_page_no != FIL_NULL); ut_ad(next_page_no != FIL_NULL);
next_block = btr_block_get(space, zip_size, next_page_no, next_block = btr_block_get(space, zip_size, next_page_no,
cursor->latch_mode, mtr); cursor->latch_mode,
btr_pcur_get_btr_cur(cursor)->index, mtr);
next_page = buf_block_get_frame(next_block); next_page = buf_block_get_frame(next_block);
#ifdef UNIV_BTR_DEBUG #ifdef UNIV_BTR_DEBUG
ut_a(page_is_comp(next_page) == page_is_comp(page)); ut_a(page_is_comp(next_page) == page_is_comp(page));
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved. Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc. Copyright (c) 2008, Google Inc.
Portions of this file contain modifications contributed and copyrighted by Portions of this file contain modifications contributed and copyrighted by
...@@ -845,6 +845,7 @@ btr_search_guess_on_hash( ...@@ -845,6 +845,7 @@ btr_search_guess_on_hash(
btr_pcur_t pcur; btr_pcur_t pcur;
#endif #endif
ut_ad(index && info && tuple && cursor && mtr); ut_ad(index && info && tuple && cursor && mtr);
ut_ad(!dict_index_is_ibuf(index));
ut_ad((latch_mode == BTR_SEARCH_LEAF) ut_ad((latch_mode == BTR_SEARCH_LEAF)
|| (latch_mode == BTR_MODIFY_LEAF)); || (latch_mode == BTR_MODIFY_LEAF));
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved. Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -827,7 +827,7 @@ dict_truncate_index_tree( ...@@ -827,7 +827,7 @@ dict_truncate_index_tree(
appropriate field in the SYS_INDEXES record: this mini-transaction appropriate field in the SYS_INDEXES record: this mini-transaction
marks the B-tree totally truncated */ marks the B-tree totally truncated */
btr_block_get(space, zip_size, root_page_no, RW_X_LATCH, mtr); btr_block_get(space, zip_size, root_page_no, RW_X_LATCH, NULL, mtr);
btr_free_root(space, zip_size, root_page_no, mtr); btr_free_root(space, zip_size, root_page_no, mtr);
create: create:
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved. Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -1714,7 +1714,8 @@ undo_size_ok: ...@@ -1714,7 +1714,8 @@ undo_size_ok:
new_index->page = page_no; new_index->page = page_no;
rw_lock_create(index_tree_rw_lock_key, &new_index->lock, rw_lock_create(index_tree_rw_lock_key, &new_index->lock,
SYNC_INDEX_TREE); dict_index_is_ibuf(index)
? SYNC_IBUF_INDEX_TREE : SYNC_INDEX_TREE);
if (!UNIV_UNLIKELY(new_index->type & DICT_UNIVERSAL)) { if (!UNIV_UNLIKELY(new_index->type & DICT_UNIVERSAL)) {
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1997, 2010, Innobase Oy. All Rights Reserved. Copyright (c) 1997, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -402,7 +402,7 @@ ibuf_tree_root_get( ...@@ -402,7 +402,7 @@ ibuf_tree_root_get(
block = buf_page_get( block = buf_page_get(
IBUF_SPACE_ID, 0, FSP_IBUF_TREE_ROOT_PAGE_NO, RW_X_LATCH, mtr); IBUF_SPACE_ID, 0, FSP_IBUF_TREE_ROOT_PAGE_NO, RW_X_LATCH, mtr);
buf_block_dbg_add_level(block, SYNC_TREE_NODE); buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE_NEW);
root = buf_block_get_frame(block); root = buf_block_get_frame(block);
...@@ -549,7 +549,7 @@ ibuf_init_at_db_start(void) ...@@ -549,7 +549,7 @@ ibuf_init_at_db_start(void)
block = buf_page_get( block = buf_page_get(
IBUF_SPACE_ID, 0, FSP_IBUF_TREE_ROOT_PAGE_NO, IBUF_SPACE_ID, 0, FSP_IBUF_TREE_ROOT_PAGE_NO,
RW_X_LATCH, &mtr); RW_X_LATCH, &mtr);
buf_block_dbg_add_level(block, SYNC_TREE_NODE); buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE);
root = buf_block_get_frame(block); root = buf_block_get_frame(block);
} }
...@@ -2209,7 +2209,8 @@ ibuf_add_free_page(void) ...@@ -2209,7 +2209,8 @@ ibuf_add_free_page(void)
} else { } else {
buf_block_t* block = buf_page_get( buf_block_t* block = buf_page_get(
IBUF_SPACE_ID, 0, page_no, RW_X_LATCH, &mtr); IBUF_SPACE_ID, 0, page_no, RW_X_LATCH, &mtr);
buf_block_dbg_add_level(block, SYNC_TREE_NODE_NEW);
buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE_NEW);
page = buf_block_get_frame(block); page = buf_block_get_frame(block);
} }
...@@ -2332,8 +2333,7 @@ ibuf_remove_free_page(void) ...@@ -2332,8 +2333,7 @@ ibuf_remove_free_page(void)
block = buf_page_get( block = buf_page_get(
IBUF_SPACE_ID, 0, page_no, RW_X_LATCH, &mtr); IBUF_SPACE_ID, 0, page_no, RW_X_LATCH, &mtr);
buf_block_dbg_add_level(block, SYNC_TREE_NODE); buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE);
page = buf_block_get_frame(block); page = buf_block_get_frame(block);
} }
...@@ -3022,7 +3022,7 @@ ibuf_get_volume_buffered( ...@@ -3022,7 +3022,7 @@ ibuf_get_volume_buffered(
IBUF_SPACE_ID, 0, prev_page_no, RW_X_LATCH, IBUF_SPACE_ID, 0, prev_page_no, RW_X_LATCH,
mtr); mtr);
buf_block_dbg_add_level(block, SYNC_TREE_NODE); buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE);
prev_page = buf_block_get_frame(block); prev_page = buf_block_get_frame(block);
...@@ -3095,7 +3095,7 @@ count_later: ...@@ -3095,7 +3095,7 @@ count_later:
IBUF_SPACE_ID, 0, next_page_no, RW_X_LATCH, IBUF_SPACE_ID, 0, next_page_no, RW_X_LATCH,
mtr); mtr);
buf_block_dbg_add_level(block, SYNC_TREE_NODE); buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE);
next_page = buf_block_get_frame(block); next_page = buf_block_get_frame(block);
...@@ -3333,7 +3333,7 @@ ibuf_set_entry_counter( ...@@ -3333,7 +3333,7 @@ ibuf_set_entry_counter(
IBUF_SPACE_ID, 0, prev_page_no, IBUF_SPACE_ID, 0, prev_page_no,
RW_X_LATCH, mtr); RW_X_LATCH, mtr);
buf_block_dbg_add_level(block, SYNC_TREE_NODE); buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE);
prev_page = buf_block_get_frame(block); prev_page = buf_block_get_frame(block);
...@@ -4419,6 +4419,7 @@ ibuf_merge_or_delete_for_page( ...@@ -4419,6 +4419,7 @@ ibuf_merge_or_delete_for_page(
ut_ad(!block || buf_block_get_space(block) == space); ut_ad(!block || buf_block_get_space(block) == space);
ut_ad(!block || buf_block_get_page_no(block) == page_no); ut_ad(!block || buf_block_get_page_no(block) == page_no);
ut_ad(!block || buf_block_get_zip_size(block) == zip_size); ut_ad(!block || buf_block_get_zip_size(block) == zip_size);
ut_ad(!block || buf_block_get_io_fix(block) == BUF_IO_READ);
if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE
|| trx_sys_hdr_page(space, page_no)) { || trx_sys_hdr_page(space, page_no)) {
...@@ -4571,7 +4572,13 @@ loop: ...@@ -4571,7 +4572,13 @@ loop:
ut_a(success); ut_a(success);
buf_block_dbg_add_level(block, SYNC_TREE_NODE); /* This is a user page (secondary index leaf page),
but we pretend that it is a change buffer page in
order to obey the latching order. This should be OK,
because buffered changes are applied immediately while
the block is io-fixed. Other threads must not try to
latch an io-fixed block. */
buf_block_dbg_add_level(block, SYNC_IBUF_TREE_NODE);
} }
/* Position pcur in the insert buffer at the first entry for this /* Position pcur in the insert buffer at the first entry for this
...@@ -4675,7 +4682,12 @@ loop: ...@@ -4675,7 +4682,12 @@ loop:
__FILE__, __LINE__, &mtr); __FILE__, __LINE__, &mtr);
ut_a(success); ut_a(success);
buf_block_dbg_add_level(block, SYNC_TREE_NODE); /* This is a user page (secondary
index leaf page), but it should be OK
to use too low latching order for it,
as the block is io-fixed. */
buf_block_dbg_add_level(
block, SYNC_IBUF_TREE_NODE);
if (!ibuf_restore_pos(space, page_no, if (!ibuf_restore_pos(space, page_no,
search_tuple, search_tuple,
......
...@@ -199,26 +199,45 @@ btr_block_get_func( ...@@ -199,26 +199,45 @@ btr_block_get_func(
ulint mode, /*!< in: latch mode */ ulint mode, /*!< in: latch mode */
const char* file, /*!< in: file name */ const char* file, /*!< in: file name */
ulint line, /*!< in: line where called */ ulint line, /*!< in: line where called */
mtr_t* mtr) /*!< in/out: mtr */ # ifdef UNIV_SYNC_DEBUG
__attribute__((nonnull)); const dict_index_t* index, /*!< in: index tree, may be NULL
if it is not an insert buffer tree */
# endif /* UNIV_SYNC_DEBUG */
mtr_t* mtr); /*!< in/out: mini-transaction */
# ifdef UNIV_SYNC_DEBUG
/** Gets a buffer page and declares its latching order level.
@param space tablespace identifier
@param zip_size compressed page size in bytes or 0 for uncompressed pages
@param page_no page number
@param mode latch mode
@param index index tree, may be NULL if not the insert buffer tree
@param mtr mini-transaction handle
@return the block descriptor */
# define btr_block_get(space,zip_size,page_no,mode,index,mtr) \
btr_block_get_func(space,zip_size,page_no,mode, \
__FILE__,__LINE__,index,mtr)
# else /* UNIV_SYNC_DEBUG */
/** Gets a buffer page and declares its latching order level. /** Gets a buffer page and declares its latching order level.
@param space tablespace identifier @param space tablespace identifier
@param zip_size compressed page size in bytes or 0 for uncompressed pages @param zip_size compressed page size in bytes or 0 for uncompressed pages
@param page_no page number @param page_no page number
@param mode latch mode @param mode latch mode
@param idx index tree, may be NULL if not the insert buffer tree
@param mtr mini-transaction handle @param mtr mini-transaction handle
@return the block descriptor */ @return the block descriptor */
# define btr_block_get(space,zip_size,page_no,mode,mtr) \ # define btr_block_get(space,zip_size,page_no,mode,idx,mtr) \
btr_block_get_func(space,zip_size,page_no,mode,__FILE__,__LINE__,mtr) btr_block_get_func(space,zip_size,page_no,mode,__FILE__,__LINE__,mtr)
# endif /* UNIV_SYNC_DEBUG */
/** Gets a buffer page and declares its latching order level. /** Gets a buffer page and declares its latching order level.
@param space tablespace identifier @param space tablespace identifier
@param zip_size compressed page size in bytes or 0 for uncompressed pages @param zip_size compressed page size in bytes or 0 for uncompressed pages
@param page_no page number @param page_no page number
@param mode latch mode @param mode latch mode
@param idx index tree, may be NULL if not the insert buffer tree
@param mtr mini-transaction handle @param mtr mini-transaction handle
@return the uncompressed page frame */ @return the uncompressed page frame */
# define btr_page_get(space,zip_size,page_no,mode,mtr) \ # define btr_page_get(space,zip_size,page_no,mode,idx,mtr) \
buf_block_get_frame(btr_block_get(space,zip_size,page_no,mode,mtr)) buf_block_get_frame(btr_block_get(space,zip_size,page_no,mode,idx,mtr))
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
/**************************************************************//** /**************************************************************//**
Gets the index id field of a page. Gets the index id field of a page.
...@@ -344,8 +363,7 @@ btr_free_root( ...@@ -344,8 +363,7 @@ btr_free_root(
ulint zip_size, /*!< in: compressed page size in bytes ulint zip_size, /*!< in: compressed page size in bytes
or 0 for uncompressed pages */ or 0 for uncompressed pages */
ulint root_page_no, /*!< in: root page number */ ulint root_page_no, /*!< in: root page number */
mtr_t* mtr); /*!< in: a mini-transaction which has already mtr_t* mtr); /*!< in/out: mini-transaction */
been started */
/*************************************************************//** /*************************************************************//**
Makes tree one level higher by splitting the root, and inserts Makes tree one level higher by splitting the root, and inserts
the tuple. It is assumed that mtr contains an x-latch on the tree. the tuple. It is assumed that mtr contains an x-latch on the tree.
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1994, 2010, Innobase Oy. All Rights Reserved. Copyright (c) 1994, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -48,6 +48,10 @@ btr_block_get_func( ...@@ -48,6 +48,10 @@ btr_block_get_func(
ulint mode, /*!< in: latch mode */ ulint mode, /*!< in: latch mode */
const char* file, /*!< in: file name */ const char* file, /*!< in: file name */
ulint line, /*!< in: line where called */ ulint line, /*!< in: line where called */
#ifdef UNIV_SYNC_DEBUG
const dict_index_t* index, /*!< in: index tree, may be NULL
if it is not an insert buffer tree */
#endif /* UNIV_SYNC_DEBUG */
mtr_t* mtr) /*!< in/out: mtr */ mtr_t* mtr) /*!< in/out: mtr */
{ {
buf_block_t* block; buf_block_t* block;
...@@ -57,7 +61,9 @@ btr_block_get_func( ...@@ -57,7 +61,9 @@ btr_block_get_func(
if (mode != RW_NO_LATCH) { if (mode != RW_NO_LATCH) {
buf_block_dbg_add_level(block, SYNC_TREE_NODE); buf_block_dbg_add_level(
block, index != NULL && dict_index_is_ibuf(index)
? SYNC_IBUF_TREE_NODE : SYNC_TREE_NODE);
} }
return(block); return(block);
......
...@@ -638,10 +638,6 @@ or row lock! */ ...@@ -638,10 +638,6 @@ or row lock! */
#define SYNC_DICT_HEADER 995 #define SYNC_DICT_HEADER 995
#define SYNC_IBUF_HEADER 914 #define SYNC_IBUF_HEADER 914
#define SYNC_IBUF_PESS_INSERT_MUTEX 912 #define SYNC_IBUF_PESS_INSERT_MUTEX 912
#define SYNC_IBUF_MUTEX 910 /* ibuf mutex is really below
SYNC_FSP_PAGE: we assign a value this
high only to make the program to pass
the debug checks */
/*-------------------------------*/ /*-------------------------------*/
#define SYNC_INDEX_TREE 900 #define SYNC_INDEX_TREE 900
#define SYNC_TREE_NODE_NEW 892 #define SYNC_TREE_NODE_NEW 892
...@@ -657,8 +653,11 @@ or row lock! */ ...@@ -657,8 +653,11 @@ or row lock! */
#define SYNC_FSP 400 #define SYNC_FSP 400
#define SYNC_FSP_PAGE 395 #define SYNC_FSP_PAGE 395
/*------------------------------------- Insert buffer headers */ /*------------------------------------- Insert buffer headers */
/*------------------------------------- ibuf_mutex */ #define SYNC_IBUF_MUTEX 370 /* ibuf_mutex */
/*------------------------------------- Insert buffer tree */ /*------------------------------------- Insert buffer tree */
#define SYNC_IBUF_INDEX_TREE 360
#define SYNC_IBUF_TREE_NODE_NEW 359
#define SYNC_IBUF_TREE_NODE 358
#define SYNC_IBUF_BITMAP_MUTEX 351 #define SYNC_IBUF_BITMAP_MUTEX 351
#define SYNC_IBUF_BITMAP 350 #define SYNC_IBUF_BITMAP 350
/*------------------------------------- MySQL query cache mutex */ /*------------------------------------- MySQL query cache mutex */
......
...@@ -1232,6 +1232,7 @@ sync_thread_add_level( ...@@ -1232,6 +1232,7 @@ sync_thread_add_level(
case SYNC_DICT_HEADER: case SYNC_DICT_HEADER:
case SYNC_TRX_I_S_RWLOCK: case SYNC_TRX_I_S_RWLOCK:
case SYNC_TRX_I_S_LAST_READ: case SYNC_TRX_I_S_LAST_READ:
case SYNC_IBUF_MUTEX:
if (!sync_thread_levels_g(array, level, TRUE)) { if (!sync_thread_levels_g(array, level, TRUE)) {
fprintf(stderr, fprintf(stderr,
"InnoDB: sync_thread_levels_g(array, %lu)" "InnoDB: sync_thread_levels_g(array, %lu)"
...@@ -1317,22 +1318,28 @@ sync_thread_add_level( ...@@ -1317,22 +1318,28 @@ sync_thread_add_level(
|| sync_thread_levels_g(array, SYNC_TREE_NODE - 1, TRUE)); || sync_thread_levels_g(array, SYNC_TREE_NODE - 1, TRUE));
break; break;
case SYNC_TREE_NODE_NEW: case SYNC_TREE_NODE_NEW:
ut_a(sync_thread_levels_contain(array, SYNC_FSP_PAGE) ut_a(sync_thread_levels_contain(array, SYNC_FSP_PAGE));
|| sync_thread_levels_contain(array, SYNC_IBUF_MUTEX));
break; break;
case SYNC_INDEX_TREE: case SYNC_INDEX_TREE:
if (sync_thread_levels_contain(array, SYNC_IBUF_MUTEX) ut_a(sync_thread_levels_g(array, SYNC_TREE_NODE - 1, TRUE));
&& sync_thread_levels_contain(array, SYNC_FSP)) { break;
ut_a(sync_thread_levels_g(array, SYNC_FSP_PAGE - 1, case SYNC_IBUF_TREE_NODE:
TRUE)); ut_a(sync_thread_levels_contain(array, SYNC_IBUF_INDEX_TREE)
|| sync_thread_levels_g(array, SYNC_IBUF_TREE_NODE - 1,
TRUE));
break;
case SYNC_IBUF_TREE_NODE_NEW:
ut_a(sync_thread_levels_contain(array, SYNC_IBUF_MUTEX));
break;
case SYNC_IBUF_INDEX_TREE:
if (sync_thread_levels_contain(array, SYNC_FSP)) {
ut_a(sync_thread_levels_g(
array, SYNC_FSP_PAGE - 1, TRUE));
} else { } else {
ut_a(sync_thread_levels_g(array, SYNC_TREE_NODE - 1, ut_a(sync_thread_levels_g(
TRUE)); array, SYNC_IBUF_TREE_NODE - 1, TRUE));
} }
break; break;
case SYNC_IBUF_MUTEX:
ut_a(sync_thread_levels_g(array, SYNC_FSP_PAGE - 1, TRUE));
break;
case SYNC_IBUF_PESS_INSERT_MUTEX: case SYNC_IBUF_PESS_INSERT_MUTEX:
ut_a(sync_thread_levels_g(array, SYNC_FSP - 1, TRUE)); ut_a(sync_thread_levels_g(array, SYNC_FSP - 1, TRUE));
ut_a(!sync_thread_levels_contain(array, SYNC_IBUF_MUTEX)); ut_a(!sync_thread_levels_contain(array, SYNC_IBUF_MUTEX));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment