Commit b9b69440 authored by unknown's avatar unknown
Browse files

InnoDB: Zero fill newly created pages and deleted records to

remove old junk and to improve compression ratio.
InnoDB: Make implicit type conversions explicit. (Bug #8826)


innobase/btr/btr0cur.c:
  Add "offsets" parameter to page_cur_delete_rec() calls
  btr_cur_optimistic_delete(): Simplify the logic with a flag variable
  btr_cur_pessimistic_delete(): Compute "offsets" earlier
innobase/include/page0cur.h:
  page_cur_delete_rec(): Add parameter "offsets"
innobase/include/page0page.h:
  page_mem_free(): Replace parameter "index" with "offsets"
innobase/include/page0page.ic:
  page_mem_free(): Replace parameter "index" with "offsets".
  Clear the data bytes of the freed record.
  (The "extra" bytes will be needed by free space management.)
innobase/include/rem0rec.h:
  Remove unnecessary function rec_get_size()
innobase/log/log0recv.c:
  Remove function rec_apply_log_recs_for_backup()
  unless #ifdef UNIV_HOTBACKUP.
innobase/page/page0cur.c:
  Add parameter "offsets" to page_cur_delete_rec().
innobase/page/page0page.c:
  page_create(): Zero fill the data area.
  page_delete_rec_list_start(): Add parameter "offsets"
  to page_cur_delete_rec().
innobase/rem/rem0rec.c:
  Remove unnecessary function rec_get_size().
  Fix compiler warnings about implicit type conversions.  (Bug #8826)
innobase/srv/srv0srv.c:
  Fix compiler warnings about implicit type conversions. (Bug #8826)
innobase/sync/sync0sync.c:
  Fix compiler warnings about implicit type conversions. (Bug #8826)
parent 679088a2
Loading
Loading
Loading
Loading
+19 −17
Original line number Diff line number Diff line
@@ -1642,7 +1642,7 @@ btr_cur_optimistic_update(

	btr_search_update_hash_on_delete(cursor);

	page_cur_delete_rec(page_cursor, index, mtr);
	page_cur_delete_rec(page_cursor, index, offsets, mtr);

	page_cur_move_to_prev(page_cursor);
        
@@ -1885,7 +1885,7 @@ btr_cur_pessimistic_update(

	btr_search_update_hash_on_delete(cursor);

	page_cur_delete_rec(page_cursor, index, mtr);
	page_cur_delete_rec(page_cursor, index, offsets, mtr);

	page_cur_move_to_prev(page_cursor);

@@ -2401,6 +2401,7 @@ btr_cur_optimistic_delete(
	mem_heap_t*	heap		= NULL;
	ulint		offsets_[100]	= { 100, };
	ulint*		offsets		= offsets_;
	ibool		no_compress_needed;

	ut_ad(mtr_memo_contains(mtr, buf_block_align(btr_cur_get_page(cursor)),
							MTR_MEMO_PAGE_X_FIX));
@@ -2414,9 +2415,11 @@ btr_cur_optimistic_delete(
	offsets = rec_get_offsets(rec, cursor->index, offsets,
					ULINT_UNDEFINED, &heap);

	if (!rec_offs_any_extern(offsets)
	no_compress_needed = !rec_offs_any_extern(offsets)
			&& btr_cur_can_delete_without_compress(
			cursor, rec_offs_size(offsets), mtr)) {
			cursor, rec_offs_size(offsets), mtr);

	if (no_compress_needed) {

		lock_update_delete(rec);

@@ -2425,20 +2428,17 @@ btr_cur_optimistic_delete(
		max_ins_size = page_get_max_insert_size_after_reorganize(page,
									1);
		page_cur_delete_rec(btr_cur_get_page_cur(cursor),
							cursor->index, mtr);
						cursor->index, offsets, mtr);

		ibuf_update_free_bits_low(cursor->index, page, max_ins_size,
									mtr);
		if (heap) {
			mem_heap_free(heap);
		}
		return(TRUE);
	}

	if (heap) {
		mem_heap_free(heap);
	}
	return(FALSE);

	return(no_compress_needed);
}

/*****************************************************************
@@ -2478,6 +2478,7 @@ btr_cur_pessimistic_delete(
	ibool		success;
	ibool		ret		= FALSE;
	mem_heap_t*	heap;
	ulint*		offsets;
	
	page = btr_cur_get_page(cursor);
	tree = btr_cur_get_tree(cursor);
@@ -2503,20 +2504,20 @@ btr_cur_pessimistic_delete(
		}
	}

	heap = mem_heap_create(256);
	heap = mem_heap_create(1024);
	rec = btr_cur_get_rec(cursor);

	offsets = rec_get_offsets(rec, cursor->index,
					NULL, ULINT_UNDEFINED, &heap);

	/* Free externally stored fields if the record is neither
	a node pointer nor in two-byte format.
	This avoids unnecessary calls to rec_get_offsets(). */
	This avoids an unnecessary loop. */
	if (cursor->index->table->comp
			? !rec_get_node_ptr_flag(rec)
			: !rec_get_1byte_offs_flag(rec)) {
		btr_rec_free_externally_stored_fields(cursor->index,
			rec, rec_get_offsets(rec, cursor->index,
					NULL, ULINT_UNDEFINED, &heap),
			in_rollback, mtr);
		mem_heap_empty(heap);
					rec, offsets, in_rollback, mtr);
	}

	if ((page_get_n_recs(page) < 2)
@@ -2568,7 +2569,8 @@ btr_cur_pessimistic_delete(

	btr_search_update_hash_on_delete(cursor);

	page_cur_delete_rec(btr_cur_get_page_cur(cursor), cursor->index, mtr);
	page_cur_delete_rec(btr_cur_get_page_cur(cursor), cursor->index,
							offsets, mtr);

	ut_ad(btr_check_node_ptr(tree, page, mtr));

+4 −3
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ page_cur_delete_rec(
/*================*/
	page_cur_t*  	cursor,	/* in: a page cursor */
	dict_index_t*	index,	/* in: record descriptor */
	const ulint*	offsets,/* in: rec_get_offsets(cursor->rec, index) */
	mtr_t*		mtr);	/* in: mini-transaction handle */
/********************************************************************
Searches the right position for a page cursor. */
+1 −1
Original line number Diff line number Diff line
@@ -528,7 +528,7 @@ page_mem_free(
/*==========*/
	page_t*		page,	/* in: index page */
	rec_t*		rec,	/* in: pointer to the (origin of) record */
	dict_index_t*	index);	/* in: record descriptor */
	const ulint*	offsets);/* in: array returned by rec_get_offsets() */
/**************************************************************
The index page creation function. */

+10 −2
Original line number Diff line number Diff line
@@ -777,20 +777,28 @@ page_mem_free(
/*==========*/
	page_t*		page,	/* in: index page */
	rec_t*		rec,	/* in: pointer to the (origin of) record */
	dict_index_t*	index)	/* in: record descriptor */
	const ulint*	offsets)/* in: array returned by rec_get_offsets() */
{
	rec_t*		free;
	ulint		garbage;

	ut_ad(rec_offs_validate(rec, NULL, offsets));
	free = page_header_get_ptr(page, PAGE_FREE);

	page_rec_set_next(rec, free);
	page_header_set_ptr(page, PAGE_FREE, rec);

	/* Clear the data bytes of the deleted record in order to improve
	the compression ratio of the page and to make it easier to read
	page dumps in corruption reports.  The extra bytes of the record
	cannot be cleared, because page_mem_alloc() needs them in order
	to determine the size of the deleted record. */
	memset(rec, 0, rec_offs_data_size(offsets));

	garbage = page_header_get_field(page, PAGE_GARBAGE);

	page_header_set_field(page, PAGE_GARBAGE,
				garbage + rec_get_size(rec, index));
				garbage + rec_offs_size(offsets));
}

#ifdef UNIV_MATERIALIZE
+0 −9
Original line number Diff line number Diff line
@@ -435,15 +435,6 @@ rec_offs_size(
				/* out: size */
	const ulint*	offsets);/* in: array returned by rec_get_offsets() */
/**************************************************************
Returns the total size of a physical record.  */

ulint
rec_get_size(
/*=========*/
				/* out: size */
	rec_t*		rec,	/* in: physical record */
	dict_index_t*	index);	/* in: record descriptor */
/**************************************************************
Returns a pointer to the start of the record. */
UNIV_INLINE
byte*
Loading