Commit 8b14f397 authored by marko's avatar marko

branches/zip: Remove some more references to XDES_DESCRIBED_PER_PAGE.

ibuf_parse_bitmap_init(), ibuf_bitmap_page_init(),
ibuf_bitmap_page_get_bits(), ibuf_bitmap_set_bits(),
ibuf_bitmap_page_no_calc(), ibuf_bitmap_get_map_page(),
xdes_calc_descriptor_page(), xdes_calc_descriptor_index(),
fsp_descr_page(): Add parameter zip_size.
parent a782c1cc
...@@ -606,14 +606,24 @@ ulint ...@@ -606,14 +606,24 @@ ulint
xdes_calc_descriptor_page( xdes_calc_descriptor_page(
/*======================*/ /*======================*/
/* out: descriptor page offset */ /* out: descriptor page offset */
ulint zip_size, /* in: compressed page size in bytes;
0 for uncompressed pages */
ulint offset) /* in: page offset */ ulint offset) /* in: page offset */
{ {
#if UNIV_PAGE_SIZE <= XDES_ARR_OFFSET \ #if UNIV_PAGE_SIZE <= XDES_ARR_OFFSET \
+ (XDES_DESCRIBED_PER_PAGE / FSP_EXTENT_SIZE) * XDES_SIZE + (UNIV_PAGE_SIZE / FSP_EXTENT_SIZE) * XDES_SIZE
# error # error
#endif #endif
#if 1024 <= XDES_ARR_OFFSET + (1024 / FSP_EXTENT_SIZE) * XDES_SIZE
return(ut_2pow_round(offset, XDES_DESCRIBED_PER_PAGE)); # error /* extent descriptor will not fit on smallest page_zip */
#endif
ut_ad(zip_size <= XDES_ARR_OFFSET
+ (zip_size / FSP_EXTENT_SIZE) * XDES_SIZE);
if (!zip_size) {
return(ut_2pow_round(offset, UNIV_PAGE_SIZE));
} else {
return(ut_2pow_round(offset, zip_size));
}
} }
/************************************************************************ /************************************************************************
...@@ -623,10 +633,16 @@ ulint ...@@ -623,10 +633,16 @@ ulint
xdes_calc_descriptor_index( xdes_calc_descriptor_index(
/*=======================*/ /*=======================*/
/* out: descriptor index */ /* out: descriptor index */
ulint zip_size, /* in: compressed page size in bytes;
0 for uncompressed pages */
ulint offset) /* in: page offset */ ulint offset) /* in: page offset */
{ {
return(ut_2pow_remainder(offset, XDES_DESCRIBED_PER_PAGE) / if (!zip_size) {
FSP_EXTENT_SIZE); return(ut_2pow_remainder(offset, UNIV_PAGE_SIZE)
/ FSP_EXTENT_SIZE);
} else {
return(ut_2pow_remainder(offset, zip_size) / FSP_EXTENT_SIZE);
}
} }
/************************************************************************ /************************************************************************
...@@ -652,15 +668,21 @@ xdes_get_descriptor_with_space_hdr( ...@@ -652,15 +668,21 @@ xdes_get_descriptor_with_space_hdr(
{ {
ulint limit; ulint limit;
ulint size; ulint size;
ulint zip_size;
ulint descr_page_no; ulint descr_page_no;
page_t* descr_page; page_t* descr_page;
ut_ad(mtr); ut_ad(mtr);
ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space), ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space),
MTR_MEMO_X_LOCK)); MTR_MEMO_X_LOCK));
ut_ad(mtr_memo_contains(mtr,
buf_block_align(sp_header), MTR_MEMO_PAGE_S_FIX)
|| mtr_memo_contains(mtr,
buf_block_align(sp_header), MTR_MEMO_PAGE_X_FIX));
/* Read free limit and space size */ /* Read free limit and space size */
limit = mtr_read_ulint(sp_header + FSP_FREE_LIMIT, MLOG_4BYTES, mtr); limit = mach_read_from_4(sp_header + FSP_FREE_LIMIT);
size = mtr_read_ulint(sp_header + FSP_SIZE, MLOG_4BYTES, mtr); size = mach_read_from_4(sp_header + FSP_SIZE);
zip_size = mach_read_from_4(sp_header + FSP_PAGE_ZIP_SIZE);
/* If offset is >= size or > limit, return NULL */ /* If offset is >= size or > limit, return NULL */
...@@ -675,7 +697,7 @@ xdes_get_descriptor_with_space_hdr( ...@@ -675,7 +697,7 @@ xdes_get_descriptor_with_space_hdr(
fsp_fill_free_list(FALSE, space, sp_header, mtr); fsp_fill_free_list(FALSE, space, sp_header, mtr);
} }
descr_page_no = xdes_calc_descriptor_page(offset); descr_page_no = xdes_calc_descriptor_page(zip_size, offset);
if (descr_page_no == 0) { if (descr_page_no == 0) {
/* It is on the space header page */ /* It is on the space header page */
...@@ -690,7 +712,7 @@ xdes_get_descriptor_with_space_hdr( ...@@ -690,7 +712,7 @@ xdes_get_descriptor_with_space_hdr(
} }
return(descr_page + XDES_ARR_OFFSET return(descr_page + XDES_ARR_OFFSET
+ XDES_SIZE * xdes_calc_descriptor_index(offset)); + XDES_SIZE * xdes_calc_descriptor_index(zip_size, offset));
} }
/************************************************************************ /************************************************************************
...@@ -1304,7 +1326,7 @@ fsp_fill_free_list( ...@@ -1304,7 +1326,7 @@ fsp_fill_free_list(
#endif /* UNIV_SYNC_DEBUG */ #endif /* UNIV_SYNC_DEBUG */
fsp_init_file_page(ibuf_page, &ibuf_mtr); fsp_init_file_page(ibuf_page, &ibuf_mtr);
ibuf_bitmap_page_init(ibuf_page, &ibuf_mtr); ibuf_bitmap_page_init(ibuf_page, zip_size, &ibuf_mtr);
mtr_commit(&ibuf_mtr); mtr_commit(&ibuf_mtr);
} }
...@@ -1313,8 +1335,11 @@ fsp_fill_free_list( ...@@ -1313,8 +1335,11 @@ fsp_fill_free_list(
mtr); mtr);
xdes_init(descr, mtr); xdes_init(descr, mtr);
#if XDES_DESCRIBED_PER_PAGE % FSP_EXTENT_SIZE #if UNIV_PAGE_SIZE % FSP_EXTENT_SIZE
# error "XDES_DESCRIBED_PER_PAGE % FSP_EXTENT_SIZE != 0" # error "UNIV_PAGE_SIZE % FSP_EXTENT_SIZE != 0"
#endif
#if 1024 % FSP_EXTENT_SIZE /* smallest page_zip->size */
# error "1024 % FSP_EXTENT_SIZE != 0"
#endif #endif
if (0 == i % XDES_DESCRIBED_PER_PAGE) { if (0 == i % XDES_DESCRIBED_PER_PAGE) {
......
...@@ -566,18 +566,23 @@ void ...@@ -566,18 +566,23 @@ void
ibuf_bitmap_page_init( ibuf_bitmap_page_init(
/*==================*/ /*==================*/
page_t* page, /* in: bitmap page */ page_t* page, /* in: bitmap page */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
mtr_t* mtr) /* in: mtr */ mtr_t* mtr) /* in: mtr */
{ {
ulint bit_offset;
ulint byte_offset; ulint byte_offset;
/* Write all zeros to the bitmap */ ut_ad(!(zip_size & (zip_size - 1))); /* must be a power of 2 */
bit_offset = XDES_DESCRIBED_PER_PAGE * IBUF_BITS_PER_PAGE; fil_page_set_type(page, FIL_PAGE_IBUF_BITMAP);
byte_offset = bit_offset / 8 + 1; /* better: (bit_offset + 7) / 8 */ /* Write all zeros to the bitmap */
fil_page_set_type(page, FIL_PAGE_IBUF_BITMAP); if (!zip_size) {
byte_offset = (UNIV_PAGE_SIZE * IBUF_BITS_PER_PAGE + 7) / 8;
} else {
byte_offset = (zip_size * IBUF_BITS_PER_PAGE + 7) / 8;
}
memset(page + IBUF_BITMAP, 0, byte_offset); memset(page + IBUF_BITMAP, 0, byte_offset);
...@@ -596,12 +601,14 @@ ibuf_parse_bitmap_init( ...@@ -596,12 +601,14 @@ ibuf_parse_bitmap_init(
byte* ptr, /* in: buffer */ byte* ptr, /* in: buffer */
byte* end_ptr __attribute__((unused)), /* in: buffer end */ byte* end_ptr __attribute__((unused)), /* in: buffer end */
page_t* page, /* in: page or NULL */ page_t* page, /* in: page or NULL */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
mtr_t* mtr) /* in: mtr or NULL */ mtr_t* mtr) /* in: mtr or NULL */
{ {
ut_ad(ptr && end_ptr); ut_ad(ptr && end_ptr);
if (page) { if (page) {
ibuf_bitmap_page_init(page, mtr); ibuf_bitmap_page_init(page, zip_size, mtr);
} }
return(ptr); return(ptr);
...@@ -616,6 +623,8 @@ ibuf_bitmap_page_get_bits( ...@@ -616,6 +623,8 @@ ibuf_bitmap_page_get_bits(
/* out: value of bits */ /* out: value of bits */
page_t* page, /* in: bitmap page */ page_t* page, /* in: bitmap page */
ulint page_no,/* in: page whose bits to get */ ulint page_no,/* in: page whose bits to get */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
ulint bit, /* in: IBUF_BITMAP_FREE, IBUF_BITMAP_BUFFERED, ... */ ulint bit, /* in: IBUF_BITMAP_FREE, IBUF_BITMAP_BUFFERED, ... */
mtr_t* mtr __attribute__((unused))) /* in: mtr containing an mtr_t* mtr __attribute__((unused))) /* in: mtr containing an
x-latch to the bitmap x-latch to the bitmap
...@@ -630,11 +639,17 @@ ibuf_bitmap_page_get_bits( ...@@ -630,11 +639,17 @@ ibuf_bitmap_page_get_bits(
#if IBUF_BITS_PER_PAGE % 2 #if IBUF_BITS_PER_PAGE % 2
# error "IBUF_BITS_PER_PAGE % 2 != 0" # error "IBUF_BITS_PER_PAGE % 2 != 0"
#endif #endif
ut_ad(!(zip_size & (zip_size - 1))); /* must be a power of 2 */
ut_ad(mtr_memo_contains(mtr, buf_block_align(page), ut_ad(mtr_memo_contains(mtr, buf_block_align(page),
MTR_MEMO_PAGE_X_FIX)); MTR_MEMO_PAGE_X_FIX));
bit_offset = (page_no % XDES_DESCRIBED_PER_PAGE) * IBUF_BITS_PER_PAGE if (!zip_size) {
+ bit; bit_offset = (page_no % UNIV_PAGE_SIZE) * IBUF_BITS_PER_PAGE
+ bit;
} else {
bit_offset = (page_no & (zip_size - 1)) * IBUF_BITS_PER_PAGE
+ bit;
}
byte_offset = bit_offset / 8; byte_offset = bit_offset / 8;
bit_offset = bit_offset % 8; bit_offset = bit_offset % 8;
...@@ -662,6 +677,8 @@ ibuf_bitmap_page_set_bits( ...@@ -662,6 +677,8 @@ ibuf_bitmap_page_set_bits(
/*======================*/ /*======================*/
page_t* page, /* in: bitmap page */ page_t* page, /* in: bitmap page */
ulint page_no,/* in: page whose bits to set */ ulint page_no,/* in: page whose bits to set */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
ulint bit, /* in: IBUF_BITMAP_FREE, IBUF_BITMAP_BUFFERED, ... */ ulint bit, /* in: IBUF_BITMAP_FREE, IBUF_BITMAP_BUFFERED, ... */
ulint val, /* in: value to set */ ulint val, /* in: value to set */
mtr_t* mtr) /* in: mtr containing an x-latch to the bitmap page */ mtr_t* mtr) /* in: mtr containing an x-latch to the bitmap page */
...@@ -674,6 +691,7 @@ ibuf_bitmap_page_set_bits( ...@@ -674,6 +691,7 @@ ibuf_bitmap_page_set_bits(
#if IBUF_BITS_PER_PAGE % 2 #if IBUF_BITS_PER_PAGE % 2
# error "IBUF_BITS_PER_PAGE % 2 != 0" # error "IBUF_BITS_PER_PAGE % 2 != 0"
#endif #endif
ut_ad(!(zip_size & (zip_size - 1))); /* must be a power of 2 */
ut_ad(mtr_memo_contains(mtr, buf_block_align(page), ut_ad(mtr_memo_contains(mtr, buf_block_align(page),
MTR_MEMO_PAGE_X_FIX)); MTR_MEMO_PAGE_X_FIX));
#ifdef UNIV_IBUF_DEBUG #ifdef UNIV_IBUF_DEBUG
...@@ -681,8 +699,13 @@ ibuf_bitmap_page_set_bits( ...@@ -681,8 +699,13 @@ ibuf_bitmap_page_set_bits(
|| (0 == ibuf_count_get(buf_frame_get_space_id(page), || (0 == ibuf_count_get(buf_frame_get_space_id(page),
page_no))); page_no)));
#endif #endif
bit_offset = (page_no % XDES_DESCRIBED_PER_PAGE) * IBUF_BITS_PER_PAGE if (!zip_size) {
+ bit; bit_offset = (page_no % UNIV_PAGE_SIZE) * IBUF_BITS_PER_PAGE
+ bit;
} else {
bit_offset = (page_no & (zip_size - 1)) * IBUF_BITS_PER_PAGE
+ bit;
}
byte_offset = bit_offset / 8; byte_offset = bit_offset / 8;
bit_offset = bit_offset % 8; bit_offset = bit_offset % 8;
...@@ -714,11 +737,19 @@ ibuf_bitmap_page_no_calc( ...@@ -714,11 +737,19 @@ ibuf_bitmap_page_no_calc(
/*=====================*/ /*=====================*/
/* out: the bitmap page number where /* out: the bitmap page number where
the file page is mapped */ the file page is mapped */
ulint zip_size, /* in: compressed page size in bytes;
0 for uncompressed pages */
ulint page_no) /* in: tablespace page number */ ulint page_no) /* in: tablespace page number */
{ {
return(FSP_IBUF_BITMAP_OFFSET ut_ad(!(zip_size & (zip_size - 1))); /* must be a power of 2 */
+ XDES_DESCRIBED_PER_PAGE
* (page_no / XDES_DESCRIBED_PER_PAGE)); if (!zip_size) {
return(FSP_IBUF_BITMAP_OFFSET
+ (page_no & ~(UNIV_PAGE_SIZE - 1)));
} else {
return(FSP_IBUF_BITMAP_OFFSET
+ (page_no & ~(zip_size - 1)));
}
} }
/************************************************************************ /************************************************************************
...@@ -734,11 +765,13 @@ ibuf_bitmap_get_map_page( ...@@ -734,11 +765,13 @@ ibuf_bitmap_get_map_page(
x-latched */ x-latched */
ulint space, /* in: space id of the file page */ ulint space, /* in: space id of the file page */
ulint page_no,/* in: page number of the file page */ ulint page_no,/* in: page number of the file page */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
mtr_t* mtr) /* in: mtr */ mtr_t* mtr) /* in: mtr */
{ {
page_t* page; page_t* page;
page = buf_page_get(space, ibuf_bitmap_page_no_calc(page_no), page = buf_page_get(space, ibuf_bitmap_page_no_calc(zip_size, page_no),
RW_X_LATCH, mtr); RW_X_LATCH, mtr);
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
buf_page_dbg_add_level(page, SYNC_IBUF_BITMAP); buf_page_dbg_add_level(page, SYNC_IBUF_BITMAP);
...@@ -763,6 +796,9 @@ ibuf_set_free_bits_low( ...@@ -763,6 +796,9 @@ ibuf_set_free_bits_low(
mtr_t* mtr) /* in: mtr */ mtr_t* mtr) /* in: mtr */
{ {
page_t* bitmap_page; page_t* bitmap_page;
ulint space;
ulint page_no;
ulint zip_size;
if (type & DICT_CLUSTERED) { if (type & DICT_CLUSTERED) {
...@@ -774,8 +810,10 @@ ibuf_set_free_bits_low( ...@@ -774,8 +810,10 @@ ibuf_set_free_bits_low(
return; return;
} }
bitmap_page = ibuf_bitmap_get_map_page(buf_frame_get_space_id(page), space = buf_frame_get_space_id(page);
buf_frame_get_page_no(page), mtr); page_no = buf_frame_get_page_no(page);
zip_size = fil_space_get_zip_size(space);
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, zip_size, mtr);
#ifdef UNIV_IBUF_DEBUG #ifdef UNIV_IBUF_DEBUG
/* fprintf(stderr, /* fprintf(stderr,
"Setting page no %lu free bits to %lu should be %lu\n", "Setting page no %lu free bits to %lu should be %lu\n",
...@@ -784,9 +822,8 @@ ibuf_set_free_bits_low( ...@@ -784,9 +822,8 @@ ibuf_set_free_bits_low(
ut_a(val <= ibuf_index_page_calc_free(page)); ut_a(val <= ibuf_index_page_calc_free(page));
#endif #endif
ibuf_bitmap_page_set_bits(bitmap_page, buf_frame_get_page_no(page), ibuf_bitmap_page_set_bits(bitmap_page, page_no, zip_size,
IBUF_BITMAP_FREE, val, mtr); IBUF_BITMAP_FREE, val, mtr);
} }
/**************************************************************************** /****************************************************************************
...@@ -808,6 +845,9 @@ ibuf_set_free_bits( ...@@ -808,6 +845,9 @@ ibuf_set_free_bits(
{ {
mtr_t mtr; mtr_t mtr;
page_t* bitmap_page; page_t* bitmap_page;
ulint space;
ulint page_no;
ulint zip_size;
if (type & DICT_CLUSTERED) { if (type & DICT_CLUSTERED) {
...@@ -821,16 +861,18 @@ ibuf_set_free_bits( ...@@ -821,16 +861,18 @@ ibuf_set_free_bits(
mtr_start(&mtr); mtr_start(&mtr);
bitmap_page = ibuf_bitmap_get_map_page(buf_frame_get_space_id(page), space = buf_frame_get_space_id(page);
buf_frame_get_page_no(page), &mtr); page_no = buf_frame_get_page_no(page);
zip_size = fil_space_get_zip_size(space);
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, zip_size, &mtr);
if (max_val != ULINT_UNDEFINED) { if (max_val != ULINT_UNDEFINED) {
#ifdef UNIV_IBUF_DEBUG #ifdef UNIV_IBUF_DEBUG
ulint old_val; ulint old_val;
old_val = ibuf_bitmap_page_get_bits(bitmap_page, old_val = ibuf_bitmap_page_get_bits(
buf_frame_get_page_no(page), bitmap_page, page_no, zip_size,
IBUF_BITMAP_FREE, &mtr); IBUF_BITMAP_FREE, &mtr);
if (old_val != max_val) { if (old_val != max_val) {
/* fprintf(stderr, /* fprintf(stderr,
"Ibuf: page %lu old val %lu max val %lu\n", "Ibuf: page %lu old val %lu max val %lu\n",
...@@ -847,7 +889,7 @@ ibuf_set_free_bits( ...@@ -847,7 +889,7 @@ ibuf_set_free_bits(
ut_a(val <= ibuf_index_page_calc_free(page)); ut_a(val <= ibuf_index_page_calc_free(page));
#endif #endif
ibuf_bitmap_page_set_bits(bitmap_page, buf_frame_get_page_no(page), ibuf_bitmap_page_set_bits(bitmap_page, page_no, zip_size,
IBUF_BITMAP_FREE, val, &mtr); IBUF_BITMAP_FREE, val, &mtr);
mtr_commit(&mtr); mtr_commit(&mtr);
} }
...@@ -953,10 +995,12 @@ ibuf_fixed_addr_page( ...@@ -953,10 +995,12 @@ ibuf_fixed_addr_page(
/*=================*/ /*=================*/
/* out: TRUE if a fixed address ibuf i/o page */ /* out: TRUE if a fixed address ibuf i/o page */
ulint space, /* in: space id */ ulint space, /* in: space id */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
ulint page_no)/* in: page number */ ulint page_no)/* in: page number */
{ {
return((space == 0 && page_no == IBUF_TREE_ROOT_PAGE_NO) return((space == 0 && page_no == IBUF_TREE_ROOT_PAGE_NO)
|| ibuf_bitmap_page(fil_space_get_zip_size(space), page_no)); || ibuf_bitmap_page(zip_size, page_no));
} }
/*************************************************************************** /***************************************************************************
...@@ -972,6 +1016,7 @@ ibuf_page( ...@@ -972,6 +1016,7 @@ ibuf_page(
page_t* bitmap_page; page_t* bitmap_page;
mtr_t mtr; mtr_t mtr;
ibool ret; ibool ret;
ulint zip_size;
if (recv_no_ibuf_operations) { if (recv_no_ibuf_operations) {
/* Recovery is running: no ibuf operations should be /* Recovery is running: no ibuf operations should be
...@@ -980,7 +1025,9 @@ ibuf_page( ...@@ -980,7 +1025,9 @@ ibuf_page(
return(FALSE); return(FALSE);
} }
if (ibuf_fixed_addr_page(space, page_no)) { zip_size = fil_space_get_zip_size(space);
if (ibuf_fixed_addr_page(space, zip_size, page_no)) {
return(TRUE); return(TRUE);
} }
...@@ -995,10 +1042,10 @@ ibuf_page( ...@@ -995,10 +1042,10 @@ ibuf_page(
mtr_start(&mtr); mtr_start(&mtr);
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, &mtr); bitmap_page = ibuf_bitmap_get_map_page(space, page_no, zip_size, &mtr);
ret = ibuf_bitmap_page_get_bits(bitmap_page, page_no, IBUF_BITMAP_IBUF, ret = ibuf_bitmap_page_get_bits(bitmap_page, page_no, zip_size,
&mtr); IBUF_BITMAP_IBUF, &mtr);
mtr_commit(&mtr); mtr_commit(&mtr);
return(ret); return(ret);
...@@ -1018,7 +1065,7 @@ ibuf_page_low( ...@@ -1018,7 +1065,7 @@ ibuf_page_low(
address ibuf pages */ address ibuf pages */
{ {
page_t* bitmap_page; page_t* bitmap_page;
ibool ret; ulint zip_size;
#ifdef UNIV_LOG_DEBUG #ifdef UNIV_LOG_DEBUG
if (space % 2 != 0) { if (space % 2 != 0) {
...@@ -1028,16 +1075,17 @@ ibuf_page_low( ...@@ -1028,16 +1075,17 @@ ibuf_page_low(
return(FALSE); return(FALSE);
} }
#endif #endif
if (ibuf_fixed_addr_page(space, page_no)) { zip_size = fil_space_get_zip_size(space);
if (ibuf_fixed_addr_page(space, zip_size, page_no)) {
return(TRUE); return(TRUE);
} }
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, mtr); bitmap_page = ibuf_bitmap_get_map_page(space, page_no, zip_size, mtr);
ret = ibuf_bitmap_page_get_bits(bitmap_page, page_no, IBUF_BITMAP_IBUF, return(ibuf_bitmap_page_get_bits(bitmap_page, page_no, zip_size,
mtr); IBUF_BITMAP_IBUF, mtr));
return(ret);
} }
/************************************************************************ /************************************************************************
...@@ -1633,6 +1681,7 @@ ibuf_add_free_page( ...@@ -1633,6 +1681,7 @@ ibuf_add_free_page(
page_t* page; page_t* page;
page_t* root; page_t* root;
page_t* bitmap_page; page_t* bitmap_page;
ulint zip_size;
ut_a(space == 0); ut_a(space == 0);
...@@ -1689,10 +1738,12 @@ ibuf_add_free_page( ...@@ -1689,10 +1738,12 @@ ibuf_add_free_page(
/* Set the bit indicating that this page is now an ibuf tree page /* Set the bit indicating that this page is now an ibuf tree page
(level 2 page) */ (level 2 page) */
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, &mtr); zip_size = fil_space_get_zip_size(space);
ibuf_bitmap_page_set_bits(bitmap_page, page_no, IBUF_BITMAP_IBUF, bitmap_page = ibuf_bitmap_get_map_page(space, page_no, zip_size, &mtr);
TRUE, &mtr);
ibuf_bitmap_page_set_bits(bitmap_page, page_no, zip_size,
IBUF_BITMAP_IBUF, TRUE, &mtr);
mtr_commit(&mtr); mtr_commit(&mtr);
mutex_exit(&ibuf_mutex); mutex_exit(&ibuf_mutex);
...@@ -1715,6 +1766,7 @@ ibuf_remove_free_page( ...@@ -1715,6 +1766,7 @@ ibuf_remove_free_page(
mtr_t mtr2; mtr_t mtr2;
page_t* header_page; page_t* header_page;
ulint page_no; ulint page_no;
ulint zip_size;
page_t* page; page_t* page;
page_t* root; page_t* root;
page_t* bitmap_page; page_t* bitmap_page;
...@@ -1806,10 +1858,12 @@ ibuf_remove_free_page( ...@@ -1806,10 +1858,12 @@ ibuf_remove_free_page(
/* Set the bit indicating that this page is no more an ibuf tree page /* Set the bit indicating that this page is no more an ibuf tree page
(level 2 page) */ (level 2 page) */
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, &mtr); zip_size = fil_space_get_zip_size(space);
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, zip_size, &mtr);
ibuf_bitmap_page_set_bits(bitmap_page, page_no, IBUF_BITMAP_IBUF, ibuf_bitmap_page_set_bits(bitmap_page, page_no, zip_size,
FALSE, &mtr); IBUF_BITMAP_IBUF, FALSE, &mtr);
#ifdef UNIV_DEBUG_FILE_ACCESSES #ifdef UNIV_DEBUG_FILE_ACCESSES
buf_page_set_file_page_was_freed(space, page_no); buf_page_set_file_page_was_freed(space, page_no);
#endif #endif
...@@ -2529,6 +2583,7 @@ ibuf_insert_low( ...@@ -2529,6 +2583,7 @@ ibuf_insert_low(
ulint page_nos[IBUF_MAX_N_PAGES_MERGED]; ulint page_nos[IBUF_MAX_N_PAGES_MERGED];
ulint n_stored; ulint n_stored;
ulint bits; ulint bits;
ulint zip_size;
mtr_t mtr; mtr_t mtr;
mtr_t bitmap_mtr; mtr_t bitmap_mtr;
...@@ -2625,7 +2680,10 @@ ibuf_insert_low( ...@@ -2625,7 +2680,10 @@ ibuf_insert_low(
#endif #endif
mtr_start(&bitmap_mtr); mtr_start(&bitmap_mtr);
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, &bitmap_mtr); zip_size = fil_space_get_zip_size(space);
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, zip_size,
&bitmap_mtr);
/* We check if the index page is suitable for buffered entries */ /* We check if the index page is suitable for buffered entries */
...@@ -2638,7 +2696,7 @@ ibuf_insert_low( ...@@ -2638,7 +2696,7 @@ ibuf_insert_low(
goto function_exit; goto function_exit;
} }
bits = ibuf_bitmap_page_get_bits(bitmap_page, page_no, bits = ibuf_bitmap_page_get_bits(bitmap_page, page_no, zip_size,
IBUF_BITMAP_FREE, &bitmap_mtr); IBUF_BITMAP_FREE, &bitmap_mtr);
if (buffered + entry_size + page_dir_calc_reserved_space(1) if (buffered + entry_size + page_dir_calc_reserved_space(1)
...@@ -2659,10 +2717,11 @@ ibuf_insert_low( ...@@ -2659,10 +2717,11 @@ ibuf_insert_low(
/* Set the bitmap bit denoting that the insert buffer contains /* Set the bitmap bit denoting that the insert buffer contains
buffered entries for this index page, if the bit is not set yet */ buffered entries for this index page, if the bit is not set yet */
old_bit_value = ibuf_bitmap_page_get_bits(bitmap_page, page_no, old_bit_value = ibuf_bitmap_page_get_bits(
IBUF_BITMAP_BUFFERED, &bitmap_mtr); bitmap_page, page_no, zip_size,
IBUF_BITMAP_BUFFERED, &bitmap_mtr);
if (!old_bit_value) { if (!old_bit_value) {
ibuf_bitmap_page_set_bits(bitmap_page, page_no, ibuf_bitmap_page_set_bits(bitmap_page, page_no, zip_size,
IBUF_BITMAP_BUFFERED, TRUE, &bitmap_mtr); IBUF_BITMAP_BUFFERED, TRUE, &bitmap_mtr);
} }
...@@ -2878,6 +2937,10 @@ ibuf_insert_to_index_page( ...@@ -2878,6 +2937,10 @@ ibuf_insert_to_index_page(
&page_cur, NULL, &page_cur, NULL,
entry, index, NULL, 0, mtr))) { entry, index, NULL, 0, mtr))) {
ulint space;
ulint page_no;
ulint zip_size;
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
...@@ -2892,13 +2955,14 @@ ibuf_insert_to_index_page( ...@@ -2892,13 +2955,14 @@ ibuf_insert_to_index_page(
"InnoDB: is now probably corrupt. Please run CHECK TABLE on\n" "InnoDB: is now probably corrupt. Please run CHECK TABLE on\n"
"InnoDB: that table.\n", stderr); "InnoDB: that table.\n", stderr);
space = buf_frame_get_space_id(page);
zip_size = fil_space_get_zip_size(space);
page_no = buf_frame_get_page_no(page);
bitmap_page = ibuf_bitmap_get_map_page( bitmap_page = ibuf_bitmap_get_map_page(
buf_frame_get_space_id(page), space, page_no, zip_size, mtr);
buf_frame_get_page_no(page),
mtr);
old_bits = ibuf_bitmap_page_get_bits( old_bits = ibuf_bitmap_page_get_bits(
bitmap_page, bitmap_page, page_no, zip_size,
buf_frame_get_page_no(page),
IBUF_BITMAP_FREE, mtr); IBUF_BITMAP_FREE, mtr);
fprintf(stderr, "Bitmap bits %lu\n", (ulong) old_bits); fprintf(stderr, "Bitmap bits %lu\n", (ulong) old_bits);
...@@ -3053,6 +3117,7 @@ ibuf_merge_or_delete_for_page( ...@@ -3053,6 +3117,7 @@ ibuf_merge_or_delete_for_page(
#ifdef UNIV_IBUF_DEBUG #ifdef UNIV_IBUF_DEBUG
ulint volume; ulint volume;
#endif #endif
ulint zip_size;
ibool tablespace_being_deleted = FALSE; ibool tablespace_being_deleted = FALSE;
ibool corruption_noticed = FALSE; ibool corruption_noticed = FALSE;
mtr_t mtr; mtr_t mtr;
...@@ -3070,8 +3135,14 @@ ibuf_merge_or_delete_for_page( ...@@ -3070,8 +3135,14 @@ ibuf_merge_or_delete_for_page(
return; return;
} }
#endif #endif
if (ibuf_fixed_addr_page(space, page_no) || fsp_descr_page(page_no) if (trx_sys_hdr_page(space, page_no)) {
|| trx_sys_hdr_page(space, page_no)) { return;
}
zip_size = fil_space_get_zip_size(space);
if (ibuf_fixed_addr_page(space, zip_size, page_no)
|| fsp_descr_page(zip_size, page_no)) {
return; return;
} }
...@@ -3094,9 +3165,10 @@ ibuf_merge_or_delete_for_page( ...@@ -3094,9 +3165,10 @@ ibuf_merge_or_delete_for_page(
if (update_ibuf_bitmap) { if (update_ibuf_bitmap) {
mtr_start(&mtr); mtr_start(&mtr);
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, &mtr); bitmap_page = ibuf_bitmap_get_map_page(
space, page_no, zip_size, &mtr);
if (!ibuf_bitmap_page_get_bits(bitmap_page, page_no, if (!ibuf_bitmap_page_get_bits(bitmap_page, page_no, zip_size,
IBUF_BITMAP_BUFFERED, &mtr)) { IBUF_BITMAP_BUFFERED, &mtr)) {
/* No inserts buffered for this page */ /* No inserts buffered for this page */
mtr_commit(&mtr); mtr_commit(&mtr);
...@@ -3147,8 +3219,8 @@ ibuf_merge_or_delete_for_page( ...@@ -3147,8 +3219,8 @@ ibuf_merge_or_delete_for_page(
fputs(" InnoDB: Dump of the ibuf bitmap page:\n", fputs(" InnoDB: Dump of the ibuf bitmap page:\n",
stderr); stderr);
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, bitmap_page = ibuf_bitmap_get_map_page(
&mtr); space, page_no, zip_size, &mtr);
buf_page_print(bitmap_page, 0); buf_page_print(bitmap_page, 0);
mtr_commit(&mtr); mtr_commit(&mtr);
...@@ -3271,12 +3343,13 @@ ibuf_merge_or_delete_for_page( ...@@ -3271,12 +3343,13 @@ ibuf_merge_or_delete_for_page(
} }
#endif #endif
if (update_ibuf_bitmap) { if (update_ibuf_bitmap) {
bitmap_page = ibuf_bitmap_get_map_page(space, page_no, &mtr); bitmap_page = ibuf_bitmap_get_map_page(
ibuf_bitmap_page_set_bits(bitmap_page, page_no, space, page_no, zip_size, &mtr);
ibuf_bitmap_page_set_bits(bitmap_page, page_no, zip_size,
IBUF_BITMAP_BUFFERED, FALSE, &mtr); IBUF_BITMAP_BUFFERED, FALSE, &mtr);
if (page) { if (page) {
ulint old_bits = ibuf_bitmap_page_get_bits(bitmap_page, ulint old_bits = ibuf_bitmap_page_get_bits(bitmap_page,
page_no, IBUF_BITMAP_FREE, &mtr); page_no, zip_size, IBUF_BITMAP_FREE, &mtr);
ulint new_bits = ibuf_index_page_calc_free(page); ulint new_bits = ibuf_index_page_calc_free(page);
#ifdef UNIV_IBUF_DEBUG #ifdef UNIV_IBUF_DEBUG
/* fprintf(stderr, "Old bits %lu new bits %lu max size %lu\n", /* fprintf(stderr, "Old bits %lu new bits %lu max size %lu\n",
...@@ -3284,9 +3357,9 @@ ibuf_merge_or_delete_for_page( ...@@ -3284,9 +3357,9 @@ ibuf_merge_or_delete_for_page(
page_get_max_insert_size_after_reorganize(page, 1)); */ page_get_max_insert_size_after_reorganize(page, 1)); */
#endif #endif
if (old_bits != new_bits) { if (old_bits != new_bits) {
ibuf_bitmap_page_set_bits(bitmap_page, page_no, ibuf_bitmap_page_set_bits(
IBUF_BITMAP_FREE, bitmap_page, page_no, zip_size,
new_bits, &mtr); IBUF_BITMAP_FREE, new_bits, &mtr);
} }
} }
} }
......
...@@ -315,6 +315,8 @@ ibool ...@@ -315,6 +315,8 @@ ibool
fsp_descr_page( fsp_descr_page(
/*===========*/ /*===========*/
/* out: TRUE if a descriptor page */ /* out: TRUE if a descriptor page */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
ulint page_no);/* in: page number */ ulint page_no);/* in: page number */
/*************************************************************** /***************************************************************
Parses a redo log record of a file page init. */ Parses a redo log record of a file page init. */
......
...@@ -13,12 +13,16 @@ ibool ...@@ -13,12 +13,16 @@ ibool
fsp_descr_page( fsp_descr_page(
/*===========*/ /*===========*/
/* out: TRUE if a descriptor page */ /* out: TRUE if a descriptor page */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
ulint page_no)/* in: page number */ ulint page_no)/* in: page number */
{ {
if (page_no % XDES_DESCRIBED_PER_PAGE == FSP_XDES_OFFSET) { ut_ad(!(zip_size & (zip_size - 1))); /* must be a power of 2 */
return(TRUE); if (!zip_size) {
return(UNIV_UNLIKELY((page_no & (UNIV_PAGE_SIZE - 1))
== FSP_XDES_OFFSET));
} }
return(FALSE); return(UNIV_UNLIKELY((page_no & (zip_size - 1)) == FSP_XDES_OFFSET));
} }
...@@ -53,6 +53,8 @@ void ...@@ -53,6 +53,8 @@ void
ibuf_bitmap_page_init( ibuf_bitmap_page_init(
/*==================*/ /*==================*/
page_t* page, /* in: bitmap page */ page_t* page, /* in: bitmap page */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
mtr_t* mtr); /* in: mtr */ mtr_t* mtr); /* in: mtr */
/**************************************************************************** /****************************************************************************
Resets the free bits of the page in the ibuf bitmap. This is done in a Resets the free bits of the page in the ibuf bitmap. This is done in a
...@@ -268,6 +270,8 @@ ibuf_parse_bitmap_init( ...@@ -268,6 +270,8 @@ ibuf_parse_bitmap_init(
byte* ptr, /* in: buffer */ byte* ptr, /* in: buffer */
byte* end_ptr,/* in: buffer end */ byte* end_ptr,/* in: buffer end */
page_t* page, /* in: page or NULL */ page_t* page, /* in: page or NULL */
ulint zip_size,/* in: compressed page size in bytes;
0 for uncompressed pages */
mtr_t* mtr); /* in: mtr or NULL */ mtr_t* mtr); /* in: mtr or NULL */
#ifdef UNIV_IBUF_DEBUG #ifdef UNIV_IBUF_DEBUG
/********************************************************************** /**********************************************************************
......
...@@ -878,7 +878,8 @@ recv_parse_or_apply_log_rec_body( ...@@ -878,7 +878,8 @@ recv_parse_or_apply_log_rec_body(
} }
break; break;
case MLOG_IBUF_BITMAP_INIT: case MLOG_IBUF_BITMAP_INIT:
ptr = ibuf_parse_bitmap_init(ptr, end_ptr, page, mtr); ptr = ibuf_parse_bitmap_init(ptr, end_ptr, page,
page_zip ? page_zip->size : 0, mtr);
break; break;
case MLOG_INIT_FILE_PAGE: case MLOG_INIT_FILE_PAGE:
ptr = fsp_parse_init_file_page(ptr, end_ptr, page); ptr = fsp_parse_init_file_page(ptr, end_ptr, page);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment