summaryrefslogtreecommitdiff
path: root/storage/innobase/fsp
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-11-20 12:30:55 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2020-11-24 15:43:12 +0200
commitedbde4a11fd0b6437202f8019a79911441b6fb32 (patch)
tree2b420db82ee16dd7eaefbefeb9a0e377770a56f2 /storage/innobase/fsp
parentbdd88cfa348b1a5257b1ae8f6231e6a2fcb6d30f (diff)
downloadmariadb-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.cc32
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,