ibuf0ibuf.ic
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Insert buffer
  3. (c) 1997 Innobase Oy
  4. Created 7/19/1997 Heikki Tuuri
  5. *******************************************************/
  6. #include "buf0lru.h"
  7. #include "page0page.h"
  8. extern ulint ibuf_flush_count;
  9. /* If this number is n, an index page must contain at least the page size
  10. per n bytes of free space for ibuf to try to buffer inserts to this page.
  11. If there is this much of free space, the corresponding bits are set in the
  12. ibuf bitmap. */
  13. #define IBUF_PAGE_SIZE_PER_FREE_SPACE 32
  14. /* Insert buffer data struct for a single tablespace */
  15. struct ibuf_data_struct{
  16. ulint space; /* space id */
  17. ulint seg_size;/* allocated pages if the file segment
  18. containing ibuf header and tree */
  19. ulint size; /* size of the insert buffer tree in pages */
  20. ibool empty; /* after an insert to the ibuf tree is
  21. performed, this is set to FALSE, and if a
  22. contract operation finds the tree empty, this
  23. is set to TRUE */
  24. ulint free_list_len;
  25. /* length of the free list */
  26. ulint height; /* tree height */
  27. dict_index_t* index; /* insert buffer index */
  28. UT_LIST_NODE_T(ibuf_data_t) data_list;
  29. /* list of ibuf data structs */
  30. ulint n_inserts;/* number of inserts made to the insert
  31. buffer */
  32. ulint n_merges;/* number of pages merged */
  33. ulint n_merged_recs;/* number of records merged */
  34. };
  35. /* If the ibuf meter exceeds this value, then the suitable inserts are made to
  36. the insert buffer instead of directly to the disk page */
  37. #define IBUF_THRESHOLD 50
  38. struct ibuf_struct{
  39. ulint size; /* current size of the ibuf index
  40. trees in pages */
  41. ulint max_size; /* recommended maximum size in pages
  42. for the ibuf index tree */
  43. ulint meter; /* heuristic meter which measures
  44. desirability of doing inserts to the
  45. insert buffer instead of directly to
  46. the disk page */
  47. UT_LIST_BASE_NODE_T(ibuf_data_t) data_list;
  48. /* list of ibuf data structs for
  49. each tablespace */
  50. };
  51. /****************************************************************************
  52. Sets the free bit of the page in the ibuf bitmap. This is done in a separate
  53. mini-transaction, hence this operation does not restrict further work to only
  54. ibuf bitmap operations, which would result if the latch to the bitmap page
  55. were kept. */
  56. void
  57. ibuf_set_free_bits(
  58. /*===============*/
  59. ulint type, /* in: index type */
  60. page_t* page, /* in: index page; free bit is reset if the index is
  61. a non-clustered non-unique, and page level is 0 */
  62. ulint val, /* in: value to set: < 4 */
  63. ulint max_val);/* in: ULINT_UNDEFINED or a maximum value which
  64. the bits must have before setting; this is for
  65. debugging */
  66. /**************************************************************************
  67. A basic partial test if an insert to the insert buffer could be possible and
  68. recommended. */
  69. UNIV_INLINE
  70. ibool
  71. ibuf_should_try(
  72. /*============*/
  73. dict_index_t* index) /* in: index where to insert */
  74. {
  75. if (!(index->type & (DICT_CLUSTERED | DICT_UNIQUE))
  76. && ibuf->meter > IBUF_THRESHOLD) {
  77. ibuf_flush_count++;
  78. if (ibuf_flush_count % 8 == 0) {
  79.     
  80. buf_LRU_try_free_flushed_blocks();
  81. }
  82. return(TRUE);
  83. }
  84. return(FALSE);
  85. }
  86. /***************************************************************************
  87. Checks if a page address is an ibuf bitmap page address. */
  88. UNIV_INLINE
  89. ibool
  90. ibuf_bitmap_page(
  91. /*=============*/
  92. /* out: TRUE if a bitmap page */
  93. ulint page_no)/* in: page number */
  94. {
  95. if (page_no % XDES_DESCRIBED_PER_PAGE == FSP_IBUF_BITMAP_OFFSET) {
  96. return(TRUE);
  97. }
  98. return(FALSE);
  99. }
  100. /*************************************************************************
  101. Translates the free space on a page to a value in the ibuf bitmap.*/
  102. UNIV_INLINE
  103. ulint
  104. ibuf_index_page_calc_free_bits(
  105. /*===========================*/
  106. /* out: value for ibuf bitmap bits */
  107. ulint max_ins_size) /* in: maximum insert size after reorganize
  108. for the page */
  109. {
  110. ulint n;
  111. n = max_ins_size / (UNIV_PAGE_SIZE / IBUF_PAGE_SIZE_PER_FREE_SPACE);
  112. if (n == 3) {
  113. n = 2;
  114. }
  115. if (n > 3) {
  116. n = 3;
  117. }
  118. return(n);
  119. }
  120. /*************************************************************************
  121. Translates the ibuf free bits to the free space on a page in bytes. */
  122. UNIV_INLINE
  123. ulint
  124. ibuf_index_page_calc_free_from_bits(
  125. /*================================*/
  126. /* out: maximum insert size after reorganize for the
  127. page */
  128. ulint bits) /* in: value for ibuf bitmap bits */
  129. {
  130. ut_ad(bits < 4);
  131. if (bits == 3) {
  132. return(4 * UNIV_PAGE_SIZE / IBUF_PAGE_SIZE_PER_FREE_SPACE);
  133. }
  134. return(bits * UNIV_PAGE_SIZE / IBUF_PAGE_SIZE_PER_FREE_SPACE);
  135. }
  136. /*************************************************************************
  137. Translates the free space on a page to a value in the ibuf bitmap.*/
  138. UNIV_INLINE
  139. ulint
  140. ibuf_index_page_calc_free(
  141. /*======================*/
  142. /* out: value for ibuf bitmap bits */
  143. page_t* page) /* in: non-unique secondary index page */
  144. {
  145. return(ibuf_index_page_calc_free_bits(
  146. page_get_max_insert_size_after_reorganize(page, 1)));
  147. }
  148. /****************************************************************************
  149. Updates the free bits of the page in the ibuf bitmap if there is not enough
  150. free on the page any more. This is done in a separate mini-transaction, hence
  151. this operation does not restrict further work to only ibuf bitmap operations,
  152. which would result if the latch to the bitmap page were kept. */
  153. UNIV_INLINE
  154. void
  155. ibuf_update_free_bits_if_full(
  156. /*==========================*/
  157. dict_index_t* index, /* in: index */
  158. page_t* page, /* in: index page to which we have added new
  159. records; the free bits are updated if the
  160. index is non-clustered and non-unique and
  161. the page level is 0, and the page becomes
  162. fuller */
  163. ulint max_ins_size,/* in: value of maximum insert size with
  164. reorganize before the latest operation
  165. performed to the page */
  166. ulint increase)/* in: upper limit for the additional space
  167. used in the latest operation, if known, or
  168. ULINT_UNDEFINED */
  169. {
  170. ulint before;
  171. ulint after;
  172. before = ibuf_index_page_calc_free_bits(max_ins_size);
  173. if (max_ins_size >= increase) {
  174. ut_ad(ULINT_UNDEFINED > UNIV_PAGE_SIZE);
  175. after = ibuf_index_page_calc_free_bits(max_ins_size
  176. - increase);
  177. #ifdef UNIV_IBUF_DEBUG
  178. ut_a(after <= ibuf_index_page_calc_free(page));
  179. #endif
  180. } else {
  181. after = ibuf_index_page_calc_free(page);
  182. }
  183. if (after == 0) {
  184. /* We move the page to front of the buffer pool LRU list:
  185. the purpose of this is to prevent those pages to which we
  186. cannot make inserts using the insert buffer from slipping
  187. out of the buffer pool */
  188. buf_page_make_young(page);
  189. }
  190. if (before > after) {
  191. ibuf_set_free_bits(index->type, page, after, before);
  192. }
  193. }