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

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. Initializes the space header of a new created space. */
  37. void
  38. fsp_header_init(
  39. /*============*/
  40. ulint space, /* in: space id */
  41. ulint size, /* in: current size in blocks */
  42. mtr_t* mtr); /* in: mini-transaction handle */
  43. /**************************************************************************
  44. Increases the space size field of a space. */
  45. void
  46. fsp_header_inc_size(
  47. /*================*/
  48. ulint space, /* in: space id */
  49. ulint size_inc,/* in: size increment in pages */
  50. mtr_t* mtr); /* in: mini-transaction handle */
  51. /**************************************************************************
  52. Creates a new segment. */
  53. page_t*
  54. fseg_create(
  55. /*========*/
  56. /* out: the page where the segment header is placed,
  57. x-latched, FIL_NULL if could not create segment
  58. because of lack of space */
  59. ulint space, /* in: space id */
  60. ulint page, /* in: page where the segment header is placed: if
  61. this is != 0, the page must belong to another segment,
  62. if this is 0, a new page will be allocated and it
  63. will belong to the created segment */
  64. ulint byte_offset, /* in: byte offset of the created segment header
  65. on the page */
  66. mtr_t* mtr); /* in: mtr */
  67. /**************************************************************************
  68. Creates a new segment. */
  69. page_t*
  70. fseg_create_general(
  71. /*================*/
  72. /* out: the page where the segment header is placed,
  73. x-latched, NULL if could not create segment
  74. because of lack of space */
  75. ulint space, /* in: space id */
  76. ulint page, /* in: page where the segment header is placed: if
  77. this is != 0, the page must belong to another segment,
  78. if this is 0, a new page will be allocated and it
  79. will belong to the created segment */
  80. ulint byte_offset, /* in: byte offset of the created segment header
  81. on the page */
  82. ibool has_done_reservation, /* in: TRUE if the caller has
  83. already done the reservation for the pages
  84. with fsp_reserve_free_extents (at least 2 extents:
  85. one for the inode and, then there other for the
  86. segment) is no need to do the check for this
  87. individual operation */
  88. mtr_t* mtr); /* in: mtr */
  89. /**************************************************************************
  90. Calculates the number of pages reserved by a segment, and how many pages are
  91. currently used. */
  92. ulint
  93. fseg_n_reserved_pages(
  94. /*==================*/
  95. /* out: number of reserved pages */
  96. fseg_header_t*  header, /* in: segment header */
  97. ulint* used, /* out: number of pages used (<= reserved) */
  98. mtr_t* mtr); /* in: mtr handle */
  99. /**************************************************************************
  100. Allocates a single free page from a segment. This function implements
  101. the intelligent allocation strategy which tries to minimize
  102. file space fragmentation. */
  103. ulint
  104. fseg_alloc_free_page(
  105. /*=================*/
  106. /* out: the allocated page offset
  107. FIL_NULL if no page could be allocated */
  108. fseg_header_t* seg_header, /* in: segment header */
  109. ulint hint, /* in: hint of which page would be desirable */
  110. byte direction, /* in: if the new page is needed because
  111. of an index page split, and records are
  112. inserted there in order, into which
  113. direction they go alphabetically: FSP_DOWN,
  114. FSP_UP, FSP_NO_DIR */
  115. mtr_t* mtr); /* in: mtr handle */
  116. /**************************************************************************
  117. Allocates a single free page from a segment. This function implements
  118. the intelligent allocation strategy which tries to minimize file space
  119. fragmentation. */
  120. ulint
  121. fseg_alloc_free_page_general(
  122. /*=========================*/
  123. /* out: allocated page offset, FIL_NULL if no
  124. page could be allocated */
  125. fseg_header_t* seg_header,/* in: segment header */
  126. ulint hint, /* in: hint of which page would be desirable */
  127. byte direction,/* in: if the new page is needed because
  128. of an index page split, and records are
  129. inserted there in order, into which
  130. direction they go alphabetically: FSP_DOWN,
  131. FSP_UP, FSP_NO_DIR */
  132. ibool has_done_reservation, /* in: TRUE if the caller has
  133. already done the reservation for the page
  134. with fsp_reserve_free_extents, then there
  135. is no need to do the check for this individual
  136. page */
  137. mtr_t* mtr); /* in: mtr handle */
  138. /**************************************************************************
  139. Reserves free pages from a tablespace. All mini-transactions which may
  140. use several pages from the tablespace should call this function beforehand
  141. and reserve enough free extents so that they certainly will be able
  142. to do their operation, like a B-tree page split, fully. Reservations
  143. must be released with function fil_space_release_free_extents!
  144. The alloc_type below has the following meaning: FSP_NORMAL means an
  145. operation which will probably result in more space usage, like an
  146. insert in a B-tree; FSP_UNDO means allocation to undo logs: if we are
  147. deleting rows, then this allocation will in the long run result in
  148. less space usage (after a purge); FSP_CLEANING means allocation done
  149. in a physical record delete (like in a purge) or other cleaning operation
  150. which will result in less space usage in the long run. We prefer the latter
  151. two types of allocation: when space is scarce, FSP_NORMAL allocations
  152. will not succeed, but the latter two allocations will succeed, if possible.
  153. The purpose is to avoid dead end where the database is full but the
  154. user cannot free any space because these freeing operations temporarily
  155. reserve some space. */ 
  156. ibool
  157. fsp_reserve_free_extents(
  158. /*=====================*/
  159. /* out: TRUE if we were able to make the reservation */
  160. ulint space, /* in: space id */
  161. ulint n_ext, /* in: number of extents to reserve */
  162. ulint alloc_type,/* in: FSP_NORMAL, FSP_UNDO, or FSP_CLEANING */
  163. mtr_t* mtr); /* in: mtr */
  164. /**************************************************************************
  165. This function should be used to get information on how much we still
  166. will be able to insert new data to the database without running out the
  167. tablespace. Only free extents are taken into account and we also subtract
  168. the safety margin required by the above function fsp_reserve_free_extents. */
  169. ulint
  170. fsp_get_available_space_in_free_extents(
  171. /*====================================*/
  172. /* out: available space in kB */
  173. ulint space); /* in: space id */
  174. /**************************************************************************
  175. Frees a single page of a segment. */
  176. void
  177. fseg_free_page(
  178. /*===========*/
  179. fseg_header_t* seg_header, /* in: segment header */
  180. ulint space, /* in: space id */
  181. ulint page, /* in: page offset */
  182. mtr_t* mtr); /* in: mtr handle */
  183. /***********************************************************************
  184. Frees a segment. The freeing is performed in several mini-transactions,
  185. so that there is no danger of bufferfixing too many buffer pages. */
  186. void
  187. fseg_free(
  188. /*======*/
  189. ulint space, /* in: space id */
  190. ulint page_no,/* in: page number where the segment header is
  191. placed */
  192. ulint offset);/* in: byte offset of the segment header on that
  193. page */
  194. /**************************************************************************
  195. Frees part of a segment. This function can be used to free a segment
  196. by repeatedly calling this function in different mini-transactions.
  197. Doing the freeing in a single mini-transaction might result in
  198. too big a mini-transaction. */
  199. ibool
  200. fseg_free_step(
  201. /*===========*/
  202. /* out: TRUE if freeing completed */
  203. fseg_header_t* header, /* in, own: segment header; NOTE: if the header
  204. resides on the first page of the frag list
  205. of the segment, this pointer becomes obsolete
  206. after the last freeing step */
  207. mtr_t* mtr); /* in: mtr */
  208. /**************************************************************************
  209. Frees part of a segment. Differs from fseg_free_step because this function
  210. leaves the header page unfreed. */
  211. ibool
  212. fseg_free_step_not_header(
  213. /*======================*/
  214. /* out: TRUE if freeing completed, except the
  215. header page */
  216. fseg_header_t* header, /* in: segment header which must reside on
  217. the first fragment page of the segment */
  218. mtr_t* mtr); /* in: mtr */
  219. /***************************************************************************
  220. Checks if a page address is an extent descriptor page address. */
  221. UNIV_INLINE
  222. ibool
  223. fsp_descr_page(
  224. /*===========*/
  225. /* out: TRUE if a descriptor page */
  226. ulint page_no);/* in: page number */
  227. /***************************************************************
  228. Parses a redo log record of a file page init. */
  229. byte*
  230. fsp_parse_init_file_page(
  231. /*=====================*/
  232. /* out: end of log record or NULL */
  233. byte* ptr, /* in: buffer */
  234. byte* end_ptr,/* in: buffer end */
  235. page_t* page); /* in: page or NULL */
  236. /***********************************************************************
  237. Validates the file space system and its segments. */
  238. ibool
  239. fsp_validate(
  240. /*=========*/
  241. /* out: TRUE if ok */
  242. ulint space); /* in: space id */
  243. /***********************************************************************
  244. Prints info of a file space. */
  245. void
  246. fsp_print(
  247. /*======*/
  248. ulint space); /* in: space id */
  249. /***********************************************************************
  250. Validates a segment. */
  251. ibool
  252. fseg_validate(
  253. /*==========*/
  254. /* out: TRUE if ok */
  255. fseg_header_t* header, /* in: segment header */
  256. mtr_t* mtr2); /* in: mtr */
  257. /***********************************************************************
  258. Writes info of a segment. */
  259. void
  260. fseg_print(
  261. /*=======*/
  262. fseg_header_t* header, /* in: segment header */
  263. mtr_t* mtr); /* in: mtr */
  264. /* Flags for fsp_reserve_free_extents */
  265. #define FSP_NORMAL 1000000
  266. #define FSP_UNDO 2000000
  267. #define FSP_CLEANING 3000000
  268. /* Number of pages described in a single descriptor page: currently each page
  269. description takes less than 1 byte; a descriptor page is repeated every
  270. this many file pages */
  271. #define XDES_DESCRIBED_PER_PAGE UNIV_PAGE_SIZE
  272. /* The space low address page map, and also offsets for extent descriptor and
  273. bitmap pages which are repeated always after XDES_DESCRIBED_PER_PAGE more
  274. pages: */
  275. /*--------------------------------------*/
  276. #define FSP_XDES_OFFSET 0
  277. #define FSP_IBUF_BITMAP_OFFSET 1
  278. /* The ibuf bitmap pages are the ones whose
  279. page number is the number above plus a
  280. multiple of XDES_DESCRIBED_PER_PAGE */
  281. #define FSP_FIRST_INODE_PAGE_NO 2
  282. #define FSP_IBUF_HEADER_PAGE_NO 3
  283. #define FSP_IBUF_TREE_ROOT_PAGE_NO 4
  284. /* The ibuf tree root page number in each
  285. tablespace; its fseg inode is on the page
  286. number FSP_FIRST_INODE_PAGE_NO */
  287. #define FSP_TRX_SYS_PAGE_NO 5
  288. #define FSP_FIRST_RSEG_PAGE_NO 6
  289. #define FSP_DICT_HDR_PAGE_NO 7
  290. /*--------------------------------------*/
  291. #ifndef UNIV_NONINL
  292. #include "fsp0fsp.ic"
  293. #endif
  294. #endif