ibuf0ibuf.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:11k
源码类别:

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. Reads the biggest tablespace id from the high end of the insert buffer
  35. tree and updates the counter in fil_system. */
  36. void
  37. ibuf_update_max_tablespace_id(void);
  38. /*===============================*/
  39. /*************************************************************************
  40. Initializes an ibuf bitmap page. */
  41. void
  42. ibuf_bitmap_page_init(
  43. /*==================*/
  44. page_t* page, /* in: bitmap page */
  45. mtr_t* mtr); /* in: mtr */
  46. /****************************************************************************
  47. Resets the free bits of the page in the ibuf bitmap. This is done in a
  48. separate mini-transaction, hence this operation does not restrict further
  49. work to only ibuf bitmap operations, which would result if the latch to the
  50. bitmap page were kept. */
  51. void
  52. ibuf_reset_free_bits_with_type(
  53. /*===========================*/
  54. ulint type, /* in: index type */
  55. page_t* page); /* in: index page; free bits are set to 0 if the index
  56. is non-clustered and non-unique and the page level is
  57. 0 */
  58. /****************************************************************************
  59. Resets the free bits of the page in the ibuf bitmap. This is done in a
  60. separate mini-transaction, hence this operation does not restrict further
  61. work to solely ibuf bitmap operations, which would result if the latch to
  62. the bitmap page were kept. */
  63. void
  64. ibuf_reset_free_bits(
  65. /*=================*/
  66. dict_index_t* index, /* in: index */
  67. page_t* page); /* in: index page; free bits are set to 0 if
  68. the index is non-clustered and non-unique and
  69. the page level is 0 */
  70. /****************************************************************************
  71. Updates the free bits of the page in the ibuf bitmap if there is not enough
  72. free on the page any more. This is done in a separate mini-transaction, hence
  73. this operation does not restrict further work to only ibuf bitmap operations,
  74. which would result if the latch to the bitmap page were kept. */
  75. UNIV_INLINE
  76. void
  77. ibuf_update_free_bits_if_full(
  78. /*==========================*/
  79. dict_index_t* index, /* in: index */
  80. page_t* page, /* in: index page to which we have added new
  81. records; the free bits are updated if the
  82. index is non-clustered and non-unique and
  83. the page level is 0, and the page becomes
  84. fuller */
  85. ulint max_ins_size,/* in: value of maximum insert size with
  86. reorganize before the latest operation
  87. performed to the page */
  88. ulint increase);/* in: upper limit for the additional space
  89. used in the latest operation, if known, or
  90. ULINT_UNDEFINED */
  91. /**************************************************************************
  92. Updates the free bits for the page to reflect the present state. Does this
  93. in the mtr given, which means that the latching order rules virtually
  94. prevent any further operations for this OS thread until mtr is committed. */
  95. void
  96. ibuf_update_free_bits_low(
  97. /*======================*/
  98. dict_index_t* index, /* in: index */
  99. page_t* page, /* in: index page */
  100. ulint max_ins_size, /* in: value of maximum insert size
  101. with reorganize before the latest
  102. operation performed to the page */
  103. mtr_t* mtr); /* in: mtr */
  104. /**************************************************************************
  105. Updates the free bits for the two pages to reflect the present state. Does
  106. this in the mtr given, which means that the latching order rules virtually
  107. prevent any further operations until mtr is committed. */
  108. void
  109. ibuf_update_free_bits_for_two_pages_low(
  110. /*====================================*/
  111. dict_index_t* index, /* in: index */
  112. page_t* page1, /* in: index page */
  113. page_t* page2, /* in: index page */
  114. mtr_t* mtr); /* in: mtr */
  115. /**************************************************************************
  116. A basic partial test if an insert to the insert buffer could be possible and
  117. recommended. */
  118. UNIV_INLINE
  119. ibool
  120. ibuf_should_try(
  121. /*============*/
  122. dict_index_t* index, /* in: index where to insert */
  123. ulint ignore_sec_unique); /* in: if != 0, we should
  124. ignore UNIQUE constraint on
  125. a secondary index when we
  126. decide */
  127. /**********************************************************************
  128. Returns TRUE if the current OS thread is performing an insert buffer
  129. routine. */
  130. ibool
  131. ibuf_inside(void);
  132. /*=============*/
  133. /* out: TRUE if inside an insert buffer routine: for instance,
  134. a read-ahead of non-ibuf pages is then forbidden */
  135. /***************************************************************************
  136. Checks if a page address is an ibuf bitmap page (level 3 page) address. */
  137. UNIV_INLINE
  138. ibool
  139. ibuf_bitmap_page(
  140. /*=============*/
  141. /* out: TRUE if a bitmap page */
  142. ulint page_no);/* in: page number */
  143. /***************************************************************************
  144. Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages. */
  145. ibool
  146. ibuf_page(
  147. /*======*/
  148. /* out: TRUE if level 2 or level 3 page */
  149. ulint space, /* in: space id */
  150. ulint page_no);/* in: page number */
  151. /***************************************************************************
  152. Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages. */
  153. ibool
  154. ibuf_page_low(
  155. /*==========*/
  156. /* out: TRUE if level 2 or level 3 page */
  157. ulint space, /* in: space id */
  158. ulint page_no,/* in: page number */
  159. mtr_t* mtr); /* in: mtr which will contain an x-latch to the
  160. bitmap page if the page is not one of the fixed
  161. address ibuf pages */
  162. /***************************************************************************
  163. Frees excess pages from the ibuf free list. This function is called when an OS
  164. thread calls fsp services to allocate a new file segment, or a new page to a
  165. file segment, and the thread did not own the fsp latch before this call. */ 
  166. void
  167. ibuf_free_excess_pages(
  168. /*===================*/
  169. ulint space); /* in: space id */
  170. /*************************************************************************
  171. Makes an index insert to the insert buffer, instead of directly to the disk
  172. page, if this is possible. Does not do insert if the index is clustered
  173. or unique. */
  174. ibool
  175. ibuf_insert(
  176. /*========*/
  177. /* out: TRUE if success */
  178. dtuple_t* entry, /* in: index entry to insert */
  179. dict_index_t* index, /* in: index where to insert */
  180. ulint space, /* in: space id where to insert */
  181. ulint page_no,/* in: page number where to insert */
  182. que_thr_t* thr); /* in: query thread */
  183. /*************************************************************************
  184. When an index page is read from a disk to the buffer pool, this function
  185. inserts to the page the possible index entries buffered in the insert buffer.
  186. The entries are deleted from the insert buffer. If the page is not read, but
  187. created in the buffer pool, this function deletes its buffered entries from
  188. the insert buffer; there can exist entries for such a page if the page
  189. belonged to an index which subsequently was dropped. */
  190. void
  191. ibuf_merge_or_delete_for_page(
  192. /*==========================*/
  193. page_t* page, /* in: if page has been read from disk, pointer to
  194. the page x-latched, else NULL */
  195. ulint space, /* in: space id of the index page */
  196. ulint page_no,/* in: page number of the index page */
  197. ibool update_ibuf_bitmap);/* in: normally this is set to TRUE, but if
  198. we have deleted or are deleting the tablespace, then we
  199. naturally do not want to update a non-existent bitmap
  200. page */
  201. /*************************************************************************
  202. Deletes all entries in the insert buffer for a given space id. This is used
  203. in DISCARD TABLESPACE and IMPORT TABLESPACE.
  204. NOTE: this does not update the page free bitmaps in the space. The space will
  205. become CORRUPT when you call this function! */
  206. void
  207. ibuf_delete_for_discarded_space(
  208. /*============================*/
  209. ulint space); /* in: space id */
  210. /*************************************************************************
  211. Contracts insert buffer trees by reading pages to the buffer pool. */
  212. ulint
  213. ibuf_contract(
  214. /*==========*/
  215. /* out: a lower limit for the combined size in bytes
  216. of entries which will be merged from ibuf trees to the
  217. pages read, 0 if ibuf is empty */
  218. ibool sync); /* in: TRUE if the caller wants to wait for the
  219. issued read with the highest tablespace address
  220. to complete */
  221. /*************************************************************************
  222. Contracts insert buffer trees by reading pages to the buffer pool. */
  223. ulint
  224. ibuf_contract_for_n_pages(
  225. /*======================*/
  226. /* out: a lower limit for the combined size in bytes
  227. of entries which will be merged from ibuf trees to the
  228. pages read, 0 if ibuf is empty */
  229. ibool sync, /* in: TRUE if the caller wants to wait for the
  230. issued read with the highest tablespace address
  231. to complete */
  232. ulint n_pages);/* in: try to read at least this many pages to
  233. the buffer pool and merge the ibuf contents to
  234. them */
  235. /*************************************************************************
  236. Parses a redo log record of an ibuf bitmap page init. */
  237. byte*
  238. ibuf_parse_bitmap_init(
  239. /*===================*/
  240. /* out: end of log record or NULL */
  241. byte* ptr, /* in: buffer */
  242. byte* end_ptr,/* in: buffer end */
  243. page_t* page, /* in: page or NULL */
  244. mtr_t* mtr); /* in: mtr or NULL */
  245. /**********************************************************************
  246. Gets the ibuf count for a given page. */
  247. ulint
  248. ibuf_count_get(
  249. /*===========*/
  250. /* out: number of entries in the insert buffer
  251. currently buffered for this page */
  252. ulint space, /* in: space id */
  253. ulint page_no);/* in: page number */
  254. /**********************************************************************
  255. Looks if the insert buffer is empty. */
  256. ibool
  257. ibuf_is_empty(void);
  258. /*===============*/
  259. /* out: TRUE if empty */
  260. /**********************************************************************
  261. Prints info of ibuf. */
  262. void
  263. ibuf_print(
  264. /*=======*/
  265. FILE* file); /* in: file where to print */
  266. #define IBUF_HEADER_PAGE_NO FSP_IBUF_HEADER_PAGE_NO
  267. #define IBUF_TREE_ROOT_PAGE_NO FSP_IBUF_TREE_ROOT_PAGE_NO
  268. /* The ibuf header page currently contains only the file segment header
  269. for the file segment from which the pages for the ibuf tree are allocated */
  270. #define IBUF_HEADER PAGE_DATA
  271. #define IBUF_TREE_SEG_HEADER 0 /* fseg header for ibuf tree */
  272. #ifndef UNIV_NONINL
  273. #include "ibuf0ibuf.ic"
  274. #endif
  275. #endif