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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Mini-transaction buffer
  3. (c) 1995 Innobase Oy
  4. Created 11/26/1995 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef mtr0mtr_h
  7. #define mtr0mtr_h
  8. #include "univ.i"
  9. #include "mem0mem.h"
  10. #include "dyn0dyn.h"
  11. #include "buf0types.h"
  12. #include "sync0rw.h"
  13. #include "ut0byte.h"
  14. #include "mtr0types.h"
  15. #include "page0types.h"
  16. /* Logging modes for a mini-transaction */
  17. #define MTR_LOG_ALL 21 /* default mode: log all operations
  18. modifying disk-based data */
  19. #define MTR_LOG_NONE 22 /* log no operations */
  20. /*#define MTR_LOG_SPACE 23 */ /* log only operations modifying
  21. file space page allocation data
  22. (operations in fsp0fsp.* ) */
  23. #define MTR_LOG_SHORT_INSERTS 24 /* inserts are logged in a shorter
  24. form */
  25. /* Types for the mlock objects to store in the mtr memo; NOTE that the
  26. first 3 values must be RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */
  27. #define MTR_MEMO_PAGE_S_FIX RW_S_LATCH
  28. #define MTR_MEMO_PAGE_X_FIX RW_X_LATCH
  29. #define MTR_MEMO_BUF_FIX RW_NO_LATCH
  30. #define MTR_MEMO_MODIFY 54
  31. #define MTR_MEMO_S_LOCK 55
  32. #define MTR_MEMO_X_LOCK 56
  33. /* Log item types: we have made them to be of the type 'byte'
  34. for the compiler to warn if val and type parameters are switched
  35. in a call to mlog_write_ulint. NOTE! For 1 - 8 bytes, the
  36. flag value must give the length also! */
  37. #define MLOG_SINGLE_REC_FLAG 128 /* if the mtr contains only
  38. one log record for one page,
  39. i.e., write_initial_log_record
  40. has been called only once,
  41. this flag is ORed to the type
  42. of that first log record */
  43. #define MLOG_1BYTE ((byte)1)  /* one byte is written */
  44. #define MLOG_2BYTES ((byte)2) /* 2 bytes ... */
  45. #define MLOG_4BYTES ((byte)4) /* 4 bytes ... */
  46. #define MLOG_8BYTES ((byte)8) /* 8 bytes ... */
  47. #define MLOG_REC_INSERT ((byte)9) /* record insert */
  48. #define MLOG_REC_CLUST_DELETE_MARK ((byte)10)  /* mark clustered index record
  49. deleted */
  50. #define MLOG_REC_SEC_DELETE_MARK ((byte)11)  /* mark secondary index record
  51. deleted */
  52. #define MLOG_REC_UPDATE_IN_PLACE ((byte)13) /* update of a record,
  53. preserves record field sizes */
  54. #define MLOG_REC_DELETE ((byte)14) /* delete a record from a
  55. page */
  56. #define MLOG_LIST_END_DELETE  ((byte)15) /* delete record list end on
  57. index page */
  58. #define MLOG_LIST_START_DELETE  ((byte)16)  /* delete record list start on
  59. index page */
  60. #define MLOG_LIST_END_COPY_CREATED ((byte)17)  /* copy record list end to a
  61. new created index page */
  62. #define MLOG_PAGE_REORGANIZE  ((byte)18) /* reorganize an index page */
  63. #define MLOG_PAGE_CREATE  ((byte)19) /* create an index page */
  64. #define MLOG_UNDO_INSERT  ((byte)20) /* insert entry in an undo
  65. log */
  66. #define MLOG_UNDO_ERASE_END ((byte)21) /* erase an undo log page end */
  67. #define MLOG_UNDO_INIT  ((byte)22) /* initialize a page in an
  68. undo log */
  69. #define MLOG_UNDO_HDR_DISCARD ((byte)23) /* discard an update undo log
  70. header */
  71. #define MLOG_UNDO_HDR_REUSE ((byte)24) /* reuse an insert undo log
  72. header */
  73. #define MLOG_UNDO_HDR_CREATE ((byte)25) /* create an undo log header */
  74. #define MLOG_REC_MIN_MARK ((byte)26) /* mark an index record as the
  75. predefined minimum record */
  76. #define MLOG_IBUF_BITMAP_INIT ((byte)27) /* initialize an ibuf bitmap
  77. page */
  78. #define MLOG_FULL_PAGE ((byte)28) /* full contents of a page */
  79. #define MLOG_INIT_FILE_PAGE ((byte)29) /* this means that a file page
  80. is taken into use and the prior
  81. contents of the page should be
  82. ignored: in recovery we must
  83. not trust the lsn values stored
  84. to the file page */
  85. #define MLOG_WRITE_STRING ((byte)30) /* write a string to a page */
  86. #define MLOG_MULTI_REC_END ((byte)31) /* if a single mtr writes
  87. log records for several pages,
  88. this log record ends the
  89. sequence of these records */
  90. #define MLOG_DUMMY_RECORD ((byte)32) /* dummy log record used to
  91. pad a log block full */
  92. #define MLOG_BIGGEST_TYPE ((byte)32)  /* biggest value (used in
  93. asserts) */
  94. /*******************************************************************
  95. Starts a mini-transaction and creates a mini-transaction handle 
  96. and buffer in the memory buffer given by the caller. */
  97. UNIV_INLINE
  98. mtr_t*
  99. mtr_start(
  100. /*======*/
  101. /* out: mtr buffer which also acts as
  102. the mtr handle */
  103. mtr_t* mtr); /* in: memory buffer for the mtr buffer */
  104. /*******************************************************************
  105. Starts a mini-transaction and creates a mini-transaction handle 
  106. and buffer in the memory buffer given by the caller. */
  107. mtr_t*
  108. mtr_start_noninline(
  109. /*================*/
  110. /* out: mtr buffer which also acts as
  111. the mtr handle */
  112. mtr_t* mtr); /* in: memory buffer for the mtr buffer */
  113. /*******************************************************************
  114. Commits a mini-transaction. */
  115. void
  116. mtr_commit(
  117. /*=======*/
  118. mtr_t* mtr); /* in: mini-transaction */
  119. /****************************************************************
  120. Writes to the database log the full contents of the pages that this mtr is
  121. the first to modify in the buffer pool. This function is called when the
  122. database is in the online backup state. */
  123. void
  124. mtr_log_write_backup_entries(
  125. /*=========================*/
  126. mtr_t* mtr, /* in: mini-transaction */
  127. dulint backup_lsn); /* in: online backup lsn */
  128. /**************************************************************
  129. Sets and returns a savepoint in mtr. */
  130. UNIV_INLINE
  131. ulint
  132. mtr_set_savepoint(
  133. /*==============*/
  134. /* out: savepoint */
  135. mtr_t* mtr); /* in: mtr */
  136. /**************************************************************
  137. Releases the latches stored in an mtr memo down to a savepoint.
  138. NOTE! The mtr must not have made changes to buffer pages after the
  139. savepoint, as these can be handled only by mtr_commit. */
  140. void
  141. mtr_rollback_to_savepoint(
  142. /*======================*/
  143. mtr_t* mtr, /* in: mtr */
  144. ulint savepoint); /* in: savepoint */
  145. /**************************************************************
  146. Releases the (index tree) s-latch stored in an mtr memo after a
  147. savepoint. */
  148. UNIV_INLINE
  149. void
  150. mtr_release_s_latch_at_savepoint(
  151. /*=============================*/
  152. mtr_t* mtr, /* in: mtr */
  153. ulint savepoint, /* in: savepoint */
  154. rw_lock_t*  lock); /* in: latch to release */
  155. /*******************************************************************
  156. Gets the logging mode of a mini-transaction. */
  157. UNIV_INLINE
  158. ulint
  159. mtr_get_log_mode(
  160. /*=============*/
  161. /* out: logging mode: MTR_LOG_NONE, ... */
  162. mtr_t* mtr); /* in: mtr */
  163. /*******************************************************************
  164. Changes the logging mode of a mini-transaction. */
  165. UNIV_INLINE
  166. ulint
  167. mtr_set_log_mode(
  168. /*=============*/
  169. /* out: old mode */
  170. mtr_t* mtr, /* in: mtr */
  171. ulint mode); /* in: logging mode: MTR_LOG_NONE, ... */
  172. /************************************************************
  173. Reads 1 - 4 bytes from a file page buffered in the buffer pool. */
  174. ulint
  175. mtr_read_ulint(
  176. /*===========*/
  177. /* out: value read */
  178. byte* ptr, /* in: pointer from where to read */
  179. ulint type, /* in: MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES */
  180. mtr_t* mtr); /* in: mini-transaction handle */
  181. /************************************************************
  182. Reads 8 bytes from a file page buffered in the buffer pool. */
  183. dulint
  184. mtr_read_dulint(
  185. /*===========*/
  186. /* out: value read */
  187. byte* ptr, /* in: pointer from where to read */
  188. ulint type, /* in: MLOG_8BYTES */
  189. mtr_t* mtr); /* in: mini-transaction handle */
  190. /*************************************************************************
  191. This macro locks an rw-lock in s-mode. */
  192. #ifdef UNIV_SYNC_DEBUG
  193. #define mtr_s_lock(B, MTR) mtr_s_lock_func((B), IB__FILE__, __LINE__,
  194. (MTR))
  195. #else
  196. #define mtr_s_lock(B, MTR) mtr_s_lock_func((B), (MTR))
  197. #endif
  198. /*************************************************************************
  199. This macro locks an rw-lock in x-mode. */
  200. #ifdef UNIV_SYNC_DEBUG
  201. #define mtr_x_lock(B, MTR) mtr_x_lock_func((B), IB__FILE__, __LINE__,
  202. (MTR))
  203. #else
  204. #define mtr_x_lock(B, MTR) mtr_x_lock_func((B), (MTR))
  205. #endif
  206. /*************************************************************************
  207. NOTE! Use the macro above!
  208. Locks a lock in s-mode. */
  209. UNIV_INLINE
  210. void
  211. mtr_s_lock_func(
  212. /*============*/
  213. rw_lock_t* lock, /* in: rw-lock */
  214. #ifdef UNIV_SYNC_DEBUG
  215. char* file, /* in: file name */
  216. ulint line, /* in: line number */
  217. #endif
  218. mtr_t* mtr); /* in: mtr */
  219. /*************************************************************************
  220. NOTE! Use the macro above!
  221. Locks a lock in x-mode. */
  222. UNIV_INLINE
  223. void
  224. mtr_x_lock_func(
  225. /*============*/
  226. rw_lock_t* lock, /* in: rw-lock */
  227. #ifdef UNIV_SYNC_DEBUG
  228. char* file, /* in: file name */
  229. ulint line, /* in: line number */
  230. #endif
  231. mtr_t* mtr); /* in: mtr */
  232. /*******************************************************
  233. Releases an object in the memo stack. */
  234. void
  235. mtr_memo_release(
  236. /*=============*/
  237. mtr_t* mtr, /* in: mtr */
  238. void* object, /* in: object */
  239. ulint type); /* in: object type: MTR_MEMO_S_LOCK, ... */
  240. /****************************************************************
  241. Parses a log record which contains the full contents of a page. */
  242. byte*
  243. mtr_log_parse_full_page(
  244. /*====================*/
  245. /* out: end of log record or NULL */
  246. byte* ptr, /* in: buffer */
  247. byte* end_ptr,/* in: buffer end */
  248. page_t* page); /* in: page or NULL */
  249. /**************************************************************
  250. Checks if memo contains the given item. */
  251. UNIV_INLINE
  252. ibool
  253. mtr_memo_contains(
  254. /*==============*/
  255. /* out: TRUE if contains */
  256. mtr_t* mtr, /* in: mtr */
  257. void* object, /* in: object to search */
  258. ulint type); /* in: type of object */
  259. /*************************************************************
  260. Prints info of an mtr handle. */
  261. void
  262. mtr_print(
  263. /*======*/
  264. mtr_t* mtr); /* in: mtr */
  265. /*######################################################################*/
  266. #define MTR_BUF_MEMO_SIZE 200 /* number of slots in memo */
  267. /*******************************************************************
  268. Returns the log object of a mini-transaction buffer. */
  269. UNIV_INLINE
  270. dyn_array_t*
  271. mtr_get_log(
  272. /*========*/
  273. /* out: log */
  274. mtr_t* mtr); /* in: mini-transaction */
  275. /*******************************************************
  276. Pushes an object to an mtr memo stack. */
  277. UNIV_INLINE
  278. void
  279. mtr_memo_push(
  280. /*==========*/
  281. mtr_t* mtr, /* in: mtr */
  282. void* object, /* in: object */
  283. ulint type); /* in: object type: MTR_MEMO_S_LOCK, ... */
  284. /* Type definition of a mini-transaction memo stack slot. */
  285. typedef struct mtr_memo_slot_struct mtr_memo_slot_t;
  286. struct mtr_memo_slot_struct{
  287. ulint type; /* type of the stored object (MTR_MEMO_S_LOCK, ...) */
  288. void* object; /* pointer to the object */
  289. };
  290. /* Mini-transaction handle and buffer */
  291. struct mtr_struct{
  292. ulint state; /* MTR_ACTIVE, MTR_COMMITTING, MTR_COMMITTED */
  293. dyn_array_t memo; /* memo stack for locks etc. */
  294. dyn_array_t log; /* mini-transaction log */
  295. ibool modifications;
  296. /* TRUE if the mtr made modifications to
  297. buffer pool pages */
  298. ulint n_log_recs;
  299. /* count of how many page initial log records
  300. have been written to the mtr log */
  301. ulint log_mode; /* specifies which operations should be
  302. logged; default value MTR_LOG_ALL */
  303. dulint start_lsn;/* start lsn of the possible log entry for
  304. this mtr */
  305. dulint end_lsn;/* end lsn of the possible log entry for
  306. this mtr */
  307. ulint magic_n;
  308. };
  309. #define MTR_MAGIC_N 54551
  310. #define MTR_ACTIVE 12231
  311. #define MTR_COMMITTING 56456
  312. #define MTR_COMMITTED 34676
  313. #ifndef UNIV_NONINL
  314. #include "mtr0mtr.ic"
  315. #endif
  316. #endif