summaryrefslogtreecommitdiff
path: root/storage/innobase/ibuf/ibuf0ibuf.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/ibuf/ibuf0ibuf.cc')
-rw-r--r--storage/innobase/ibuf/ibuf0ibuf.cc124
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);
}