diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-11-20 12:30:55 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-11-24 15:43:12 +0200 |
commit | edbde4a11fd0b6437202f8019a79911441b6fb32 (patch) | |
tree | 2b420db82ee16dd7eaefbefeb9a0e377770a56f2 /storage/innobase/fsp | |
parent | bdd88cfa348b1a5257b1ae8f6231e6a2fcb6d30f (diff) | |
download | mariadb-git-edbde4a11fd0b6437202f8019a79911441b6fb32.tar.gz |
MDEV-24167: Replace fil_space::latch
We must avoid acquiring a latch while we are already holding one.
The tablespace latch was being acquired recursively in some
operations that allocate or free pages.
Diffstat (limited to 'storage/innobase/fsp')
-rw-r--r-- | storage/innobase/fsp/fsp0fsp.cc | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/storage/innobase/fsp/fsp0fsp.cc b/storage/innobase/fsp/fsp0fsp.cc index ae8c557b24c..d82579972ca 100644 --- a/storage/innobase/fsp/fsp0fsp.cc +++ b/storage/innobase/fsp/fsp0fsp.cc @@ -318,7 +318,7 @@ xdes_get_descriptor_with_space_hdr( mtr_t* mtr, bool init_space = false) { - ut_ad(mtr->memo_contains(*space)); + ut_ad(space->is_owner()); ut_ad(mtr->memo_contains_flagged(header, MTR_MEMO_PAGE_SX_FIX | MTR_MEMO_PAGE_X_FIX)); /* Read free limit and space size */ @@ -404,7 +404,7 @@ xdes_get_descriptor_const( page_no_t offset, mtr_t* mtr) { - ut_ad(mtr->memo_contains(space->latch, MTR_MEMO_S_LOCK)); + ut_ad(mtr->memo_contains(*space, true)); ut_ad(offset < space->free_limit); ut_ad(offset < space->size_in_header); @@ -549,7 +549,7 @@ void fsp_header_init(fil_space_t* space, uint32_t size, mtr_t* mtr) buf_block_t *free_block = buf_LRU_get_free_block(false); - mtr_x_lock_space(space, mtr); + mtr->x_lock_space(space); buf_block_t* block = buf_page_create(space, 0, zip_size, mtr, free_block); @@ -1262,7 +1262,7 @@ static void fsp_free_page(fil_space_t* space, page_no_t offset, mtr_t* mtr) @param[in,out] mtr mini-transaction */ static void fsp_free_extent(fil_space_t* space, page_no_t offset, mtr_t* mtr) { - ut_ad(mtr->memo_contains(*space)); + ut_ad(space->is_owner()); buf_block_t *block= fsp_get_header(space, mtr); buf_block_t *xdes= 0; @@ -1650,7 +1650,7 @@ fseg_create(fil_space_t *space, ulint byte_offset, mtr_t *mtr, ut_ad(byte_offset + FSEG_HEADER_SIZE <= srv_page_size - FIL_PAGE_DATA_END); - mtr_x_lock_space(space, mtr); + mtr->x_lock_space(space); ut_d(space->modify_check(*mtr)); if (block) { @@ -2199,7 +2199,7 @@ fseg_alloc_free_page_general( uint32_t n_reserved; space_id = page_get_space_id(page_align(seg_header)); - space = mtr_x_lock_space(space_id, mtr); + space = mtr->x_lock_space(space_id); inode = fseg_inode_get(seg_header, space_id, space->zip_size(), mtr, &iblock); if (!space->full_crc32()) { @@ -2323,7 +2323,7 @@ fsp_reserve_free_extents( const uint32_t extent_size = FSP_EXTENT_SIZE; - mtr_x_lock_space(space, mtr); + mtr->x_lock_space(space); const unsigned physical_size = space->physical_size(); buf_block_t* header = fsp_get_header(space, mtr); @@ -2528,18 +2528,24 @@ fseg_free_page_low( @param[in,out] seg_header file segment header @param[in,out] space tablespace @param[in] offset page number -@param[in,out] mtr mini-transaction */ +@param[in,out] mtr mini-transaction +@param[in] have_latch whether space->x_lock() was already called */ void fseg_free_page( fseg_header_t* seg_header, fil_space_t* space, uint32_t offset, - mtr_t* mtr) + mtr_t* mtr, + bool have_latch) { DBUG_ENTER("fseg_free_page"); fseg_inode_t* seg_inode; buf_block_t* iblock; - mtr_x_lock_space(space, mtr); + if (have_latch) { + ut_ad(space->is_owner()); + } else { + mtr->x_lock_space(space); + } DBUG_LOG("fseg_free_page", "space_id: " << space->id << ", page_no: " << offset); @@ -2569,7 +2575,7 @@ fseg_page_is_free(fil_space_t* space, unsigned page) page); mtr.start(); - mtr_s_lock_space(space, &mtr); + mtr.s_lock_space(space); if (page >= space->free_limit || page >= space->size_in_header) { is_free = true; @@ -2666,7 +2672,7 @@ fseg_free_step( const uint32_t space_id = page_get_space_id(page_align(header)); const uint32_t header_page = page_get_page_no(page_align(header)); - fil_space_t* space = mtr_x_lock_space(space_id, mtr); + fil_space_t* space = mtr->x_lock_space(space_id); buf_block_t* xdes; xdes_t* descr = xdes_get_descriptor(space, header_page, &xdes, mtr); @@ -2740,7 +2746,7 @@ fseg_free_step_not_header( const uint32_t space_id = page_get_space_id(page_align(header)); ut_ad(mtr->is_named_space(space_id)); - fil_space_t* space = mtr_x_lock_space(space_id, mtr); + fil_space_t* space = mtr->x_lock_space(space_id); buf_block_t* iblock; inode = fseg_inode_get(header, space_id, space->zip_size(), mtr, |