diff options
Diffstat (limited to 'storage/innobase/page/page0page.cc')
-rw-r--r-- | storage/innobase/page/page0page.cc | 252 |
1 files changed, 4 insertions, 248 deletions
diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc index 36dfabb7c49..3b12ebe2224 100644 --- a/storage/innobase/page/page0page.cc +++ b/storage/innobase/page/page0page.cc @@ -250,43 +250,6 @@ page_set_autoinc( } } -/************************************************************//** -Allocates a block of memory from the heap of an index page. -@return pointer to start of allocated buffer, or NULL if allocation fails */ -byte* -page_mem_alloc_heap( -/*================*/ - page_t* page, /*!< in/out: index page */ - page_zip_des_t* page_zip,/*!< in/out: compressed page with enough - space available for inserting the record, - or NULL */ - ulint need, /*!< in: total number of bytes needed */ - ulint* heap_no)/*!< out: this contains the heap number - of the allocated record - if allocation succeeds */ -{ - byte* block; - ulint avl_space; - - ut_ad(page && heap_no); - - avl_space = page_get_max_insert_size(page, 1); - - if (avl_space >= need) { - block = page_header_get_ptr(page, PAGE_HEAP_TOP); - - page_header_set_ptr(page, page_zip, PAGE_HEAP_TOP, - block + need); - *heap_no = page_dir_get_n_heap(page); - - page_dir_set_n_heap(page, page_zip, 1 + *heap_no); - - return(block); - } - - return(NULL); -} - /**********************************************************//** Writes a log record of page creation. */ UNIV_INLINE @@ -456,10 +419,9 @@ page_create_zip( handle */ { page_t* page; - page_zip_des_t* page_zip = buf_block_get_page_zip(block); ut_ad(block); - ut_ad(page_zip); + ut_ad(buf_block_get_page_zip(block)); ut_ad(dict_table_is_comp(index->table)); /* PAGE_MAX_TRX_ID or PAGE_ROOT_AUTO_INC are always 0 for @@ -482,7 +444,7 @@ page_create_zip( mach_write_to_2(PAGE_HEADER + PAGE_LEVEL + page, level); mach_write_to_8(PAGE_HEADER + PAGE_MAX_TRX_ID + page, max_trx_id); - if (!page_zip_compress(page_zip, page, index, page_zip_level, mtr)) { + if (!page_zip_compress(block, index, page_zip_level, mtr)) { /* The compression of a newly created page should always succeed. */ ut_error; @@ -703,7 +665,7 @@ page_copy_rec_list_end( if (new_page_zip) { mtr_set_log_mode(mtr, log_mode); - if (!page_zip_compress(new_page_zip, new_page, index, + if (!page_zip_compress(new_block, index, page_zip_level, mtr)) { /* Before trying to reorganize the page, store the number of preceding records on the page. */ @@ -868,7 +830,7 @@ page_copy_rec_list_start( DBUG_EXECUTE_IF("page_copy_rec_list_start_compress_fail", goto zip_reorganize;); - if (!page_zip_compress(new_page_zip, new_page, index, + if (!page_zip_compress(new_block, index, page_zip_level, mtr)) { ulint ret_pos; #ifndef DBUG_OFF @@ -1389,212 +1351,6 @@ page_move_rec_list_start( return(TRUE); } -/**************************************************************//** -Used to delete n slots from the directory. This function updates -also n_owned fields in the records, so that the first slot after -the deleted ones inherits the records of the deleted slots. */ -UNIV_INLINE -void -page_dir_delete_slot( -/*=================*/ - page_t* page, /*!< in/out: the index page */ - page_zip_des_t* page_zip,/*!< in/out: compressed page, or NULL */ - ulint slot_no)/*!< in: slot to be deleted */ -{ - page_dir_slot_t* slot; - ulint n_owned; - ulint i; - ulint n_slots; - - ut_ad(!page_zip || page_is_comp(page)); - ut_ad(slot_no > 0); - ut_ad(slot_no + 1 < page_dir_get_n_slots(page)); - - n_slots = page_dir_get_n_slots(page); - - /* 1. Reset the n_owned fields of the slots to be - deleted */ - slot = page_dir_get_nth_slot(page, slot_no); - n_owned = page_dir_slot_get_n_owned(slot); - page_dir_slot_set_n_owned(slot, page_zip, 0); - - /* 2. Update the n_owned value of the first non-deleted slot */ - - slot = page_dir_get_nth_slot(page, slot_no + 1); - page_dir_slot_set_n_owned(slot, page_zip, - n_owned + page_dir_slot_get_n_owned(slot)); - - /* 3. Destroy the slot by copying slots */ - for (i = slot_no + 1; i < n_slots; i++) { - rec_t* rec = (rec_t*) - page_dir_slot_get_rec(page_dir_get_nth_slot(page, i)); - page_dir_slot_set_rec(page_dir_get_nth_slot(page, i - 1), rec); - } - - /* 4. Zero out the last slot, which will be removed */ - mach_write_to_2(page_dir_get_nth_slot(page, n_slots - 1), 0); - - /* 5. Update the page header */ - page_header_set_field(page, page_zip, PAGE_N_DIR_SLOTS, n_slots - 1); -} - -/**************************************************************//** -Used to add n slots to the directory. Does not set the record pointers -in the added slots or update n_owned values: this is the responsibility -of the caller. */ -UNIV_INLINE -void -page_dir_add_slot( -/*==============*/ - page_t* page, /*!< in/out: the index page */ - page_zip_des_t* page_zip,/*!< in/out: comprssed page, or NULL */ - ulint start) /*!< in: the slot above which the new slots - are added */ -{ - page_dir_slot_t* slot; - ulint n_slots; - - n_slots = page_dir_get_n_slots(page); - - ut_ad(start < n_slots - 1); - - /* Update the page header */ - page_dir_set_n_slots(page, page_zip, n_slots + 1); - - /* Move slots up */ - slot = page_dir_get_nth_slot(page, n_slots); - memmove(slot, slot + PAGE_DIR_SLOT_SIZE, - (n_slots - 1 - start) * PAGE_DIR_SLOT_SIZE); -} - -/****************************************************************//** -Splits a directory slot which owns too many records. */ -void -page_dir_split_slot( -/*================*/ - page_t* page, /*!< in/out: index page */ - page_zip_des_t* page_zip,/*!< in/out: compressed page whose - uncompressed part will be written, or NULL */ - ulint slot_no)/*!< in: the directory slot */ -{ - rec_t* rec; - page_dir_slot_t* new_slot; - page_dir_slot_t* prev_slot; - page_dir_slot_t* slot; - ulint i; - ulint n_owned; - - ut_ad(!page_zip || page_is_comp(page)); - ut_ad(slot_no > 0); - - slot = page_dir_get_nth_slot(page, slot_no); - - n_owned = page_dir_slot_get_n_owned(slot); - ut_ad(n_owned == PAGE_DIR_SLOT_MAX_N_OWNED + 1); - - /* 1. We loop to find a record approximately in the middle of the - records owned by the slot. */ - - prev_slot = page_dir_get_nth_slot(page, slot_no - 1); - rec = (rec_t*) page_dir_slot_get_rec(prev_slot); - - for (i = 0; i < n_owned / 2; i++) { - rec = page_rec_get_next(rec); - } - - ut_ad(n_owned / 2 >= PAGE_DIR_SLOT_MIN_N_OWNED); - - /* 2. We add one directory slot immediately below the slot to be - split. */ - - page_dir_add_slot(page, page_zip, slot_no - 1); - - /* The added slot is now number slot_no, and the old slot is - now number slot_no + 1 */ - - new_slot = page_dir_get_nth_slot(page, slot_no); - slot = page_dir_get_nth_slot(page, slot_no + 1); - - /* 3. We store the appropriate values to the new slot. */ - - page_dir_slot_set_rec(new_slot, rec); - page_dir_slot_set_n_owned(new_slot, page_zip, n_owned / 2); - - /* 4. Finally, we update the number of records field of the - original slot */ - - page_dir_slot_set_n_owned(slot, page_zip, n_owned - (n_owned / 2)); -} - -/*************************************************************//** -Tries to balance the given directory slot with too few records with the upper -neighbor, so that there are at least the minimum number of records owned by -the slot; this may result in the merging of two slots. */ -void -page_dir_balance_slot( -/*==================*/ - page_t* page, /*!< in/out: index page */ - page_zip_des_t* page_zip,/*!< in/out: compressed page, or NULL */ - ulint slot_no)/*!< in: the directory slot */ -{ - page_dir_slot_t* slot; - page_dir_slot_t* up_slot; - ulint n_owned; - ulint up_n_owned; - rec_t* old_rec; - rec_t* new_rec; - - ut_ad(!page_zip || page_is_comp(page)); - ut_ad(slot_no > 0); - - slot = page_dir_get_nth_slot(page, slot_no); - - /* The last directory slot cannot be balanced with the upper - neighbor, as there is none. */ - - if (UNIV_UNLIKELY(slot_no + 1 == page_dir_get_n_slots(page))) { - - return; - } - - up_slot = page_dir_get_nth_slot(page, slot_no + 1); - - n_owned = page_dir_slot_get_n_owned(slot); - up_n_owned = page_dir_slot_get_n_owned(up_slot); - - ut_ad(n_owned == PAGE_DIR_SLOT_MIN_N_OWNED - 1); - - /* If the upper slot has the minimum value of n_owned, we will merge - the two slots, therefore we assert: */ - ut_ad(2 * PAGE_DIR_SLOT_MIN_N_OWNED - 1 <= PAGE_DIR_SLOT_MAX_N_OWNED); - - if (up_n_owned > PAGE_DIR_SLOT_MIN_N_OWNED) { - - /* In this case we can just transfer one record owned - by the upper slot to the property of the lower slot */ - old_rec = (rec_t*) page_dir_slot_get_rec(slot); - - if (page_is_comp(page)) { - new_rec = rec_get_next_ptr(old_rec, TRUE); - - rec_set_n_owned_new(old_rec, page_zip, 0); - rec_set_n_owned_new(new_rec, page_zip, n_owned + 1); - } else { - new_rec = rec_get_next_ptr(old_rec, FALSE); - - rec_set_n_owned_old(old_rec, 0); - rec_set_n_owned_old(new_rec, n_owned + 1); - } - - page_dir_slot_set_rec(slot, new_rec); - - page_dir_slot_set_n_owned(up_slot, page_zip, up_n_owned -1); - } else { - /* In this case we may merge the two slots */ - page_dir_delete_slot(page, page_zip, slot_no); - } -} - /************************************************************//** Returns the nth record of the record list. This is the inverse function of page_rec_get_n_recs_before(). |