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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. File space management
  3. (c) 1995 Innobase Oy
  4. Created 12/18/1995 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef fsp0fsp_h
  7. #define fsp0fsp_h
  8. #include "univ.i"
  9. #include "mtr0mtr.h"
  10. #include "fut0lst.h"
  11. #include "ut0byte.h"
  12. #include "page0types.h"
  13. /* If records are inserted in order, there are the following
  14. flags to tell this (their type is made byte for the compiler
  15. to warn if direction and hint parameters are switched in
  16. fseg_alloc_free_page): */
  17. #define FSP_UP ((byte)111) /* alphabetically upwards */
  18. #define FSP_DOWN ((byte)112) /* alphabetically downwards */
  19. #define FSP_NO_DIR ((byte)113) /* no order */
  20. /* File space extent size in pages */
  21. #define FSP_EXTENT_SIZE 64
  22. /* On a page of any file segment, data may be put starting from this offset: */
  23. #define FSEG_PAGE_DATA FIL_PAGE_DATA
  24. /* File segment header which points to the inode describing the file segment */
  25. typedef byte fseg_header_t;
  26. #define FSEG_HDR_SPACE 0 /* space id of the inode */
  27. #define FSEG_HDR_PAGE_NO 4 /* page number of the inode */
  28. #define FSEG_HDR_OFFSET 8 /* byte offset of the inode */
  29. #define FSEG_HEADER_SIZE 10
  30. /**************************************************************************
  31. Initializes the file space system. */
  32. void
  33. fsp_init(void);
  34. /*==========*/
  35. /**************************************************************************
  36. Gets the current free limit of a tablespace. The free limit means the
  37. place of the first page which has never been put to the the free list
  38. for allocation. The space above that address is initialized to zero.
  39. Sets also the global variable log_fsp_current_free_limit. */
  40. ulint
  41. fsp_header_get_free_limit(
  42. /*======================*/
  43. /* out: free limit in megabytes */
  44. ulint space); /* in: space id, must be 0 */
  45. /**************************************************************************
  46. Gets the size of the tablespace from the tablespace header. If we do not
  47. have an auto-extending data file, this should be equal to the size of the
  48. data files. If there is an auto-extending data file, this can be smaller. */
  49. ulint
  50. fsp_header_get_tablespace_size(
  51. /*===========================*/
  52. /* out: size in pages */
  53. ulint space); /* in: space id, must be 0 */
  54. /**************************************************************************
  55. Reads the file space size stored in the header page. */
  56. ulint
  57. fsp_get_size_low(
  58. /*=============*/
  59. /* out: tablespace size stored in the space header */
  60. page_t* page); /* in: header page (page 0 in the tablespace) */
  61. /**************************************************************************
  62. Reads the space id from the first page of a tablespace. */
  63. ulint
  64. fsp_header_get_space_id(
  65. /*====================*/
  66.                         /* out: space id, ULINT UNDEFINED if error */
  67.         page_t* page);   /* in: first page of a tablespace */
  68. /**************************************************************************
  69. Writes the space id to a tablespace header. This function is used past the
  70. buffer pool when we in fil0fil.c create a new single-table tablespace. */
  71. void
  72. fsp_header_write_space_id(
  73. /*======================*/
  74. page_t* page, /* in: first page in the space */
  75. ulint space_id); /* in: space id */
  76. /**************************************************************************
  77. Initializes the space header of a new created space and creates also the
  78. insert buffer tree root if space == 0. */
  79. void
  80. fsp_header_init(
  81. /*============*/
  82. ulint space, /* in: space id */
  83. ulint size, /* in: current size in blocks */
  84. mtr_t* mtr); /* in: mini-transaction handle */
  85. /**************************************************************************
  86. Increases the space size field of a space. */
  87. void
  88. fsp_header_inc_size(
  89. /*================*/
  90. ulint space, /* in: space id */
  91. ulint size_inc,/* in: size increment in pages */
  92. mtr_t* mtr); /* in: mini-transaction handle */
  93. /**************************************************************************
  94. Creates a new segment. */
  95. page_t*
  96. fseg_create(
  97. /*========*/
  98. /* out: the page where the segment header is placed,
  99. x-latched, NULL if could not create segment
  100. because of lack of space */
  101. ulint space, /* in: space id */
  102. ulint page, /* in: page where the segment header is placed: if
  103. this is != 0, the page must belong to another segment,
  104. if this is 0, a new page will be allocated and it
  105. will belong to the created segment */
  106. ulint byte_offset, /* in: byte offset of the created segment header
  107. on the page */
  108. mtr_t* mtr); /* in: mtr */
  109. /**************************************************************************
  110. Creates a new segment. */
  111. page_t*
  112. fseg_create_general(
  113. /*================*/
  114. /* out: the page where the segment header is placed,
  115. x-latched, NULL if could not create segment
  116. because of lack of space */
  117. ulint space, /* in: space id */
  118. ulint page, /* in: page where the segment header is placed: if
  119. this is != 0, the page must belong to another segment,
  120. if this is 0, a new page will be allocated and it
  121. will belong to the created segment */
  122. ulint byte_offset, /* in: byte offset of the created segment header
  123. on the page */
  124. ibool has_done_reservation, /* in: TRUE if the caller has already
  125. done the reservation for the pages with
  126. fsp_reserve_free_extents (at least 2 extents: one for
  127. the inode and the other for the segment) then there is
  128. no need to do the check for this individual
  129. operation */
  130. mtr_t* mtr); /* in: mtr */
  131. /**************************************************************************
  132. Calculates the number of pages reserved by a segment, and how many pages are
  133. currently used. */
  134. ulint
  135. fseg_n_reserved_pages(
  136. /*==================*/
  137. /* out: number of reserved pages */
  138. fseg_header_t*  header, /* in: segment header */
  139. ulint* used, /* out: number of pages used (<= reserved) */
  140. mtr_t* mtr); /* in: mtr handle */
  141. /**************************************************************************
  142. Allocates a single free page from a segment. This function implements
  143. the intelligent allocation strategy which tries to minimize
  144. file space fragmentation. */
  145. ulint
  146. fseg_alloc_free_page(
  147. /*=================*/
  148. /* out: the allocated page offset
  149. FIL_NULL if no page could be allocated */
  150. fseg_header_t* seg_header, /* in: segment header */
  151. ulint hint, /* in: hint of which page would be desirable */
  152. byte direction, /* in: if the new page is needed because
  153. of an index page split, and records are
  154. inserted there in order, into which
  155. direction they go alphabetically: FSP_DOWN,
  156. FSP_UP, FSP_NO_DIR */
  157. mtr_t* mtr); /* in: mtr handle */
  158. /**************************************************************************
  159. Allocates a single free page from a segment. This function implements
  160. the intelligent allocation strategy which tries to minimize file space
  161. fragmentation. */
  162. ulint
  163. fseg_alloc_free_page_general(
  164. /*=========================*/
  165. /* out: allocated page offset, FIL_NULL if no
  166. page could be allocated */
  167. fseg_header_t* seg_header,/* in: segment header */
  168. ulint hint, /* in: hint of which page would be desirable */
  169. byte direction,/* in: if the new page is needed because
  170. of an index page split, and records are
  171. inserted there in order, into which
  172. direction they go alphabetically: FSP_DOWN,
  173. FSP_UP, FSP_NO_DIR */
  174. ibool has_done_reservation, /* in: TRUE if the caller has
  175. already done the reservation for the page
  176. with fsp_reserve_free_extents, then there
  177. is no need to do the check for this individual
  178. page */
  179. mtr_t* mtr); /* in: mtr handle */
  180. /**************************************************************************
  181. Reserves free pages from a tablespace. All mini-transactions which may
  182. use several pages from the tablespace should call this function beforehand
  183. and reserve enough free extents so that they certainly will be able
  184. to do their operation, like a B-tree page split, fully. Reservations
  185. must be released with function fil_space_release_free_extents!
  186. The alloc_type below has the following meaning: FSP_NORMAL means an
  187. operation which will probably result in more space usage, like an
  188. insert in a B-tree; FSP_UNDO means allocation to undo logs: if we are
  189. deleting rows, then this allocation will in the long run result in
  190. less space usage (after a purge); FSP_CLEANING means allocation done
  191. in a physical record delete (like in a purge) or other cleaning operation
  192. which will result in less space usage in the long run. We prefer the latter
  193. two types of allocation: when space is scarce, FSP_NORMAL allocations
  194. will not succeed, but the latter two allocations will succeed, if possible.
  195. The purpose is to avoid dead end where the database is full but the
  196. user cannot free any space because these freeing operations temporarily
  197. reserve some space.
  198. Single-table tablespaces whose size is < 32 pages are a special case. In this
  199. function we would liberally reserve several 64 page extents for every page
  200. split or merge in a B-tree. But we do not want to waste disk space if the table
  201. only occupies < 32 pages. That is why we apply different rules in that special
  202. case, just ensuring that there are 3 free pages available. */
  203. ibool
  204. fsp_reserve_free_extents(
  205. /*=====================*/
  206. /* out: TRUE if we were able to make the reservation */
  207.         ulint*  n_reserved,/* out: number of extents actually reserved; if we
  208.                         return TRUE and the tablespace size is < 64 pages,
  209.                         then this can be 0, otherwise it is n_ext */
  210. ulint space, /* in: space id */
  211. ulint n_ext, /* in: number of extents to reserve */
  212. ulint alloc_type,/* in: FSP_NORMAL, FSP_UNDO, or FSP_CLEANING */
  213. mtr_t* mtr); /* in: mtr */
  214. /**************************************************************************
  215. This function should be used to get information on how much we still
  216. will be able to insert new data to the database without running out the
  217. tablespace. Only free extents are taken into account and we also subtract
  218. the safety margin required by the above function fsp_reserve_free_extents. */
  219. ulint
  220. fsp_get_available_space_in_free_extents(
  221. /*====================================*/
  222. /* out: available space in kB */
  223. ulint space); /* in: space id */
  224. /**************************************************************************
  225. Frees a single page of a segment. */
  226. void
  227. fseg_free_page(
  228. /*===========*/
  229. fseg_header_t* seg_header, /* in: segment header */
  230. ulint space, /* in: space id */
  231. ulint page, /* in: page offset */
  232. mtr_t* mtr); /* in: mtr handle */
  233. /***********************************************************************
  234. Frees a segment. The freeing is performed in several mini-transactions,
  235. so that there is no danger of bufferfixing too many buffer pages. */
  236. void
  237. fseg_free(
  238. /*======*/
  239. ulint space, /* in: space id */
  240. ulint page_no,/* in: page number where the segment header is
  241. placed */
  242. ulint offset);/* in: byte offset of the segment header on that
  243. page */
  244. /**************************************************************************
  245. Frees part of a segment. This function can be used to free a segment
  246. by repeatedly calling this function in different mini-transactions.
  247. Doing the freeing in a single mini-transaction might result in
  248. too big a mini-transaction. */
  249. ibool
  250. fseg_free_step(
  251. /*===========*/
  252. /* out: TRUE if freeing completed */
  253. fseg_header_t* header, /* in, own: segment header; NOTE: if the header
  254. resides on the first page of the frag list
  255. of the segment, this pointer becomes obsolete
  256. after the last freeing step */
  257. mtr_t* mtr); /* in: mtr */
  258. /**************************************************************************
  259. Frees part of a segment. Differs from fseg_free_step because this function
  260. leaves the header page unfreed. */
  261. ibool
  262. fseg_free_step_not_header(
  263. /*======================*/
  264. /* out: TRUE if freeing completed, except the
  265. header page */
  266. fseg_header_t* header, /* in: segment header which must reside on
  267. the first fragment page of the segment */
  268. mtr_t* mtr); /* in: mtr */
  269. /***************************************************************************
  270. Checks if a page address is an extent descriptor page address. */
  271. UNIV_INLINE
  272. ibool
  273. fsp_descr_page(
  274. /*===========*/
  275. /* out: TRUE if a descriptor page */
  276. ulint page_no);/* in: page number */
  277. /***************************************************************
  278. Parses a redo log record of a file page init. */
  279. byte*
  280. fsp_parse_init_file_page(
  281. /*=====================*/
  282. /* out: end of log record or NULL */
  283. byte* ptr, /* in: buffer */
  284. byte* end_ptr,/* in: buffer end */
  285. page_t* page); /* in: page or NULL */
  286. /***********************************************************************
  287. Validates the file space system and its segments. */
  288. ibool
  289. fsp_validate(
  290. /*=========*/
  291. /* out: TRUE if ok */
  292. ulint space); /* in: space id */
  293. /***********************************************************************
  294. Prints info of a file space. */
  295. void
  296. fsp_print(
  297. /*======*/
  298. ulint space); /* in: space id */
  299. /***********************************************************************
  300. Validates a segment. */
  301. ibool
  302. fseg_validate(
  303. /*==========*/
  304. /* out: TRUE if ok */
  305. fseg_header_t* header, /* in: segment header */
  306. mtr_t* mtr2); /* in: mtr */
  307. /***********************************************************************
  308. Writes info of a segment. */
  309. void
  310. fseg_print(
  311. /*=======*/
  312. fseg_header_t* header, /* in: segment header */
  313. mtr_t* mtr); /* in: mtr */
  314. /* Flags for fsp_reserve_free_extents */
  315. #define FSP_NORMAL 1000000
  316. #define FSP_UNDO 2000000
  317. #define FSP_CLEANING 3000000
  318. /* Number of pages described in a single descriptor page: currently each page
  319. description takes less than 1 byte; a descriptor page is repeated every
  320. this many file pages */
  321. #define XDES_DESCRIBED_PER_PAGE UNIV_PAGE_SIZE
  322. /* The space low address page map, and also offsets for extent descriptor and
  323. bitmap pages which are repeated always after XDES_DESCRIBED_PER_PAGE more
  324. pages: */
  325. /*--------------------------------------*/
  326. #define FSP_XDES_OFFSET 0
  327. #define FSP_IBUF_BITMAP_OFFSET 1
  328. /* The ibuf bitmap pages are the ones whose
  329. page number is the number above plus a
  330. multiple of XDES_DESCRIBED_PER_PAGE */
  331. #define FSP_FIRST_INODE_PAGE_NO 2
  332. #define FSP_IBUF_HEADER_PAGE_NO 3
  333. #define FSP_IBUF_TREE_ROOT_PAGE_NO 4
  334. /* The ibuf tree root page number in
  335. tablespace 0; its fseg inode is on the page
  336. number FSP_FIRST_INODE_PAGE_NO */
  337. #define FSP_TRX_SYS_PAGE_NO 5
  338. #define FSP_FIRST_RSEG_PAGE_NO 6
  339. #define FSP_DICT_HDR_PAGE_NO 7
  340. /*--------------------------------------*/
  341. #ifndef UNIV_NONINL
  342. #include "fsp0fsp.ic"
  343. #endif
  344. #endif