Merge mysql-5.1 to mysql-5.5. Add a test case.
This commit is contained in:
commit
065f18630f
18
mysql-test/suite/innodb/r/innodb_bug59733.result
Normal file
18
mysql-test/suite/innodb/r/innodb_bug59733.result
Normal file
@ -0,0 +1,18 @@
|
||||
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;
|
53
mysql-test/suite/innodb/t/innodb_bug59733.test
Normal file
53
mysql-test/suite/innodb/t/innodb_bug59733.test
Normal file
@ -0,0 +1,53 @@
|
||||
#
|
||||
# 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(
|
||||
zip_size = dict_table_zip_size(index->table);
|
||||
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))
|
||||
== dict_table_is_comp(index->table));
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
@ -891,7 +892,7 @@ btr_page_alloc_for_ibuf(
|
||||
dict_table_zip_size(index->table),
|
||||
node_addr.page, RW_X_LATCH, mtr);
|
||||
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,
|
||||
new_page + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE,
|
||||
@ -1139,7 +1140,7 @@ btr_node_ptr_get_child(
|
||||
page_no = btr_node_ptr_get_child_page_no(node_ptr, offsets);
|
||||
|
||||
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(
|
||||
space, 0,
|
||||
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)
|
||||
== IBUF_HEADER_PAGE_NO);
|
||||
@ -1350,10 +1352,9 @@ btr_create(
|
||||
page_no = buf_block_get_page_no(block);
|
||||
frame = buf_block_get_frame(block);
|
||||
|
||||
buf_block_dbg_add_level(block, SYNC_TREE_NODE_NEW);
|
||||
|
||||
if (type & DICT_IBUF) {
|
||||
/* 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);
|
||||
|
||||
@ -1361,6 +1362,8 @@ btr_create(
|
||||
} else {
|
||||
/* It is a non-ibuf tree: create a file segment for leaf
|
||||
pages */
|
||||
buf_block_dbg_add_level(block, SYNC_TREE_NODE_NEW);
|
||||
|
||||
if (!fseg_create(space, page_no,
|
||||
PAGE_HEADER + PAGE_BTR_SEG_LEAF, mtr)) {
|
||||
/* Not enough space for new segment, free root
|
||||
@ -1432,7 +1435,8 @@ btr_free_but_not_root(
|
||||
leaf_loop:
|
||||
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
|
||||
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_LEAF
|
||||
+ root, space));
|
||||
@ -1454,7 +1458,8 @@ leaf_loop:
|
||||
top_loop:
|
||||
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
|
||||
ut_a(btr_root_fseg_validate(FIL_PAGE_DATA + PAGE_BTR_SEG_TOP
|
||||
+ root, space));
|
||||
@ -1480,13 +1485,13 @@ btr_free_root(
|
||||
ulint zip_size, /*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint root_page_no, /*!< in: root page number */
|
||||
mtr_t* mtr) /*!< in: a mini-transaction which has already
|
||||
been started */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
{
|
||||
buf_block_t* block;
|
||||
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);
|
||||
|
||||
@ -2365,9 +2370,8 @@ btr_attach_half_pages(
|
||||
/* Update page links of the level */
|
||||
|
||||
if (prev_page_no != FIL_NULL) {
|
||||
buf_block_t* prev_block = btr_block_get(space, zip_size,
|
||||
prev_page_no,
|
||||
RW_X_LATCH, mtr);
|
||||
buf_block_t* prev_block = btr_block_get(
|
||||
space, zip_size, prev_page_no, RW_X_LATCH, index, mtr);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(page_is_comp(prev_block->frame) == page_is_comp(page));
|
||||
ut_a(btr_page_get_next(prev_block->frame, mtr)
|
||||
@ -2380,9 +2384,8 @@ btr_attach_half_pages(
|
||||
}
|
||||
|
||||
if (next_page_no != FIL_NULL) {
|
||||
buf_block_t* next_block = btr_block_get(space, zip_size,
|
||||
next_page_no,
|
||||
RW_X_LATCH, mtr);
|
||||
buf_block_t* next_block = btr_block_get(
|
||||
space, zip_size, next_page_no, RW_X_LATCH, index, mtr);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(page_is_comp(next_block->frame) == page_is_comp(page));
|
||||
ut_a(btr_page_get_prev(next_block->frame, mtr)
|
||||
@ -2804,17 +2807,42 @@ func_exit:
|
||||
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. */
|
||||
static
|
||||
static __attribute__((nonnull))
|
||||
void
|
||||
btr_level_list_remove(
|
||||
/*==================*/
|
||||
ulint space, /*!< in: space where removed */
|
||||
ulint zip_size,/*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
page_t* page, /*!< in: page to remove */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
btr_level_list_remove_func(
|
||||
/*=======================*/
|
||||
ulint space, /*!< in: space where removed */
|
||||
ulint zip_size,/*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
page_t* page, /*!< in/out: page to remove */
|
||||
#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 next_page_no;
|
||||
@ -2832,7 +2860,7 @@ btr_level_list_remove(
|
||||
if (prev_page_no != FIL_NULL) {
|
||||
buf_block_t* prev_block
|
||||
= btr_block_get(space, zip_size, prev_page_no,
|
||||
RW_X_LATCH, mtr);
|
||||
RW_X_LATCH, index, mtr);
|
||||
page_t* prev_page
|
||||
= buf_block_get_frame(prev_block);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
@ -2849,7 +2877,7 @@ btr_level_list_remove(
|
||||
if (next_page_no != FIL_NULL) {
|
||||
buf_block_t* next_block
|
||||
= btr_block_get(space, zip_size, next_page_no,
|
||||
RW_X_LATCH, mtr);
|
||||
RW_X_LATCH, index, mtr);
|
||||
page_t* next_page
|
||||
= buf_block_get_frame(next_block);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
@ -3175,7 +3203,7 @@ btr_compress(
|
||||
if (is_left) {
|
||||
|
||||
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);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(btr_page_get_next(merge_page, mtr)
|
||||
@ -3184,7 +3212,7 @@ btr_compress(
|
||||
} else if (right_page_no != FIL_NULL) {
|
||||
|
||||
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);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(btr_page_get_prev(merge_page, mtr)
|
||||
@ -3273,7 +3301,7 @@ err_exit:
|
||||
btr_search_drop_page_hash_index(block);
|
||||
|
||||
/* 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);
|
||||
lock_update_merge_left(merge_block, orig_pred, block);
|
||||
@ -3330,7 +3358,7 @@ err_exit:
|
||||
#endif /* UNIV_BTR_DEBUG */
|
||||
|
||||
/* 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
|
||||
address of the merge page to the right */
|
||||
@ -3522,7 +3550,7 @@ btr_discard_page(
|
||||
|
||||
if (left_page_no != FIL_NULL) {
|
||||
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);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(btr_page_get_next(merge_page, mtr)
|
||||
@ -3530,7 +3558,7 @@ btr_discard_page(
|
||||
#endif /* UNIV_BTR_DEBUG */
|
||||
} else if (right_page_no != FIL_NULL) {
|
||||
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);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(btr_page_get_prev(merge_page, mtr)
|
||||
@ -3565,7 +3593,7 @@ btr_discard_page(
|
||||
btr_node_ptr_delete(index, block, mtr);
|
||||
|
||||
/* 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
|
||||
{
|
||||
page_zip_des_t* merge_page_zip
|
||||
@ -4083,7 +4111,7 @@ loop:
|
||||
if (right_page_no != FIL_NULL) {
|
||||
const rec_t* right_rec;
|
||||
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);
|
||||
if (UNIV_UNLIKELY(btr_page_get_prev(right_page, &mtr)
|
||||
!= page_get_page_no(page))) {
|
||||
@ -4309,7 +4337,7 @@ node_ptr_fails:
|
||||
mtr_start(&mtr);
|
||||
|
||||
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);
|
||||
|
||||
goto loop;
|
||||
|
@ -249,7 +249,8 @@ btr_cur_latch_leaves(
|
||||
case BTR_SEARCH_LEAF:
|
||||
case BTR_MODIFY_LEAF:
|
||||
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
|
||||
ut_a(page_is_comp(get_block->frame) == page_is_comp(page));
|
||||
#endif /* UNIV_BTR_DEBUG */
|
||||
@ -260,9 +261,9 @@ btr_cur_latch_leaves(
|
||||
left_page_no = btr_page_get_prev(page, mtr);
|
||||
|
||||
if (left_page_no != FIL_NULL) {
|
||||
get_block = btr_block_get(space, zip_size,
|
||||
left_page_no,
|
||||
RW_X_LATCH, mtr);
|
||||
get_block = btr_block_get(
|
||||
space, zip_size, left_page_no,
|
||||
RW_X_LATCH, cursor->index, mtr);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(page_is_comp(get_block->frame)
|
||||
== page_is_comp(page));
|
||||
@ -272,8 +273,9 @@ btr_cur_latch_leaves(
|
||||
get_block->check_index_page_at_flush = TRUE;
|
||||
}
|
||||
|
||||
get_block = btr_block_get(space, zip_size, page_no,
|
||||
RW_X_LATCH, mtr);
|
||||
get_block = btr_block_get(
|
||||
space, zip_size, page_no,
|
||||
RW_X_LATCH, cursor->index, mtr);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(page_is_comp(get_block->frame) == page_is_comp(page));
|
||||
#endif /* UNIV_BTR_DEBUG */
|
||||
@ -282,9 +284,9 @@ btr_cur_latch_leaves(
|
||||
right_page_no = btr_page_get_next(page, mtr);
|
||||
|
||||
if (right_page_no != FIL_NULL) {
|
||||
get_block = btr_block_get(space, zip_size,
|
||||
right_page_no,
|
||||
RW_X_LATCH, mtr);
|
||||
get_block = btr_block_get(
|
||||
space, zip_size, right_page_no,
|
||||
RW_X_LATCH, cursor->index, mtr);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(page_is_comp(get_block->frame)
|
||||
== page_is_comp(page));
|
||||
@ -303,8 +305,9 @@ btr_cur_latch_leaves(
|
||||
left_page_no = btr_page_get_prev(page, mtr);
|
||||
|
||||
if (left_page_no != FIL_NULL) {
|
||||
get_block = btr_block_get(space, zip_size,
|
||||
left_page_no, mode, mtr);
|
||||
get_block = btr_block_get(
|
||||
space, zip_size,
|
||||
left_page_no, mode, cursor->index, mtr);
|
||||
cursor->left_block = get_block;
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(page_is_comp(get_block->frame)
|
||||
@ -315,7 +318,8 @@ btr_cur_latch_leaves(
|
||||
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
|
||||
ut_a(page_is_comp(get_block->frame) == page_is_comp(page));
|
||||
#endif /* UNIV_BTR_DEBUG */
|
||||
@ -669,7 +673,9 @@ retry_page_get:
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
#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));
|
||||
@ -767,7 +773,7 @@ retry_page_get:
|
||||
if (level != 0) {
|
||||
/* x-latch the page */
|
||||
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)
|
||||
== dict_table_is_comp(index->table));
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*****************************************************************************
|
||||
|
||||
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
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -266,8 +266,10 @@ btr_pcur_restore_position_func(
|
||||
file, line, mtr))) {
|
||||
cursor->pos_state = BTR_PCUR_IS_POSITIONED;
|
||||
|
||||
buf_block_dbg_add_level(btr_pcur_get_block(cursor),
|
||||
SYNC_TREE_NODE);
|
||||
buf_block_dbg_add_level(
|
||||
btr_pcur_get_block(cursor),
|
||||
dict_index_is_ibuf(index)
|
||||
? SYNC_IBUF_TREE_NODE : SYNC_TREE_NODE);
|
||||
|
||||
if (cursor->rel_pos == BTR_PCUR_ON) {
|
||||
#ifdef UNIV_DEBUG
|
||||
@ -417,7 +419,8 @@ btr_pcur_move_to_next_page(
|
||||
ut_ad(next_page_no != FIL_NULL);
|
||||
|
||||
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);
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
ut_a(page_is_comp(next_page) == page_is_comp(page));
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*****************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
@ -845,6 +845,7 @@ btr_search_guess_on_hash(
|
||||
btr_pcur_t pcur;
|
||||
#endif
|
||||
ut_ad(index && info && tuple && cursor && mtr);
|
||||
ut_ad(!dict_index_is_ibuf(index));
|
||||
ut_ad((latch_mode == BTR_SEARCH_LEAF)
|
||||
|| (latch_mode == BTR_MODIFY_LEAF));
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*****************************************************************************
|
||||
|
||||
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
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -827,7 +827,7 @@ dict_truncate_index_tree(
|
||||
appropriate field in the SYS_INDEXES record: this mini-transaction
|
||||
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);
|
||||
create:
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*****************************************************************************
|
||||
|
||||
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
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -1714,7 +1714,8 @@ undo_size_ok:
|
||||
|
||||
new_index->page = page_no;
|
||||
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)) {
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*****************************************************************************
|
||||
|
||||
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
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -402,7 +402,7 @@ ibuf_tree_root_get(
|
||||
block = buf_page_get(
|
||||
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);
|
||||
|
||||
@ -549,7 +549,7 @@ ibuf_init_at_db_start(void)
|
||||
block = buf_page_get(
|
||||
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);
|
||||
|
||||
root = buf_block_get_frame(block);
|
||||
}
|
||||
@ -2209,7 +2209,8 @@ ibuf_add_free_page(void)
|
||||
} else {
|
||||
buf_block_t* block = buf_page_get(
|
||||
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);
|
||||
}
|
||||
@ -2332,8 +2333,7 @@ ibuf_remove_free_page(void)
|
||||
block = buf_page_get(
|
||||
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);
|
||||
}
|
||||
@ -3022,7 +3022,7 @@ ibuf_get_volume_buffered(
|
||||
IBUF_SPACE_ID, 0, prev_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);
|
||||
|
||||
|
||||
prev_page = buf_block_get_frame(block);
|
||||
@ -3095,7 +3095,7 @@ count_later:
|
||||
IBUF_SPACE_ID, 0, next_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);
|
||||
|
||||
|
||||
next_page = buf_block_get_frame(block);
|
||||
@ -3333,7 +3333,7 @@ ibuf_set_entry_counter(
|
||||
IBUF_SPACE_ID, 0, prev_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);
|
||||
|
||||
prev_page = buf_block_get_frame(block);
|
||||
|
||||
@ -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_page_no(block) == page_no);
|
||||
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
|
||||
|| trx_sys_hdr_page(space, page_no)) {
|
||||
@ -4571,7 +4572,13 @@ loop:
|
||||
|
||||
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
|
||||
@ -4675,7 +4682,12 @@ loop:
|
||||
__FILE__, __LINE__, &mtr);
|
||||
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,
|
||||
search_tuple,
|
||||
|
@ -199,26 +199,45 @@ btr_block_get_func(
|
||||
ulint mode, /*!< in: latch mode */
|
||||
const char* file, /*!< in: file name */
|
||||
ulint line, /*!< in: line where called */
|
||||
mtr_t* mtr) /*!< in/out: mtr */
|
||||
__attribute__((nonnull));
|
||||
# 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: 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,mtr) \
|
||||
btr_block_get_func(space,zip_size,page_no,mode,__FILE__,__LINE__,mtr)
|
||||
# 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.
|
||||
@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 idx 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,idx,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.
|
||||
@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 idx index tree, may be NULL if not the insert buffer tree
|
||||
@param mtr mini-transaction handle
|
||||
@return the uncompressed page frame */
|
||||
# define btr_page_get(space,zip_size,page_no,mode,mtr) \
|
||||
buf_block_get_frame(btr_block_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,idx,mtr))
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
/**************************************************************//**
|
||||
Gets the index id field of a page.
|
||||
@ -344,8 +363,7 @@ btr_free_root(
|
||||
ulint zip_size, /*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint root_page_no, /*!< in: root page number */
|
||||
mtr_t* mtr); /*!< in: a mini-transaction which has already
|
||||
been started */
|
||||
mtr_t* mtr); /*!< in/out: mini-transaction */
|
||||
/*************************************************************//**
|
||||
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.
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*****************************************************************************
|
||||
|
||||
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
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -48,6 +48,10 @@ btr_block_get_func(
|
||||
ulint mode, /*!< in: latch mode */
|
||||
const char* file, /*!< in: file name */
|
||||
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 */
|
||||
{
|
||||
buf_block_t* block;
|
||||
@ -57,7 +61,9 @@ btr_block_get_func(
|
||||
|
||||
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);
|
||||
|
@ -638,10 +638,6 @@ or row lock! */
|
||||
#define SYNC_DICT_HEADER 995
|
||||
#define SYNC_IBUF_HEADER 914
|
||||
#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_TREE_NODE_NEW 892
|
||||
@ -657,8 +653,11 @@ or row lock! */
|
||||
#define SYNC_FSP 400
|
||||
#define SYNC_FSP_PAGE 395
|
||||
/*------------------------------------- Insert buffer headers */
|
||||
/*------------------------------------- ibuf_mutex */
|
||||
#define SYNC_IBUF_MUTEX 370 /* ibuf_mutex */
|
||||
/*------------------------------------- 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 350
|
||||
/*------------------------------------- MySQL query cache mutex */
|
||||
|
@ -1232,6 +1232,7 @@ sync_thread_add_level(
|
||||
case SYNC_DICT_HEADER:
|
||||
case SYNC_TRX_I_S_RWLOCK:
|
||||
case SYNC_TRX_I_S_LAST_READ:
|
||||
case SYNC_IBUF_MUTEX:
|
||||
if (!sync_thread_levels_g(array, level, TRUE)) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: sync_thread_levels_g(array, %lu)"
|
||||
@ -1317,21 +1318,27 @@ sync_thread_add_level(
|
||||
|| sync_thread_levels_g(array, SYNC_TREE_NODE - 1, TRUE));
|
||||
break;
|
||||
case SYNC_TREE_NODE_NEW:
|
||||
ut_a(sync_thread_levels_contain(array, SYNC_FSP_PAGE)
|
||||
|| sync_thread_levels_contain(array, SYNC_IBUF_MUTEX));
|
||||
ut_a(sync_thread_levels_contain(array, SYNC_FSP_PAGE));
|
||||
break;
|
||||
case SYNC_INDEX_TREE:
|
||||
if (sync_thread_levels_contain(array, SYNC_IBUF_MUTEX)
|
||||
&& sync_thread_levels_contain(array, SYNC_FSP)) {
|
||||
ut_a(sync_thread_levels_g(array, SYNC_FSP_PAGE - 1,
|
||||
TRUE));
|
||||
} else {
|
||||
ut_a(sync_thread_levels_g(array, SYNC_TREE_NODE - 1,
|
||||
TRUE));
|
||||
}
|
||||
ut_a(sync_thread_levels_g(array, SYNC_TREE_NODE - 1, TRUE));
|
||||
break;
|
||||
case SYNC_IBUF_MUTEX:
|
||||
ut_a(sync_thread_levels_g(array, SYNC_FSP_PAGE - 1, TRUE));
|
||||
case SYNC_IBUF_TREE_NODE:
|
||||
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 {
|
||||
ut_a(sync_thread_levels_g(
|
||||
array, SYNC_IBUF_TREE_NODE - 1, TRUE));
|
||||
}
|
||||
break;
|
||||
case SYNC_IBUF_PESS_INSERT_MUTEX:
|
||||
ut_a(sync_thread_levels_g(array, SYNC_FSP - 1, TRUE));
|
||||
|
Loading…
x
Reference in New Issue
Block a user