Skip to content

Commit 26e4403

Browse files
author
Jan Lindström
committed
MDEV-8819: Failing assertion: block->page.space == page_get_space_id(page_align(ptr)) in file buf0buf.cc line 2551
Add error handling on page reading and do not try to access empty pages.
1 parent 9554342 commit 26e4403

File tree

4 files changed

+36
-16
lines changed

4 files changed

+36
-16
lines changed

storage/innobase/buf/buf0buf.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,7 @@ buf_page_print(
905905
mach_read_from_4(read_buf
906906
+ FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID));
907907

908-
ulint page_type = mach_read_from_4(read_buf + FIL_PAGE_TYPE);
908+
ulint page_type = fil_page_get_type(read_buf);
909909

910910
fprintf(stderr, "InnoDB: page type %ld meaning %s\n", page_type,
911911
fil_get_page_type_name(page_type));

storage/innobase/ibuf/ibuf0ibuf.cc

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -851,12 +851,18 @@ ibuf_bitmap_get_map_page_func(
851851
ulint line, /*!< in: line where called */
852852
mtr_t* mtr) /*!< in: mtr */
853853
{
854-
buf_block_t* block;
854+
buf_block_t* block = NULL;
855+
dberr_t err = DB_SUCCESS;
855856

856857
block = buf_page_get_gen(space, zip_size,
857858
ibuf_bitmap_page_no_calc(zip_size, page_no),
858859
RW_X_LATCH, NULL, BUF_GET,
859-
file, line, mtr);
860+
file, line, mtr, &err);
861+
862+
if (err != DB_SUCCESS) {
863+
return NULL;
864+
}
865+
860866
buf_block_dbg_add_level(block, SYNC_IBUF_BITMAP);
861867

862868
return(buf_block_get_frame(block));
@@ -4631,16 +4637,20 @@ ibuf_merge_or_delete_for_page(
46314637
block = NULL;
46324638
update_ibuf_bitmap = FALSE;
46334639
} else {
4634-
page_t* bitmap_page;
4635-
ulint bitmap_bits;
4640+
page_t* bitmap_page = NULL;
4641+
ulint bitmap_bits = 0;
46364642

46374643
ibuf_mtr_start(&mtr);
46384644

46394645
bitmap_page = ibuf_bitmap_get_map_page(
46404646
space, page_no, zip_size, &mtr);
4641-
bitmap_bits = ibuf_bitmap_page_get_bits(
4642-
bitmap_page, page_no, zip_size,
4643-
IBUF_BITMAP_BUFFERED, &mtr);
4647+
4648+
if (bitmap_page &&
4649+
fil_page_get_type(bitmap_page) != FIL_PAGE_TYPE_ALLOCATED) {
4650+
bitmap_bits = ibuf_bitmap_page_get_bits(
4651+
bitmap_page, page_no, zip_size,
4652+
IBUF_BITMAP_BUFFERED, &mtr);
4653+
}
46444654

46454655
ibuf_mtr_commit(&mtr);
46464656

storage/xtradb/buf/buf0buf.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,7 +981,7 @@ buf_page_print(
981981
mach_read_from_4(read_buf
982982
+ FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID));
983983

984-
ulint page_type = mach_read_from_4(read_buf + FIL_PAGE_TYPE);
984+
ulint page_type = fil_page_get_type(read_buf);
985985

986986
fprintf(stderr, "InnoDB: page type %ld meaning %s\n", page_type,
987987
fil_get_page_type_name(page_type));

storage/xtradb/ibuf/ibuf0ibuf.cc

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -892,12 +892,18 @@ ibuf_bitmap_get_map_page_func(
892892
ulint line, /*!< in: line where called */
893893
mtr_t* mtr) /*!< in: mtr */
894894
{
895-
buf_block_t* block;
895+
buf_block_t* block = NULL;
896+
dberr_t err = DB_SUCCESS;
896897

897898
block = buf_page_get_gen(space, zip_size,
898899
ibuf_bitmap_page_no_calc(zip_size, page_no),
899900
RW_X_LATCH, NULL, BUF_GET,
900-
file, line, mtr);
901+
file, line, mtr, &err);
902+
903+
if (err != DB_SUCCESS) {
904+
return NULL;
905+
}
906+
901907
buf_block_dbg_add_level(block, SYNC_IBUF_BITMAP);
902908

903909
return(buf_block_get_frame(block));
@@ -4674,16 +4680,20 @@ ibuf_merge_or_delete_for_page(
46744680
block = NULL;
46754681
update_ibuf_bitmap = FALSE;
46764682
} else {
4677-
page_t* bitmap_page;
4678-
ulint bitmap_bits;
4683+
page_t* bitmap_page = NULL;
4684+
ulint bitmap_bits = 0;
46794685

46804686
ibuf_mtr_start(&mtr);
46814687

46824688
bitmap_page = ibuf_bitmap_get_map_page(
46834689
space, page_no, zip_size, &mtr);
4684-
bitmap_bits = ibuf_bitmap_page_get_bits(
4685-
bitmap_page, page_no, zip_size,
4686-
IBUF_BITMAP_BUFFERED, &mtr);
4690+
4691+
if (bitmap_page &&
4692+
fil_page_get_type(bitmap_page) != FIL_PAGE_TYPE_ALLOCATED) {
4693+
bitmap_bits = ibuf_bitmap_page_get_bits(
4694+
bitmap_page, page_no, zip_size,
4695+
IBUF_BITMAP_BUFFERED, &mtr);
4696+
}
46874697

46884698
ibuf_mtr_commit(&mtr);
46894699

0 commit comments

Comments
 (0)