diff options
Diffstat (limited to 'storage/innobase/ibuf/ibuf0ibuf.cc')
-rw-r--r-- | storage/innobase/ibuf/ibuf0ibuf.cc | 124 |
1 files changed, 60 insertions, 64 deletions
diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index a7f623a21ff..93e40aa732a 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -25,7 +25,6 @@ Created 7/19/1997 Heikki Tuuri *******************************************************/ #include "ibuf0ibuf.h" -#include "sync0sync.h" #include "btr0sea.h" /** Number of bits describing a single page */ @@ -234,14 +233,15 @@ type, counter, and some flags. */ format or later */ -/** The mutex used to block pessimistic inserts to ibuf trees */ -static ib_mutex_t ibuf_pessimistic_insert_mutex; - -/** The mutex protecting the insert buffer structs */ -static ib_mutex_t ibuf_mutex; - -/** The mutex protecting the insert buffer bitmaps */ -static ib_mutex_t ibuf_bitmap_mutex; +#ifndef SAFE_MUTEX +static +#endif /* SAFE_MUTEX */ +/** The mutex protecting the insert buffer */ +mysql_mutex_t ibuf_mutex, + /** The mutex covering pessimistic inserts into the change buffer */ + ibuf_pessimistic_insert_mutex, + /** mutex covering all change buffer bitmap pages */ + ibuf_bitmap_mutex; /** The area in pages from which contract looks for page numbers for merge */ const ulint IBUF_MERGE_AREA = 8; @@ -332,7 +332,7 @@ static buf_block_t *ibuf_tree_root_get(mtr_t *mtr) buf_block_t* block; ut_ad(ibuf_inside(mtr)); - ut_ad(mutex_own(&ibuf_mutex)); + mysql_mutex_assert_owner(&ibuf_mutex); mtr_sx_lock_index(ibuf.index, mtr); @@ -358,11 +358,9 @@ ibuf_close(void) return; } - mutex_free(&ibuf_pessimistic_insert_mutex); - - mutex_free(&ibuf_mutex); - - mutex_free(&ibuf_bitmap_mutex); + mysql_mutex_destroy(&ibuf_pessimistic_insert_mutex); + mysql_mutex_destroy(&ibuf_mutex); + mysql_mutex_destroy(&ibuf_bitmap_mutex); dict_table_t* ibuf_table = ibuf.index->table; ibuf.index->lock.free(); @@ -380,7 +378,7 @@ ibuf_size_update( /*=============*/ const page_t* root) /*!< in: ibuf tree root */ { - ut_ad(mutex_own(&ibuf_mutex)); + mysql_mutex_assert_owner(&ibuf_mutex); ibuf.free_list_len = flst_get_len(root + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST); @@ -425,14 +423,12 @@ ibuf_init_at_db_start(void) ibuf.max_size = ((buf_pool_get_curr_size() >> srv_page_size_shift) * CHANGE_BUFFER_DEFAULT_SIZE) / 100; - mutex_create(LATCH_ID_IBUF, &ibuf_mutex); - - mutex_create(LATCH_ID_IBUF_BITMAP, &ibuf_bitmap_mutex); - - mutex_create(LATCH_ID_IBUF_PESSIMISTIC_INSERT, - &ibuf_pessimistic_insert_mutex); + mysql_mutex_init(ibuf_mutex_key, &ibuf_mutex, nullptr); + mysql_mutex_init(ibuf_bitmap_mutex_key, &ibuf_bitmap_mutex, nullptr); + mysql_mutex_init(ibuf_pessimistic_insert_mutex_key, + &ibuf_pessimistic_insert_mutex, nullptr); - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_mutex); fseg_n_reserved_pages(*header_page, IBUF_HEADER + IBUF_TREE_SEG_HEADER @@ -453,7 +449,7 @@ ibuf_init_at_db_start(void) } ibuf_size_update(root); - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); ibuf.empty = page_is_empty(root); mtr.commit(); @@ -503,9 +499,9 @@ ibuf_max_size_update( { ulint new_size = ((buf_pool_get_curr_size() >> srv_page_size_shift) * new_val) / 100; - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_mutex); ibuf.max_size = new_size; - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); } # ifdef UNIV_DEBUG @@ -876,7 +872,7 @@ ibuf_update_free_bits_for_two_pages_low( the bitmap mutex to prevent a deadlock with a similar operation performed by another OS thread. */ - mutex_enter(&ibuf_bitmap_mutex); + mysql_mutex_lock(&ibuf_bitmap_mutex); state = ibuf_index_page_calc_free(block1); @@ -886,7 +882,7 @@ ibuf_update_free_bits_for_two_pages_low( ibuf_set_free_bits_low(block2, state, mtr); - mutex_exit(&ibuf_bitmap_mutex); + mysql_mutex_unlock(&ibuf_bitmap_mutex); } /** Returns TRUE if the page is one of the fixed address ibuf pages. @@ -1753,7 +1749,7 @@ dare to start a pessimistic insert to the insert buffer. @return whether enough free pages in list */ static inline bool ibuf_data_enough_free_for_insert() { - ut_ad(mutex_own(&ibuf_mutex)); + mysql_mutex_assert_owner(&ibuf_mutex); /* We want a big margin of free pages, because a B-tree can sometimes grow in size also if records are deleted from it, as the node pointers @@ -1773,7 +1769,7 @@ ibool ibuf_data_too_much_free(void) /*=========================*/ { - ut_ad(mutex_own(&ibuf_mutex)); + mysql_mutex_assert_owner(&ibuf_mutex); return(ibuf.free_list_len >= 3 + (ibuf.size / 2) + 3 * ibuf.height); } @@ -1814,7 +1810,7 @@ static bool ibuf_add_free_page() ut_ad(block->lock.not_recursive()); ibuf_enter(&mtr); - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_mutex); mtr.write<2>(*block, block->frame + FIL_PAGE_TYPE, FIL_PAGE_IBUF_FREE_LIST); @@ -1834,7 +1830,7 @@ static bool ibuf_add_free_page() const page_id_t page_id(block->page.id()); buf_block_t* bitmap_page = ibuf_bitmap_get_map_page(page_id, 0, &mtr); - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); ibuf_bitmap_page_set_bits<IBUF_BITMAP_IBUF>(bitmap_page, page_id, srv_page_size, true, @@ -1867,13 +1863,13 @@ ibuf_remove_free_page(void) /* Prevent pessimistic inserts to insert buffer trees for a while */ ibuf_enter(&mtr); - mutex_enter(&ibuf_pessimistic_insert_mutex); - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_pessimistic_insert_mutex); + mysql_mutex_lock(&ibuf_mutex); if (!ibuf_data_too_much_free()) { - mutex_exit(&ibuf_mutex); - mutex_exit(&ibuf_pessimistic_insert_mutex); + mysql_mutex_unlock(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_pessimistic_insert_mutex); ibuf_mtr_commit(&mtr); @@ -1884,7 +1880,7 @@ ibuf_remove_free_page(void) buf_block_t* root = ibuf_tree_root_get(&mtr2); - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); uint32_t page_no = flst_get_last(PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST + root->frame).page; @@ -1910,7 +1906,7 @@ ibuf_remove_free_page(void) ibuf_enter(&mtr); - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_mutex); root = ibuf_tree_root_get(&mtr); @@ -1924,7 +1920,7 @@ ibuf_remove_free_page(void) flst_remove(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, &mtr); - mutex_exit(&ibuf_pessimistic_insert_mutex); + mysql_mutex_unlock(&ibuf_pessimistic_insert_mutex); ibuf.seg_size--; ibuf.free_list_len--; @@ -1934,7 +1930,7 @@ ibuf_remove_free_page(void) buf_block_t* bitmap_page = ibuf_bitmap_get_map_page(page_id, 0, &mtr); - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); ibuf_bitmap_page_set_bits<IBUF_BITMAP_IBUF>( bitmap_page, page_id, srv_page_size, false, &mtr); @@ -1959,9 +1955,9 @@ ibuf_free_excess_pages(void) ibool too_much_free; - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_mutex); too_much_free = ibuf_data_too_much_free(); - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); if (!too_much_free) { return; @@ -3199,16 +3195,16 @@ ibuf_insert_low( if (BTR_LATCH_MODE_WITHOUT_INTENTION(mode) == BTR_MODIFY_TREE) { for (;;) { - mutex_enter(&ibuf_pessimistic_insert_mutex); - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_pessimistic_insert_mutex); + mysql_mutex_lock(&ibuf_mutex); if (UNIV_LIKELY(ibuf_data_enough_free_for_insert())) { break; } - mutex_exit(&ibuf_mutex); - mutex_exit(&ibuf_pessimistic_insert_mutex); + mysql_mutex_unlock(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_pessimistic_insert_mutex); if (!ibuf_add_free_page()) { @@ -3256,8 +3252,8 @@ ibuf_insert_low( fail_exit: if (BTR_LATCH_MODE_WITHOUT_INTENTION(mode) == BTR_MODIFY_TREE) { - mutex_exit(&ibuf_mutex); - mutex_exit(&ibuf_pessimistic_insert_mutex); + mysql_mutex_unlock(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_pessimistic_insert_mutex); } err = DB_STRONG_FAIL; @@ -3284,9 +3280,9 @@ commit_exit: ibuf_mtr_commit(&bitmap_mtr); goto fail_exit; } else { - mysql_mutex_lock(&lock_sys.mutex); + lock_sys.mutex_lock(); const auto lock_exists = lock_sys.get_first(page_id); - mysql_mutex_unlock(&lock_sys.mutex); + lock_sys.mutex_unlock(); if (lock_exists) { goto commit_exit; } @@ -3390,9 +3386,9 @@ commit_exit: &dummy_big_rec, 0, thr, &mtr); } - mutex_exit(&ibuf_pessimistic_insert_mutex); + mysql_mutex_unlock(&ibuf_pessimistic_insert_mutex); ibuf_size_update(root); - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); ibuf.empty = page_is_empty(root); block = btr_cur_get_block(cursor); @@ -4054,13 +4050,13 @@ bool ibuf_delete_rec(const page_id_t page_id, btr_pcur_t* pcur, ibuf_btr_pcur_commit_specify_mtr(pcur, mtr); ibuf_mtr_start(mtr); - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_mutex); if (!ibuf_restore_pos(page_id, search_tuple, BTR_MODIFY_TREE | BTR_LATCH_FOR_DELETE, pcur, mtr)) { - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); ut_ad(mtr->has_committed()); goto func_exit; } @@ -4072,7 +4068,7 @@ bool ibuf_delete_rec(const page_id_t page_id, btr_pcur_t* pcur, ut_a(err == DB_SUCCESS); ibuf_size_update(root); - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); ibuf.empty = page_is_empty(root); ibuf_btr_pcur_commit_specify_mtr(pcur, mtr); @@ -4494,11 +4490,11 @@ ibuf_is_empty(void) ibuf_mtr_start(&mtr); - ut_d(mutex_enter(&ibuf_mutex)); + ut_d(mysql_mutex_lock(&ibuf_mutex)); const buf_block_t* root = ibuf_tree_root_get(&mtr); bool is_empty = page_is_empty(root->frame); ut_a(is_empty == ibuf.empty); - ut_d(mutex_exit(&ibuf_mutex)); + ut_d(mysql_mutex_unlock(&ibuf_mutex)); ibuf_mtr_commit(&mtr); return(is_empty); @@ -4511,7 +4507,7 @@ ibuf_print( /*=======*/ FILE* file) /*!< in: file where to print */ { - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_mutex); fprintf(file, "Ibuf: size " ULINTPF ", free list len " ULINTPF "," @@ -4527,7 +4523,7 @@ ibuf_print( fputs("discarded operations:\n ", file); ibuf_print_ops(ibuf.n_discarded_ops, file); - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); } /** Check the insert buffer bitmaps on IMPORT TABLESPACE. @@ -4550,7 +4546,7 @@ dberr_t ibuf_check_bitmap_on_import(const trx_t* trx, fil_space_t* space) mtr_t mtr; - mutex_enter(&ibuf_mutex); + mysql_mutex_lock(&ibuf_mutex); /* The two bitmap pages (allocation bitmap and ibuf bitmap) repeat every page_size pages. For example if page_size is 16 KiB, then the @@ -4560,7 +4556,7 @@ dberr_t ibuf_check_bitmap_on_import(const trx_t* trx, fil_space_t* space) for (uint32_t page_no = 0; page_no < size; page_no += physical_size) { if (trx_is_interrupted(trx)) { - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); return(DB_INTERRUPTED); } @@ -4573,7 +4569,7 @@ dberr_t ibuf_check_bitmap_on_import(const trx_t* trx, fil_space_t* space) buf_block_t* bitmap_page = ibuf_bitmap_get_map_page( page_id_t(space->id, page_no), zip_size, &mtr); if (!bitmap_page) { - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); mtr.commit(); return DB_CORRUPTION; } @@ -4610,7 +4606,7 @@ dberr_t ibuf_check_bitmap_on_import(const trx_t* trx, fil_space_t* space) bitmap_page->frame, cur_page_id, zip_size, IBUF_BITMAP_IBUF, &mtr)) { - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); ibuf_exit(&mtr); mtr_commit(&mtr); @@ -4648,7 +4644,7 @@ dberr_t ibuf_check_bitmap_on_import(const trx_t* trx, fil_space_t* space) mtr_commit(&mtr); } - mutex_exit(&ibuf_mutex); + mysql_mutex_unlock(&ibuf_mutex); return(DB_SUCCESS); } |