summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-11-08 13:32:25 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2019-11-08 13:45:03 +0200
commitbce71a2909a8add9d0ca848bb387bacfd6e588e9 (patch)
tree503bfe6e9ca6fe418b1d09a7cf549588db8f0458
parent5ed54e78ac77a94aa37674ae0d484f687812f984 (diff)
downloadmariadb-git-bce71a2909a8add9d0ca848bb387bacfd6e588e9.tar.gz
Cleanup: Replace xdes_set_bit()
The XDES_CLEAN_BIT is always set for every element of the page allocation bitmap in the extent descriptor pages. Do not bother touching it, to avoid redundant writes. xdes_set_free<bool free>(): Replaces xdes_set_bit().
-rw-r--r--storage/innobase/fsp/fsp0fsp.cc70
1 files changed, 30 insertions, 40 deletions
diff --git a/storage/innobase/fsp/fsp0fsp.cc b/storage/innobase/fsp/fsp0fsp.cc
index 16b29126682..a35070cb9eb 100644
--- a/storage/innobase/fsp/fsp0fsp.cc
+++ b/storage/innobase/fsp/fsp0fsp.cc
@@ -159,38 +159,29 @@ inline fsp_header_t* fsp_get_space_header(const fil_space_t* space, mtr_t* mtr)
return(header);
}
-/**********************************************************************//**
-Sets a descriptor bit of a page. */
-UNIV_INLINE
-void
-xdes_set_bit(
-/*=========*/
- xdes_t* descr, /*!< in: descriptor */
- ulint bit, /*!< in: XDES_FREE_BIT or XDES_CLEAN_BIT */
- ulint offset, /*!< in: page offset within extent:
- 0 ... FSP_EXTENT_SIZE - 1 */
- ibool val, /*!< in: bit value */
- mtr_t* mtr) /*!< in/out: mini-transaction */
+/** Set the XDES_FREE_BIT of a page.
+@tparam free desired value of XDES_FREE_BIT
+@param[in,out] descr extent descriptor
+@param[in] offset page offset within the extent
+@param[in,out] mtr mini-transaction */
+template<bool free>
+inline void xdes_set_free(xdes_t *descr, ulint offset, mtr_t *mtr)
{
- ulint index;
- ulint byte_index;
- ulint bit_index;
- ulint descr_byte;
-
- ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_SX_FIX));
- ut_ad((bit == XDES_FREE_BIT) || (bit == XDES_CLEAN_BIT));
- ut_ad(offset < FSP_EXTENT_SIZE);
-
- index = bit + XDES_BITS_PER_PAGE * offset;
-
- byte_index = index / 8;
- bit_index = index % 8;
-
- descr_byte = mach_read_from_1(descr + XDES_BITMAP + byte_index);
- descr_byte = ut_bit_set_nth(descr_byte, bit_index, val);
-
- mlog_write_ulint(descr + XDES_BITMAP + byte_index, descr_byte,
- MLOG_1BYTE, mtr);
+ ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_SX_FIX));
+ ut_ad(offset < FSP_EXTENT_SIZE);
+ compile_time_assert(XDES_BITS_PER_PAGE == 2);
+ compile_time_assert(XDES_FREE_BIT == 0);
+ compile_time_assert(XDES_CLEAN_BIT == 1);
+
+ ulint index= XDES_BITS_PER_PAGE * offset;
+ byte *b= &descr[XDES_BITMAP + (index >> 3)];
+ /* xdes_init() should have set all XDES_CLEAN_BIT. */
+ ut_ad(!(~*b & 0xaa));
+ /* Clear or set XDES_FREE_BIT. */
+ byte val= free
+ ? *b | 1 << (index & 7)
+ : *b & ~(1 << (index & 7));
+ mlog_write_ulint(b, val, MLOG_1BYTE, mtr);
}
/**
@@ -949,9 +940,9 @@ fsp_fill_free_list(
and the second is an ibuf bitmap page: mark them
used */
- xdes_set_bit(descr, XDES_FREE_BIT, 0, FALSE, mtr);
- xdes_set_bit(descr, XDES_FREE_BIT,
- FSP_IBUF_BITMAP_OFFSET, FALSE, mtr);
+ xdes_set_free<false>(descr, 0, mtr);
+ xdes_set_free<false>(descr, FSP_IBUF_BITMAP_OFFSET,
+ mtr);
xdes_set_state(descr, XDES_FREE_FRAG, mtr);
flst_add_last(header + FSP_FREE_FRAG,
@@ -1040,7 +1031,7 @@ fsp_alloc_from_free_frag(
ut_ad(xdes_get_state(descr, mtr) == XDES_FREE_FRAG);
ut_a(xdes_is_free(descr, bit));
- xdes_set_bit(descr, XDES_FREE_BIT, bit, FALSE, mtr);
+ xdes_set_free<false>(descr, bit, mtr);
/* Update the FRAG_N_USED field */
frag_n_used = mach_read_from_4(header + FSP_FRAG_N_USED);
@@ -1297,10 +1288,10 @@ static void fsp_free_page(fil_space_t* space, page_no_t offset,
const ulint bit = offset % FSP_EXTENT_SIZE;
- xdes_set_bit(descr, XDES_FREE_BIT, bit, TRUE, mtr);
- xdes_set_bit(descr, XDES_CLEAN_BIT, bit, TRUE, mtr);
+ xdes_set_free<true>(descr, bit, mtr);
frag_n_used = mach_read_from_4(header + FSP_FRAG_N_USED);
+
if (state == XDES_FULL_FRAG) {
/* The fragment was full: move it to another list */
flst_remove(header + FSP_FULL_FRAG, descr + XDES_FLST_NODE,
@@ -2576,7 +2567,7 @@ fseg_mark_page_used(
ut_ad(xdes_is_free(descr, page % FSP_EXTENT_SIZE));
/* We mark the page as used */
- xdes_set_bit(descr, XDES_FREE_BIT, page % FSP_EXTENT_SIZE, FALSE, mtr);
+ xdes_set_free<false>(descr, page % FSP_EXTENT_SIZE, mtr);
not_full_n_used = mach_read_from_4(seg_inode + FSEG_NOT_FULL_N_USED);
not_full_n_used++;
@@ -2707,8 +2698,7 @@ fseg_free_page_low(
const ulint bit = offset % FSP_EXTENT_SIZE;
- xdes_set_bit(descr, XDES_FREE_BIT, bit, TRUE, mtr);
- xdes_set_bit(descr, XDES_CLEAN_BIT, bit, TRUE, mtr);
+ xdes_set_free<true>(descr, bit, mtr);
if (!xdes_get_n_used(descr)) {
/* The extent has become free: free it to space */