diff options
Diffstat (limited to 'storage/innobase/include/ibuf0ibuf.ic')
-rw-r--r-- | storage/innobase/include/ibuf0ibuf.ic | 224 |
1 files changed, 0 insertions, 224 deletions
diff --git a/storage/innobase/include/ibuf0ibuf.ic b/storage/innobase/include/ibuf0ibuf.ic deleted file mode 100644 index 4d65a7f5250..00000000000 --- a/storage/innobase/include/ibuf0ibuf.ic +++ /dev/null @@ -1,224 +0,0 @@ -/****************************************************** -Insert buffer - -(c) 1997 Innobase Oy - -Created 7/19/1997 Heikki Tuuri -*******************************************************/ - -#include "buf0lru.h" -#include "page0page.h" - -extern ulint ibuf_flush_count; - -/* If this number is n, an index page must contain at least the page size -per n bytes of free space for ibuf to try to buffer inserts to this page. -If there is this much of free space, the corresponding bits are set in the -ibuf bitmap. */ -#define IBUF_PAGE_SIZE_PER_FREE_SPACE 32 - -/* Insert buffer data struct for a single tablespace */ -struct ibuf_data_struct{ - ulint space; /* space id */ - ulint seg_size;/* allocated pages if the file segment - containing ibuf header and tree */ - ulint size; /* size of the insert buffer tree in pages */ - ibool empty; /* after an insert to the ibuf tree is - performed, this is set to FALSE, and if a - contract operation finds the tree empty, this - is set to TRUE */ - ulint free_list_len; - /* length of the free list */ - ulint height; /* tree height */ - dict_index_t* index; /* insert buffer index */ - UT_LIST_NODE_T(ibuf_data_t) data_list; - /* list of ibuf data structs */ - ulint n_inserts;/* number of inserts made to the insert - buffer */ - ulint n_merges;/* number of pages merged */ - ulint n_merged_recs;/* number of records merged */ -}; - -struct ibuf_struct{ - ulint size; /* current size of the ibuf index - trees in pages */ - ulint max_size; /* recommended maximum size in pages - for the ibuf index tree */ - UT_LIST_BASE_NODE_T(ibuf_data_t) data_list; - /* list of ibuf data structs for - each tablespace */ -}; - -/**************************************************************************** -Sets the free bit of the page in the ibuf bitmap. This is done in a separate -mini-transaction, hence this operation does not restrict further work to only -ibuf bitmap operations, which would result if the latch to the bitmap page -were kept. */ - -void -ibuf_set_free_bits( -/*===============*/ - ulint type, /* in: index type */ - page_t* page, /* in: index page; free bit is reset if the index is - a non-clustered non-unique, and page level is 0 */ - ulint val, /* in: value to set: < 4 */ - ulint max_val);/* in: ULINT_UNDEFINED or a maximum value which - the bits must have before setting; this is for - debugging */ - -/************************************************************************** -A basic partial test if an insert to the insert buffer could be possible and -recommended. */ -UNIV_INLINE -ibool -ibuf_should_try( -/*============*/ - dict_index_t* index, /* in: index where to insert */ - ulint ignore_sec_unique) /* in: if != 0, we should - ignore UNIQUE constraint on - a secondary index when we - decide */ -{ - if (!(index->type & DICT_CLUSTERED) - && (ignore_sec_unique || !(index->type & DICT_UNIQUE))) { - - ibuf_flush_count++; - - if (ibuf_flush_count % 8 == 0) { - - buf_LRU_try_free_flushed_blocks(); - } - - return(TRUE); - } - - return(FALSE); -} - -/*************************************************************************** -Checks if a page address is an ibuf bitmap page address. */ -UNIV_INLINE -ibool -ibuf_bitmap_page( -/*=============*/ - /* out: TRUE if a bitmap page */ - ulint page_no)/* in: page number */ -{ - if (page_no % XDES_DESCRIBED_PER_PAGE == FSP_IBUF_BITMAP_OFFSET) { - - return(TRUE); - } - - return(FALSE); -} - -/************************************************************************* -Translates the free space on a page to a value in the ibuf bitmap.*/ -UNIV_INLINE -ulint -ibuf_index_page_calc_free_bits( -/*===========================*/ - /* out: value for ibuf bitmap bits */ - ulint max_ins_size) /* in: maximum insert size after reorganize - for the page */ -{ - ulint n; - - n = max_ins_size / (UNIV_PAGE_SIZE / IBUF_PAGE_SIZE_PER_FREE_SPACE); - - if (n == 3) { - n = 2; - } - - if (n > 3) { - n = 3; - } - - return(n); -} - -/************************************************************************* -Translates the ibuf free bits to the free space on a page in bytes. */ -UNIV_INLINE -ulint -ibuf_index_page_calc_free_from_bits( -/*================================*/ - /* out: maximum insert size after reorganize for the - page */ - ulint bits) /* in: value for ibuf bitmap bits */ -{ - ut_ad(bits < 4); - - if (bits == 3) { - return(4 * UNIV_PAGE_SIZE / IBUF_PAGE_SIZE_PER_FREE_SPACE); - } - - return(bits * UNIV_PAGE_SIZE / IBUF_PAGE_SIZE_PER_FREE_SPACE); -} - -/************************************************************************* -Translates the free space on a page to a value in the ibuf bitmap.*/ -UNIV_INLINE -ulint -ibuf_index_page_calc_free( -/*======================*/ - /* out: value for ibuf bitmap bits */ - page_t* page) /* in: non-unique secondary index page */ -{ - return(ibuf_index_page_calc_free_bits( - page_get_max_insert_size_after_reorganize(page, 1))); -} - -/**************************************************************************** -Updates the free bits of the page in the ibuf bitmap if there is not enough -free on the page any more. This is done in a separate mini-transaction, hence -this operation does not restrict further work to only ibuf bitmap operations, -which would result if the latch to the bitmap page were kept. */ -UNIV_INLINE -void -ibuf_update_free_bits_if_full( -/*==========================*/ - dict_index_t* index, /* in: index */ - page_t* page, /* in: index page to which we have added new - records; the free bits are updated if the - index is non-clustered and non-unique and - the page level is 0, and the page becomes - fuller */ - ulint max_ins_size,/* in: value of maximum insert size with - reorganize before the latest operation - performed to the page */ - ulint increase)/* in: upper limit for the additional space - used in the latest operation, if known, or - ULINT_UNDEFINED */ -{ - ulint before; - ulint after; - - before = ibuf_index_page_calc_free_bits(max_ins_size); - - if (max_ins_size >= increase) { -#if ULINT32_UNDEFINED <= UNIV_PAGE_SIZE -# error "ULINT32_UNDEFINED <= UNIV_PAGE_SIZE" -#endif - after = ibuf_index_page_calc_free_bits(max_ins_size - - increase); -#ifdef UNIV_IBUF_DEBUG - ut_a(after <= ibuf_index_page_calc_free(page)); -#endif - } else { - after = ibuf_index_page_calc_free(page); - } - - if (after == 0) { - /* We move the page to the front of the buffer pool LRU list: - the purpose of this is to prevent those pages to which we - cannot make inserts using the insert buffer from slipping - out of the buffer pool */ - - buf_page_make_young(page); - } - - if (before > after) { - ibuf_set_free_bits(index->type, page, after, before); - } -} |