Commit 949112c1 authored by unknown's avatar unknown
Browse files

Fix bugs found in previous optimizations.

Make rec_get_deleted_flag() return zero/nonzero instead of FALSE/TRUE.


innobase/btr/btr0btr.c:
  btr_page_get_sure_split_rec(): Fix bug caused by optimization
  (dereferencing null pointer in page_rec_is_supremum())
  btr_page_insert_fits(): Correct a debug assertion.
innobase/btr/btr0cur.c:
  Add debug assertions about page_rec_is_comp().
  Add UNIV_LIKELY and UNIV_UNLIKELY hints.
  Note that rec_get_deleted_flag() returns zero/nonzero ulint
  instead of FALSE/TRUE ibool.
innobase/include/page0page.ic:
  Move debug assertion to proper place.
innobase/include/rem0rec.h:
  rec_get_deleted_flag(), rec_set_deleted_flag(): Make the flag
  zero/nonzero in order to avoid FALSE/TRUE normalization in
  every rec_get_deleted_flag() call.
innobase/include/rem0rec.ic:
  rec_get_deleted_flag(), rec_set_deleted_flag(): Make the flag
  zero/nonzero in order to avoid FALSE/TRUE normalization in
  every rec_get_deleted_flag() call.
innobase/rem/rem0rec.c:
  rec_init_offsets(): Fix bugs introduced in optimization.
innobase/row/row0sel.c:
  Make debug assertion stricter.
innobase/row/row0vers.c:
  Note that rec_get_deleted_flag() returns zero/nonzero ulint
  instead of FALSE/TRUE ibool.
parent 4a3a46af
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -1273,17 +1273,20 @@ btr_page_get_sure_split_rec(
                    	    	supremum record of page */

				if (rec == ins_rec) {
					next_rec = NULL;
					rec = NULL;
					goto func_exit;
				} else if (rec == NULL) {
					next_rec = page_rec_get_next(ins_rec);
				} else {
					next_rec = page_rec_get_next(rec);
				}
				if (!page_rec_is_supremum(next_rec))) {
				ut_ad(next_rec);
				if (!page_rec_is_supremum(next_rec)) {
					rec = next_rec;
				}
                    	}

		func_exit:
			if (UNIV_LIKELY_NULL(heap)) {
				mem_heap_free(heap);
			}
@@ -1323,7 +1326,7 @@ btr_page_insert_fits(

	ut_ad(!split_rec == !offsets);
	ut_ad(!offsets
		|| page_is_comp(page) == !!rec_offs_comp(offsets));
		|| !page_is_comp(page) == !rec_offs_comp(offsets));
	ut_ad(!offsets
		|| rec_offs_validate(split_rec, cursor->index, offsets));

+13 −9
Original line number Diff line number Diff line
@@ -1426,7 +1426,7 @@ btr_cur_update_in_place(
	rec_t*		rec;
	dulint		roll_ptr	= ut_dulint_zero;
	trx_t*		trx;
	ibool		was_delete_marked;
	ulint		was_delete_marked;
	mem_heap_t*	heap		= NULL;
	ulint		offsets_[REC_OFFS_NORMAL_SIZE];
	ulint*		offsets		= offsets_;
@@ -1434,6 +1434,7 @@ btr_cur_update_in_place(

	rec = btr_cur_get_rec(cursor);
	index = cursor->index;
	ut_ad(!!page_rec_is_comp(rec) == index->table->comp);
	trx = thr_get_trx(thr);
	offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap);

@@ -1547,6 +1548,7 @@ btr_cur_optimistic_update(
	page = btr_cur_get_page(cursor);
	rec = btr_cur_get_rec(cursor);
	index = cursor->index;
	ut_ad(!!page_rec_is_comp(rec) == index->table->comp);
	
	heap = mem_heap_create(1024);
	offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap);
@@ -1596,8 +1598,8 @@ btr_cur_optimistic_update(
	old_rec_size = rec_offs_size(offsets);
	new_rec_size = rec_get_converted_size(index, new_entry);
	
	if (new_rec_size >=
			page_get_free_space_of_empty(page_is_comp(page)) / 2) {
	if (UNIV_UNLIKELY(new_rec_size >= page_get_free_space_of_empty(
				page_is_comp(page)) / 2)) {

		mem_heap_free(heap);		

@@ -1607,8 +1609,9 @@ btr_cur_optimistic_update(
	max_size = old_rec_size
			+ page_get_max_insert_size_after_reorganize(page, 1);

	if (page_get_data_size(page) - old_rec_size + new_rec_size
					< BTR_CUR_PAGE_COMPRESS_LIMIT) {
	if (UNIV_UNLIKELY(page_get_data_size(page)
					- old_rec_size + new_rec_size
					< BTR_CUR_PAGE_COMPRESS_LIMIT)) {

		/* The page would become too empty */

@@ -2034,14 +2037,14 @@ btr_cur_parse_del_mark_set_clust_rec(
	page_t*		page)	/* in: page or NULL */
{
	ulint	flags;
	ibool	val;
	ulint	val;
	ulint	pos;
	dulint	trx_id;
	dulint	roll_ptr;
	ulint	offset;
	rec_t*	rec;

	ut_ad(!!page_is_comp(page) == index->table->comp);
	ut_ad(!page || !!page_is_comp(page) == index->table->comp);

	if (end_ptr < ptr + 2) {

@@ -2127,6 +2130,7 @@ btr_cur_del_mark_set_clust_rec(

	rec = btr_cur_get_rec(cursor);
	index = cursor->index;
	ut_ad(!!page_rec_is_comp(rec) == index->table->comp);
	offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap);

	if (btr_cur_print_record_ops && thr) {
@@ -2135,7 +2139,7 @@ btr_cur_del_mark_set_clust_rec(
	}

	ut_ad(index->type & DICT_CLUSTERED);
	ut_ad(rec_get_deleted_flag(rec, index->table->comp) == FALSE);
	ut_ad(!rec_get_deleted_flag(rec, rec_offs_comp(offsets)));

	err = lock_clust_rec_modify_check_and_lock(flags,
						rec, index, offsets, thr);
@@ -2230,7 +2234,7 @@ btr_cur_parse_del_mark_set_sec_rec(
	byte*		end_ptr,/* in: buffer end */
	page_t*		page)	/* in: page or NULL */
{
	ibool	val;
	ulint	val;
	ulint	offset;
	rec_t*	rec;

+1 −1
Original line number Diff line number Diff line
@@ -593,10 +593,10 @@ page_rec_set_next(

	ut_ad(page_rec_check(rec));	
	ut_ad(!page_rec_is_supremum(rec));
	ut_ad(!page_rec_is_infimum(next));
	page = ut_align_down(rec, UNIV_PAGE_SIZE);

	if (next) {
		ut_ad(!page_rec_is_infimum(next));
		ut_a(page == ut_align_down(next, UNIV_PAGE_SIZE));
		offs = (ulint) (next - page);
	} else {
+3 −3
Original line number Diff line number Diff line
@@ -162,10 +162,10 @@ rec_set_info_and_status_bits(
/**********************************************************
The following function tells if record is delete marked. */
UNIV_INLINE
ibool
ulint
rec_get_deleted_flag(
/*=================*/
			/* out: TRUE if delete marked */
			/* out: nonzero if delete marked */
	rec_t*	rec,	/* in: physical record */
	ulint	comp);	/* in: nonzero=compact page format */
/**********************************************************
@@ -176,7 +176,7 @@ rec_set_deleted_flag(
/*=================*/
	rec_t*	rec,	/* in: physical record */
	ulint	comp,	/* in: nonzero=compact page format */
	ibool	flag);	/* in: TRUE if delete marked */
	ulint	flag);	/* in: nonzero if delete marked */
/**********************************************************
The following function tells if a new-style record is a node pointer. */
UNIV_INLINE
+9 −10
Original line number Diff line number Diff line
@@ -578,19 +578,21 @@ rec_set_info_and_status_bits(
/**********************************************************
The following function tells if record is delete marked. */
UNIV_INLINE
ibool
ulint
rec_get_deleted_flag(
/*=================*/
			/* out: TRUE if delete marked */
			/* out: nonzero if delete marked */
	rec_t*	rec,	/* in: physical record */
	ulint	comp)	/* in: nonzero=compact page format */
{
	if (UNIV_EXPECT(comp, REC_OFFS_COMPACT)) {
		return(0 != rec_get_bit_field_1(rec, REC_NEW_INFO_BITS,
				REC_INFO_DELETED_FLAG, REC_INFO_BITS_SHIFT));
		return(UNIV_UNLIKELY(rec_get_bit_field_1(rec,
				REC_NEW_INFO_BITS, REC_INFO_DELETED_FLAG,
				REC_INFO_BITS_SHIFT)));
	} else {
		return(0 != rec_get_bit_field_1(rec, REC_OLD_INFO_BITS,
				REC_INFO_DELETED_FLAG, REC_INFO_BITS_SHIFT));
		return(UNIV_UNLIKELY(rec_get_bit_field_1(rec,
				REC_OLD_INFO_BITS, REC_INFO_DELETED_FLAG,
				REC_INFO_BITS_SHIFT)));
	}
}

@@ -602,13 +604,10 @@ rec_set_deleted_flag(
/*=================*/
	rec_t*	rec,	/* in: physical record */
	ulint	comp,	/* in: nonzero=compact page format */
	ibool	flag)	/* in: TRUE if delete marked */
	ulint	flag)	/* in: nonzero if delete marked */
{
	ulint	val;

	ut_ad(TRUE == 1);
	ut_ad(flag <= TRUE);

	val = rec_get_info_bits(rec, comp);
	
	if (flag) {
Loading