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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Insert buffer
  3. (c) 1997 Innobase Oy
  4. Created 7/19/1997 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef ibuf0ibuf_h
  7. #define ibuf0ibuf_h
  8. #include "univ.i"
  9. #include "dict0mem.h"
  10. #include "dict0dict.h"
  11. #include "mtr0mtr.h"
  12. #include "que0types.h"
  13. #include "ibuf0types.h"
  14. #include "fsp0fsp.h"
  15. extern ibuf_t* ibuf;
  16. /**********************************************************************
  17. Creates the insert buffer data struct for a single tablespace. Reads the
  18. root page of the insert buffer tree in the tablespace. This function can
  19. be called only after the dictionary system has been initialized, as this
  20. creates also the insert buffer table and index for this tablespace. */
  21. ibuf_data_t*
  22. ibuf_data_init_for_space(
  23. /*=====================*/
  24. /* out, own: ibuf data struct, linked to the list
  25. in ibuf control structure. */
  26. ulint space); /* in: space id */
  27. /**********************************************************************
  28. Creates the insert buffer data structure at a database startup and
  29. initializes the data structures for the insert buffer of each tablespace. */
  30. void
  31. ibuf_init_at_db_start(void);
  32. /*=======================*/
  33. /*************************************************************************
  34. Initializes an ibuf bitmap page. */
  35. void
  36. ibuf_bitmap_page_init(
  37. /*==================*/
  38. page_t* page, /* in: bitmap page */
  39. mtr_t* mtr); /* in: mtr */
  40. /****************************************************************************
  41. Resets the free bits of the page in the ibuf bitmap. This is done in a
  42. separate mini-transaction, hence this operation does not restrict further
  43. work to only ibuf bitmap operations, which would result if the latch to the
  44. bitmap page were kept. */
  45. void
  46. ibuf_reset_free_bits_with_type(
  47. /*===========================*/
  48. ulint type, /* in: index type */
  49. page_t* page); /* in: index page; free bits are set to 0 if the index
  50. is non-clustered and non-unique and the page level is
  51. 0 */
  52. /****************************************************************************
  53. Resets the free bits of the page in the ibuf bitmap. This is done in a
  54. separate mini-transaction, hence this operation does not restrict further
  55. work to solely ibuf bitmap operations, which would result if the latch to
  56. the bitmap page were kept. */
  57. void
  58. ibuf_reset_free_bits(
  59. /*=================*/
  60. dict_index_t* index, /* in: index */
  61. page_t* page); /* in: index page; free bits are set to 0 if
  62. the index is non-clustered and non-unique and
  63. the page level is 0 */
  64. /****************************************************************************
  65. Updates the free bits of the page in the ibuf bitmap if there is not enough
  66. free on the page any more. This is done in a separate mini-transaction, hence
  67. this operation does not restrict further work to only ibuf bitmap operations,
  68. which would result if the latch to the bitmap page were kept. */
  69. UNIV_INLINE
  70. void
  71. ibuf_update_free_bits_if_full(
  72. /*==========================*/
  73. dict_index_t* index, /* in: index */
  74. page_t* page, /* in: index page to which we have added new
  75. records; the free bits are updated if the
  76. index is non-clustered and non-unique and
  77. the page level is 0, and the page becomes
  78. fuller */
  79. ulint max_ins_size,/* in: value of maximum insert size with
  80. reorganize before the latest operation
  81. performed to the page */
  82. ulint increase);/* in: upper limit for the additional space
  83. used in the latest operation, if known, or
  84. ULINT_UNDEFINED */
  85. /**************************************************************************
  86. Updates the free bits for the page to reflect the present state. Does this
  87. in the mtr given, which means that the latching order rules virtually
  88. prevent any further operations for this OS thread until mtr is committed. */
  89. void
  90. ibuf_update_free_bits_low(
  91. /*======================*/
  92. dict_index_t* index, /* in: index */
  93. page_t* page, /* in: index page */
  94. ulint max_ins_size, /* in: value of maximum insert size
  95. with reorganize before the latest
  96. operation performed to the page */
  97. mtr_t* mtr); /* in: mtr */
  98. /**************************************************************************
  99. Updates the free bits for the two pages to reflect the present state. Does
  100. this in the mtr given, which means that the latching order rules virtually
  101. prevent any further operations until mtr is committed. */
  102. void
  103. ibuf_update_free_bits_for_two_pages_low(
  104. /*====================================*/
  105. dict_index_t* index, /* in: index */
  106. page_t* page1, /* in: index page */
  107. page_t* page2, /* in: index page */
  108. mtr_t* mtr); /* in: mtr */
  109. /**************************************************************************
  110. A basic partial test if an insert to the insert buffer could be possible and
  111. recommended. */
  112. UNIV_INLINE
  113. ibool
  114. ibuf_should_try(
  115. /*============*/
  116. dict_index_t* index); /* in: index where to insert */
  117. /**********************************************************************
  118. Returns TRUE if the current OS thread is performing an insert buffer
  119. routine. */
  120. ibool
  121. ibuf_inside(void);
  122. /*=============*/
  123. /* out: TRUE if inside an insert buffer routine: for instance,
  124. a read-ahead of non-ibuf pages is then forbidden */
  125. /***************************************************************************
  126. Checks if a page address is an ibuf bitmap page (level 3 page) address. */
  127. UNIV_INLINE
  128. ibool
  129. ibuf_bitmap_page(
  130. /*=============*/
  131. /* out: TRUE if a bitmap page */
  132. ulint page_no);/* in: page number */
  133. /***************************************************************************
  134. Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages. */
  135. ibool
  136. ibuf_page(
  137. /*======*/
  138. /* out: TRUE if level 2 or level 3 page */
  139. ulint space, /* in: space id */
  140. ulint page_no);/* in: page number */
  141. /***************************************************************************
  142. Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages. */
  143. ibool
  144. ibuf_page_low(
  145. /*==========*/
  146. /* out: TRUE if level 2 or level 3 page */
  147. ulint space, /* in: space id */
  148. ulint page_no,/* in: page number */
  149. mtr_t* mtr); /* in: mtr which will contain an x-latch to the
  150. bitmap page if the page is not one of the fixed
  151. address ibuf pages */
  152. /*************************************************************************
  153. Checks if an index page has so much free space that the free bit should
  154. be set TRUE in the ibuf bitmap. */
  155. ibool
  156. ibuf_index_page_has_free(
  157. /*=====================*/
  158. /* out: TRUE if there is enough free space */
  159. page_t* page); /* in: non-unique secondary index page */
  160. /***************************************************************************
  161. Frees excess pages from the ibuf free list. This function is called when an OS
  162. thread calls fsp services to allocate a new file segment, or a new page to a
  163. file segment, and the thread did not own the fsp latch before this call. */ 
  164. void
  165. ibuf_free_excess_pages(
  166. /*===================*/
  167. ulint space); /* in: space id */
  168. /*************************************************************************
  169. Makes an index insert to the insert buffer, instead of directly to the disk
  170. page, if this is possible. Does not do insert if the index is clustered
  171. or unique. */
  172. ibool
  173. ibuf_insert(
  174. /*========*/
  175. /* out: TRUE if success */
  176. dtuple_t* entry, /* in: index entry to insert */
  177. dict_index_t* index, /* in: index where to insert */
  178. ulint space, /* in: space id where to insert */
  179. ulint page_no,/* in: page number where to insert */
  180. que_thr_t* thr); /* in: query thread */
  181. /*************************************************************************
  182. When an index page is read from a disk to the buffer pool, this function
  183. inserts to the page the possible index entries buffered in the insert buffer.
  184. The entries are deleted from the insert buffer. If the page is not read, but
  185. created in the buffer pool, this function deletes its buffered entries from
  186. the insert buffer; note that there can exist entries if the page belonged to
  187. an index which was dropped. */
  188. void
  189. ibuf_merge_or_delete_for_page(
  190. /*==========================*/
  191. page_t* page, /* in: if page has been read from disk, pointer to
  192. the page x-latched, else NULL */
  193. ulint space, /* in: space id of the index page */
  194. ulint page_no);/* in: page number of the index page */
  195. /*************************************************************************
  196. Contracts insert buffer trees by reading pages to the buffer pool. */
  197. ulint
  198. ibuf_contract(
  199. /*==========*/
  200. /* out: a lower limit for the combined size in bytes
  201. of entries which will be merged from ibuf trees to the
  202. pages read, 0 if ibuf is empty */
  203. ibool sync); /* in: TRUE if the caller wants to wait for the
  204. issued read with the highest tablespace address
  205. to complete */
  206. /*************************************************************************
  207. Parses a redo log record of an ibuf bitmap page init. */
  208. byte*
  209. ibuf_parse_bitmap_init(
  210. /*===================*/
  211. /* out: end of log record or NULL */
  212. byte* ptr, /* in: buffer */
  213. byte* end_ptr,/* in: buffer end */
  214. page_t* page, /* in: page or NULL */
  215. mtr_t* mtr); /* in: mtr or NULL */
  216. /**********************************************************************
  217. Gets the ibuf count for a given page. */
  218. ulint
  219. ibuf_count_get(
  220. /*===========*/
  221. /* out: number of entries in the insert buffer
  222. currently buffered for this page */
  223. ulint space, /* in: space id */
  224. ulint page_no);/* in: page number */
  225. /**********************************************************************
  226. Prints info of ibuf. */
  227. void
  228. ibuf_print(void);
  229. /*============*/
  230. #define IBUF_HEADER_PAGE_NO FSP_IBUF_HEADER_PAGE_NO
  231. #define IBUF_TREE_ROOT_PAGE_NO FSP_IBUF_TREE_ROOT_PAGE_NO
  232. /* The ibuf header page currently contains only the file segment header
  233. for the file segment from which the pages for the ibuf tree are allocated */
  234. #define IBUF_HEADER PAGE_DATA
  235. #define IBUF_TREE_SEG_HEADER 0 /* fseg header for ibuf tree */
  236. #ifndef UNIV_NONINL
  237. #include "ibuf0ibuf.ic"
  238. #endif
  239. #endif