1
0
mirror of https://github.com/MariaDB/server.git synced 2026-01-06 05:22:24 +03:00

MDEV-31333 fsp_free_page() fails to move the extent from

FSP_FREE_FRAG to FSP_FREE list

- This issue was caused by commit 0b47c126e3.
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.
This commit is contained in:
Thirunarayanan Balathandayuthapani
2023-05-24 14:34:57 +05:30
parent 2cd6a48e72
commit 7737f15f87

View File

@@ -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 */