Bug #20796566 ERROR: INSERT BUFFER INSERT FAIL CANNOT

			INSERT INDEX RECORD

Problem:
=======

IBUF_BITMAP_FREE bit in ibuf bitmap array is used to indicate the free
space available in leaf page. IBUF_BITMAP_FREE bit indicates free
space more than actual existing free space for the leaf page.

Solution:
=========

Ibuf_bitmap_array is not updated for the secondary index leaf page when
insert operation is done by updating a delete marked existing
record in the index.
Reviewed-by: default avatarJimmy Yang <jimmy.yang@oracle.com>
RB: 9544
parent 33a2e5ab
/***************************************************************************** /*****************************************************************************
Copyright (c) 1994, 2013, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1994, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc. Copyright (c) 2008, Google Inc.
Portions of this file contain modifications contributed and copyrighted by Portions of this file contain modifications contributed and copyrighted by
...@@ -1894,6 +1894,7 @@ btr_cur_optimistic_update( ...@@ -1894,6 +1894,7 @@ btr_cur_optimistic_update(
ulint max_size; ulint max_size;
ulint new_rec_size; ulint new_rec_size;
ulint old_rec_size; ulint old_rec_size;
ulint max_ins_size = 0;
dtuple_t* new_entry; dtuple_t* new_entry;
roll_ptr_t roll_ptr; roll_ptr_t roll_ptr;
mem_heap_t* heap; mem_heap_t* heap;
...@@ -2004,6 +2005,11 @@ btr_cur_optimistic_update( ...@@ -2004,6 +2005,11 @@ btr_cur_optimistic_update(
: (old_rec_size : (old_rec_size
+ page_get_max_insert_size_after_reorganize(page, 1)); + page_get_max_insert_size_after_reorganize(page, 1));
if (!page_zip) {
max_ins_size = page_get_max_insert_size_after_reorganize(
page, 1);
}
if (!(((max_size >= BTR_CUR_PAGE_REORGANIZE_LIMIT) if (!(((max_size >= BTR_CUR_PAGE_REORGANIZE_LIMIT)
&& (max_size >= new_rec_size)) && (max_size >= new_rec_size))
|| (page_get_n_recs(page) <= 1))) { || (page_get_n_recs(page) <= 1))) {
...@@ -2053,10 +2059,14 @@ btr_cur_optimistic_update( ...@@ -2053,10 +2059,14 @@ btr_cur_optimistic_update(
rec = btr_cur_insert_if_possible(cursor, new_entry, 0/*n_ext*/, mtr); rec = btr_cur_insert_if_possible(cursor, new_entry, 0/*n_ext*/, mtr);
ut_a(rec); /* <- We calculated above the insert would fit */ ut_a(rec); /* <- We calculated above the insert would fit */
if (page_zip && !dict_index_is_clust(index) if (!dict_index_is_clust(index)
&& page_is_leaf(page)) { && page_is_leaf(page)) {
/* Update the free bits in the insert buffer. */ /* Update the free bits in the insert buffer. */
if (page_zip) {
ibuf_update_free_bits_zip(block, mtr); ibuf_update_free_bits_zip(block, mtr);
} else {
ibuf_update_free_bits_low(block, max_ins_size, mtr);
}
} }
/* Restore the old explicit lock state on the record */ /* Restore the old explicit lock state on the record */
...@@ -2165,6 +2175,7 @@ btr_cur_pessimistic_update( ...@@ -2165,6 +2175,7 @@ btr_cur_pessimistic_update(
ulint n_reserved; ulint n_reserved;
ulint n_ext; ulint n_ext;
ulint* offsets = NULL; ulint* offsets = NULL;
ulint max_ins_size = 0;
*big_rec = NULL; *big_rec = NULL;
...@@ -2302,6 +2313,11 @@ btr_cur_pessimistic_update( ...@@ -2302,6 +2313,11 @@ btr_cur_pessimistic_update(
ut_ad(flags & BTR_KEEP_POS_FLAG); ut_ad(flags & BTR_KEEP_POS_FLAG);
} }
if (!page_zip) {
max_ins_size = page_get_max_insert_size_after_reorganize(
page, 1);
}
/* Store state of explicit locks on rec on the page infimum record, /* Store state of explicit locks on rec on the page infimum record,
before deleting rec. The page infimum acts as a dummy carrier of the before deleting rec. The page infimum acts as a dummy carrier of the
locks, taking care also of lock releases, before we can move the locks locks, taking care also of lock releases, before we can move the locks
...@@ -2347,10 +2363,15 @@ btr_cur_pessimistic_update( ...@@ -2347,10 +2363,15 @@ btr_cur_pessimistic_update(
big_rec_vec != NULL && (flags & BTR_KEEP_POS_FLAG), big_rec_vec != NULL && (flags & BTR_KEEP_POS_FLAG),
mtr); mtr);
if (page_zip && !dict_index_is_clust(index) if (!dict_index_is_clust(index)
&& page_is_leaf(page)) { && page_is_leaf(page)) {
/* Update the free bits in the insert buffer. */ /* Update the free bits in the insert buffer. */
if (page_zip) {
ibuf_update_free_bits_zip(block, mtr); ibuf_update_free_bits_zip(block, mtr);
} else {
ibuf_update_free_bits_low(block, max_ins_size,
mtr);
}
} }
err = DB_SUCCESS; err = DB_SUCCESS;
......
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