Skip to content

Commit

Permalink
MDEV-31333 fsp_free_page() fails to move the extent from
Browse files Browse the repository at this point in the history
		FSP_FREE_FRAG to FSP_FREE list

- This issue was caused by commit 0b47c12.
In fsp_free_page(), InnoDB should set XDES_FREE_BIT of the page before
moving the extent from FSP_FREE_FRAG to FSP_FREE list.
  • Loading branch information
Thirunarayanan committed May 24, 2023
1 parent 2cd6a48 commit 7737f15
Showing 1 changed file with 7 additions and 10 deletions.
17 changes: 7 additions & 10 deletions storage/innobase/fsp/fsp0fsp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1286,23 +1286,20 @@ static dberr_t fsp_free_page(fil_space_t *space, page_no_t offset, mtr_t *mtr)
+ header->page.frame, frag_n_used - 1);
}

mtr->free(*space, static_cast<uint32_t>(offset));
xdes_set_free<true>(*xdes, descr, offset % FSP_EXTENT_SIZE, mtr);
ut_ad(err == DB_SUCCESS);

if (!xdes_get_n_used(descr)) {
/* The extent has become free: move it to another list */
err = flst_remove(header, FSP_HEADER_OFFSET + FSP_FREE_FRAG,
xdes, xoffset, mtr);
if (UNIV_UNLIKELY(err != DB_SUCCESS)) {
return err;
}
err = fsp_free_extent(space, offset, mtr);
if (UNIV_UNLIKELY(err != DB_SUCCESS)) {
return err;
if (err == DB_SUCCESS) {
err = fsp_free_extent(space, offset, mtr);
}
}

mtr->free(*space, static_cast<uint32_t>(offset));
xdes_set_free<true>(*xdes, descr, offset % FSP_EXTENT_SIZE, mtr);

return DB_SUCCESS;
return err;
}

/** @return Number of segment inodes which fit on a single page */
Expand Down

0 comments on commit 7737f15

Please sign in to comment.