Skip to content

Commit 8d5532b

Browse files
author
Allen Lai
committed
Fixed bug#22698076 INNODB: FAILING ASSERTION:
!(REC_GET_INFO_BITS(REC2, COMP) & 0X10UL) 1:We need to remove some code of checking if pk fields changed in rtr_merge_mbr_changed. Since we've removed pk fields of internal node of R-Tree in wl#7740, we just need to check MBR field is changed or not only. We don't need to check other fields anymore. 2:And a wrong rec order issue is caused by the internal recs order is not same as the page order, and if page merge to its right page when R-Tree is shrinking, it'll cause wrong recs order. Reviewed-by Jimmy Yang<jimmy.yang@eracle.com> RB: 12089
1 parent 9cb3e5d commit 8d5532b

File tree

2 files changed

+27
-35
lines changed

2 files changed

+27
-35
lines changed

storage/innobase/btr/btr0btr.cc

+27-5
Original file line numberDiff line numberDiff line change
@@ -3631,6 +3631,8 @@ btr_compress(
36313631
/* For rtree, we need to update father's mbr. */
36323632
if (dict_index_is_spatial(index)) {
36333633
ulint* offsets2;
3634+
ulint rec_info;
3635+
36343636
offsets2 = rec_get_offsets(
36353637
btr_cur_get_rec(&cursor2),
36363638
index, NULL, ULINT_UNDEFINED, &heap);
@@ -3639,11 +3641,31 @@ btr_compress(
36393641
btr_cur_get_rec(&cursor2), offsets2)
36403642
== right_page_no);
36413643

3642-
rtr_merge_and_update_mbr(&father_cursor,
3643-
&cursor2,
3644-
offsets, offsets2,
3645-
merge_page, merge_block,
3646-
block, index, mtr);
3644+
rec_info = rec_get_info_bits(
3645+
btr_cur_get_rec(&father_cursor),
3646+
rec_offs_comp(offsets));
3647+
if (rec_info & REC_INFO_MIN_REC_FLAG) {
3648+
/* When the father node ptr is minimal rec,
3649+
we will keep it and delete the node ptr of
3650+
merge page. */
3651+
rtr_merge_and_update_mbr(&father_cursor,
3652+
&cursor2,
3653+
offsets, offsets2,
3654+
merge_page,
3655+
merge_block,
3656+
block, index, mtr);
3657+
} else {
3658+
/* Otherwise, we will keep the node ptr of
3659+
merge page and delete the father node ptr.
3660+
This is for keeping the rec order in upper
3661+
level. */
3662+
rtr_merge_and_update_mbr(&cursor2,
3663+
&father_cursor,
3664+
offsets2, offsets,
3665+
merge_page,
3666+
merge_block,
3667+
block, index, mtr);
3668+
}
36473669
lock_mutex_enter();
36483670
lock_rec_free_all_from_discard_page(block);
36493671
lock_mutex_exit();

storage/innobase/gis/gis0rtree.cc

-30
Original file line numberDiff line numberDiff line change
@@ -1687,36 +1687,6 @@ rtr_merge_mbr_changed(
16871687
mbr++;
16881688
}
16891689

1690-
if (!changed) {
1691-
rec_t* rec1;
1692-
rec_t* rec2;
1693-
ulint* offsets1;
1694-
ulint* offsets2;
1695-
mem_heap_t* heap;
1696-
1697-
heap = mem_heap_create(100);
1698-
1699-
rec1 = page_rec_get_next(
1700-
page_get_infimum_rec(
1701-
buf_block_get_frame(merge_block)));
1702-
1703-
offsets1 = rec_get_offsets(
1704-
rec1, index, NULL, ULINT_UNDEFINED, &heap);
1705-
1706-
rec2 = page_rec_get_next(
1707-
page_get_infimum_rec(
1708-
buf_block_get_frame(block)));
1709-
offsets2 = rec_get_offsets(
1710-
rec2, index, NULL, ULINT_UNDEFINED, &heap);
1711-
1712-
/* Check any primary key fields have been changed */
1713-
if (cmp_rec_rec(rec1, rec2, offsets1, offsets2, index) != 0) {
1714-
changed = true;
1715-
}
1716-
1717-
mem_heap_free(heap);
1718-
}
1719-
17201690
return(changed);
17211691
}
17221692

0 commit comments

Comments
 (0)