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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Transaction system
  3. (c) 1996 Innobase Oy
  4. Created 3/26/1996 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef trx0sys_h
  7. #define trx0sys_h
  8. #include "univ.i"
  9. #include "trx0types.h"
  10. #include "mtr0mtr.h"
  11. #include "mtr0log.h"
  12. #include "ut0byte.h"
  13. #include "mem0mem.h"
  14. #include "sync0sync.h"
  15. #include "ut0lst.h"
  16. #include "buf0buf.h"
  17. #include "fil0fil.h"
  18. #include "fut0lst.h"
  19. #include "fsp0fsp.h"
  20. #include "read0types.h"
  21. /* In a MySQL replication slave, in crash recovery we store the master log
  22. file name and position here. We have successfully got the updates to InnoDB
  23. up to this position. If .._pos is -1, it means no crash recovery was needed,
  24. or there was no master log position info inside InnoDB. */
  25. extern char  trx_sys_mysql_master_log_name[];
  26. extern ib_longlong trx_sys_mysql_master_log_pos;
  27. /* If this MySQL server uses binary logging, after InnoDB has been inited
  28. and if it has done a crash recovery, we store the binlog file name and position
  29. here. If .._pos is -1, it means there was no binlog position info inside
  30. InnoDB. */
  31. extern char  trx_sys_mysql_bin_log_name[];
  32. extern ib_longlong trx_sys_mysql_bin_log_pos;
  33. /* The transaction system */
  34. extern trx_sys_t* trx_sys;
  35. /* Doublewrite system */
  36. extern trx_doublewrite_t* trx_doublewrite;
  37. extern ibool trx_doublewrite_must_reset_space_ids;
  38. extern ibool trx_sys_multiple_tablespace_format;
  39. /********************************************************************
  40. Creates the doublewrite buffer to a new InnoDB installation. The header of the
  41. doublewrite buffer is placed on the trx system header page. */
  42. void
  43. trx_sys_create_doublewrite_buf(void);
  44. /*================================*/
  45. /********************************************************************
  46. At a database startup initializes the doublewrite buffer memory structure if
  47. we already have a doublewrite buffer created in the data files. If we are
  48. upgrading to an InnoDB version which supports multiple tablespaces, then this
  49. function performs the necessary update operations. If we are in a crash
  50. recovery, this function uses a possible doublewrite buffer to restore
  51. half-written pages in the data files. */
  52. void
  53. trx_sys_doublewrite_init_or_restore_pages(
  54. /*======================================*/
  55. ibool restore_corrupt_pages);
  56. /********************************************************************
  57. Marks the trx sys header when we have successfully upgraded to the >= 4.1.x
  58. multiple tablespace format. */
  59. void
  60. trx_sys_mark_upgraded_to_multiple_tablespaces(void);
  61. /*===============================================*/
  62. /********************************************************************
  63. Determines if a page number is located inside the doublewrite buffer. */
  64. ibool
  65. trx_doublewrite_page_inside(
  66. /*========================*/
  67. /* out: TRUE if the location is inside
  68. the two blocks of the doublewrite buffer */
  69. ulint page_no); /* in: page number */
  70. /*******************************************************************
  71. Checks if a page address is the trx sys header page. */
  72. UNIV_INLINE
  73. ibool
  74. trx_sys_hdr_page(
  75. /*=============*/
  76. /* out: TRUE if trx sys header page */
  77. ulint space, /* in: space */
  78. ulint page_no);/* in: page number */
  79. /*********************************************************************
  80. Creates and initializes the central memory structures for the transaction
  81. system. This is called when the database is started. */
  82. void
  83. trx_sys_init_at_db_start(void);
  84. /*==========================*/
  85. /*********************************************************************
  86. Creates and initializes the transaction system at the database creation. */
  87. void
  88. trx_sys_create(void);
  89. /*================*/
  90. /********************************************************************
  91. Looks for a free slot for a rollback segment in the trx system file copy. */
  92. ulint
  93. trx_sysf_rseg_find_free(
  94. /*====================*/
  95. /* out: slot index or ULINT_UNDEFINED
  96. if not found */
  97. mtr_t* mtr); /* in: mtr */
  98. /*******************************************************************
  99. Gets the pointer in the nth slot of the rseg array. */
  100. UNIV_INLINE
  101. trx_rseg_t*
  102. trx_sys_get_nth_rseg(
  103. /*=================*/
  104. /* out: pointer to rseg object, NULL if slot
  105. not in use */
  106. trx_sys_t* sys, /* in: trx system */
  107. ulint n); /* in: index of slot */
  108. /*******************************************************************
  109. Sets the pointer in the nth slot of the rseg array. */
  110. UNIV_INLINE
  111. void
  112. trx_sys_set_nth_rseg(
  113. /*=================*/
  114. trx_sys_t* sys, /* in: trx system */
  115. ulint n, /* in: index of slot */
  116. trx_rseg_t* rseg); /* in: pointer to rseg object, NULL if slot
  117. not in use */
  118. /**************************************************************************
  119. Gets a pointer to the transaction system file copy and x-locks its page. */
  120. UNIV_INLINE
  121. trx_sysf_t*
  122. trx_sysf_get(
  123. /*=========*/
  124. /* out: pointer to system file copy, page x-locked */
  125. mtr_t* mtr); /* in: mtr */
  126. /*********************************************************************
  127. Gets the space of the nth rollback segment slot in the trx system
  128. file copy. */
  129. UNIV_INLINE
  130. ulint
  131. trx_sysf_rseg_get_space(
  132. /*====================*/
  133. /* out: space id */
  134. trx_sysf_t* sys_header, /* in: trx sys file copy */
  135. ulint i, /* in: slot index == rseg id */
  136. mtr_t* mtr); /* in: mtr */
  137. /*********************************************************************
  138. Gets the page number of the nth rollback segment slot in the trx system
  139. file copy. */
  140. UNIV_INLINE
  141. ulint
  142. trx_sysf_rseg_get_page_no(
  143. /*======================*/
  144. /* out: page number, FIL_NULL
  145. if slot unused */
  146. trx_sysf_t* sys_header, /* in: trx sys file copy */
  147. ulint i, /* in: slot index == rseg id */
  148. mtr_t* mtr); /* in: mtr */
  149. /*********************************************************************
  150. Sets the space id of the nth rollback segment slot in the trx system
  151. file copy. */
  152. UNIV_INLINE
  153. void
  154. trx_sysf_rseg_set_space(
  155. /*====================*/
  156. trx_sysf_t* sys_header, /* in: trx sys file copy */
  157. ulint i, /* in: slot index == rseg id */
  158. ulint space, /* in: space id */
  159. mtr_t* mtr); /* in: mtr */
  160. /*********************************************************************
  161. Sets the page number of the nth rollback segment slot in the trx system
  162. file copy. */
  163. UNIV_INLINE
  164. void
  165. trx_sysf_rseg_set_page_no(
  166. /*======================*/
  167. trx_sysf_t* sys_header, /* in: trx sys file copy */
  168. ulint i, /* in: slot index == rseg id */
  169. ulint page_no, /* in: page number, FIL_NULL if
  170. the slot is reset to unused */
  171. mtr_t* mtr); /* in: mtr */
  172. /*********************************************************************
  173. Allocates a new transaction id. */
  174. UNIV_INLINE
  175. dulint
  176. trx_sys_get_new_trx_id(void);
  177. /*========================*/
  178. /* out: new, allocated trx id */
  179. /*********************************************************************
  180. Allocates a new transaction number. */
  181. UNIV_INLINE
  182. dulint
  183. trx_sys_get_new_trx_no(void);
  184. /*========================*/
  185. /* out: new, allocated trx number */
  186. /*********************************************************************
  187. Writes a trx id to an index page. In case that the id size changes in
  188. some future version, this function should be used instead of
  189. mach_write_... */
  190. UNIV_INLINE
  191. void
  192. trx_write_trx_id(
  193. /*=============*/
  194. byte* ptr, /* in: pointer to memory where written */
  195. dulint id); /* in: id */
  196. /*********************************************************************
  197. Reads a trx id from an index page. In case that the id size changes in
  198. some future version, this function should be used instead of
  199. mach_read_... */
  200. UNIV_INLINE
  201. dulint
  202. trx_read_trx_id(
  203. /*============*/
  204. /* out: id */
  205. byte* ptr); /* in: pointer to memory from where to read */
  206. /********************************************************************
  207. Looks for the trx handle with the given id in trx_list. */
  208. UNIV_INLINE
  209. trx_t*
  210. trx_get_on_id(
  211. /*==========*/
  212. /* out: the trx handle or NULL if not found */
  213. dulint trx_id); /* in: trx id to search for */
  214. /********************************************************************
  215. Returns the minumum trx id in trx list. This is the smallest id for which
  216. the trx can possibly be active. (But, you must look at the trx->conc_state to
  217. find out if the minimum trx id transaction itself is active, or already
  218. committed.) */
  219. UNIV_INLINE
  220. dulint
  221. trx_list_get_min_trx_id(void);
  222. /*=========================*/
  223. /* out: the minimum trx id, or trx_sys->max_trx_id
  224. if the trx list is empty */
  225. /********************************************************************
  226. Checks if a transaction with the given id is active. */
  227. UNIV_INLINE
  228. ibool
  229. trx_is_active(
  230. /*==========*/
  231. /* out: TRUE if active */
  232. dulint trx_id);/* in: trx id of the transaction */
  233. /********************************************************************
  234. Checks that trx is in the trx list. */
  235. ibool
  236. trx_in_trx_list(
  237. /*============*/
  238. /* out: TRUE if is in */
  239. trx_t* in_trx);/* in: trx */
  240. /*********************************************************************
  241. Updates the offset information about the end of the MySQL binlog entry
  242. which corresponds to the transaction just being committed. In a MySQL
  243. replication slave updates the latest master binlog position up to which
  244. replication has proceeded. */
  245. void
  246. trx_sys_update_mysql_binlog_offset(
  247. /*===============================*/
  248. const char* file_name,/* in: MySQL log file name */
  249. ib_longlong offset, /* in: position in that log file */
  250. ulint field, /* in: offset of the MySQL log info field in
  251. the trx sys header */
  252. mtr_t* mtr); /* in: mtr */
  253. /*********************************************************************
  254. Prints to stderr the MySQL binlog offset info in the trx system header if
  255. the magic number shows it valid. */
  256. void
  257. trx_sys_print_mysql_binlog_offset(void);
  258. /*===================================*/
  259. #ifdef UNIV_HOTBACKUP
  260. /*********************************************************************
  261. Prints to stderr the MySQL binlog info in the system header if the
  262. magic number shows it valid. */
  263. void
  264. trx_sys_print_mysql_binlog_offset_from_page(
  265. /*========================================*/
  266. byte* page); /* in: buffer containing the trx system header page,
  267. i.e., page number TRX_SYS_PAGE_NO in the tablespace */
  268. #endif /* UNIV_HOTBACKUP */
  269. /*********************************************************************
  270. Prints to stderr the MySQL master log offset info in the trx system header if
  271. the magic number shows it valid. */
  272. void
  273. trx_sys_print_mysql_master_log_pos(void);
  274. /*====================================*/
  275. /* The automatically created system rollback segment has this id */
  276. #define TRX_SYS_SYSTEM_RSEG_ID 0
  277. /* Space id and page no where the trx system file copy resides */
  278. #define TRX_SYS_SPACE 0 /* the SYSTEM tablespace */
  279. #define TRX_SYS_PAGE_NO FSP_TRX_SYS_PAGE_NO
  280. /* The offset of the transaction system header on the page */
  281. #define TRX_SYS FSEG_PAGE_DATA
  282. /* Transaction system header */
  283. /*-------------------------------------------------------------*/
  284. #define TRX_SYS_TRX_ID_STORE 0 /* the maximum trx id or trx number
  285. modulo TRX_SYS_TRX_ID_UPDATE_MARGIN
  286. written to a file page by any
  287. transaction; the assignment of
  288. transaction ids continues from this
  289. number rounded up by .._MARGIN plus
  290. .._MARGIN when the database is
  291. started */
  292. #define TRX_SYS_FSEG_HEADER 8 /* segment header for the tablespace
  293. segment the trx system is created
  294. into */
  295. #define TRX_SYS_RSEGS (8 + FSEG_HEADER_SIZE)
  296. /* the start of the array of rollback
  297. segment specification slots */
  298. /*-------------------------------------------------------------*/
  299. /* Max number of rollback segments: the number of segment specification slots
  300. in the transaction system array; rollback segment id must fit in one byte,
  301. therefore 256; each slot is currently 8 bytes in size */
  302. #define TRX_SYS_N_RSEGS 256
  303. #define TRX_SYS_MYSQL_LOG_NAME_LEN 512
  304. #define TRX_SYS_MYSQL_LOG_MAGIC_N 873422344
  305. /* The offset of the MySQL replication info in the trx system header;
  306. this contains the same fields as TRX_SYS_MYSQL_LOG_INFO below */
  307. #define TRX_SYS_MYSQL_MASTER_LOG_INFO (UNIV_PAGE_SIZE - 2000)
  308. /* The offset of the MySQL binlog offset info in the trx system header */
  309. #define TRX_SYS_MYSQL_LOG_INFO (UNIV_PAGE_SIZE - 1000)
  310. #define TRX_SYS_MYSQL_LOG_MAGIC_N_FLD 0 /* magic number which shows
  311. if we have valid data in the
  312. MySQL binlog info; the value
  313. is ..._MAGIC_N if yes */
  314. #define TRX_SYS_MYSQL_LOG_OFFSET_HIGH 4 /* high 4 bytes of the offset
  315. within that file */
  316. #define TRX_SYS_MYSQL_LOG_OFFSET_LOW 8 /* low 4 bytes of the offset
  317. within that file */
  318. #define TRX_SYS_MYSQL_LOG_NAME 12 /* MySQL log file name */
  319. /* The offset of the doublewrite buffer header on the trx system header page */
  320. #define TRX_SYS_DOUBLEWRITE (UNIV_PAGE_SIZE - 200)
  321. /*-------------------------------------------------------------*/
  322. #define TRX_SYS_DOUBLEWRITE_FSEG  0 /* fseg header of the fseg
  323. containing the doublewrite
  324. buffer */
  325. #define TRX_SYS_DOUBLEWRITE_MAGIC  FSEG_HEADER_SIZE
  326. /* 4-byte magic number which
  327. shows if we already have
  328. created the doublewrite
  329. buffer */
  330. #define TRX_SYS_DOUBLEWRITE_BLOCK1 (4 + FSEG_HEADER_SIZE)
  331. /* page number of the
  332. first page in the first
  333. sequence of 64
  334. (= FSP_EXTENT_SIZE) consecutive
  335. pages in the doublewrite
  336. buffer */
  337. #define TRX_SYS_DOUBLEWRITE_BLOCK2 (8 + FSEG_HEADER_SIZE)
  338. /* page number of the
  339. first page in the second
  340. sequence of 64 consecutive
  341. pages in the doublewrite
  342. buffer */
  343. #define TRX_SYS_DOUBLEWRITE_REPEAT 12 /* we repeat the above 3
  344. numbers so that if the trx
  345. sys header is half-written
  346. to disk, we still may be able
  347. to recover the information */
  348. #define TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED (24 + FSEG_HEADER_SIZE)
  349. /* If this is not yet set to
  350. .._N, we must reset the
  351. doublewrite buffer, because
  352. starting from 4.1.x the space
  353. id of a data page is stored to
  354. FIL_PAGE_ARCH_LOG_NO_OR_SPACE_NO */
  355. /*-------------------------------------------------------------*/
  356. #define TRX_SYS_DOUBLEWRITE_MAGIC_N 536853855
  357. #define TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N 1783657386
  358. #define TRX_SYS_DOUBLEWRITE_BLOCK_SIZE FSP_EXTENT_SIZE
  359. /* Doublewrite control struct */
  360. struct trx_doublewrite_struct{
  361. mutex_t mutex; /* mutex protecting the first_free field and
  362. write_buf */
  363. ulint block1; /* the page number of the first
  364. doublewrite block (64 pages) */
  365. ulint block2; /* page number of the second block */
  366. ulint first_free; /* first free position in write_buf measured
  367. in units of UNIV_PAGE_SIZE */
  368. byte* write_buf;  /* write buffer used in writing to the
  369. doublewrite buffer, aligned to an
  370. address divisible by UNIV_PAGE_SIZE
  371. (which is required by Windows aio) */
  372. byte* write_buf_unaligned; /* pointer to write_buf, but unaligned */
  373. buf_block_t**
  374. buf_block_arr; /* array to store pointers to the buffer
  375. blocks which have been cached to write_buf */
  376. };
  377. /* The transaction system central memory data structure; protected by the
  378. kernel mutex */
  379. struct trx_sys_struct{
  380. dulint max_trx_id; /* The smallest number not yet
  381. assigned as a transaction id or
  382. transaction number */
  383. UT_LIST_BASE_NODE_T(trx_t) trx_list;
  384. /* List of active and committed in
  385. memory transactions, sorted on trx id,
  386. biggest first */
  387. UT_LIST_BASE_NODE_T(trx_t) mysql_trx_list;
  388. /* List of transactions created
  389. for MySQL */
  390. UT_LIST_BASE_NODE_T(trx_rseg_t) rseg_list;
  391. /* List of rollback segment objects */
  392. trx_rseg_t* latest_rseg; /* Latest rollback segment in the
  393. round-robin assignment of rollback
  394. segments to transactions */
  395. trx_rseg_t* rseg_array[TRX_SYS_N_RSEGS];
  396. /* Pointer array to rollback segments;
  397. NULL if slot not in use */
  398. ulint rseg_history_len;/* Length of the TRX_RSEG_HISTORY
  399. list (update undo logs for committed
  400. transactions), protected by
  401. rseg->mutex */
  402. UT_LIST_BASE_NODE_T(read_view_t) view_list;
  403. /* List of read views sorted on trx no,
  404. biggest first */
  405. };
  406. /* When a trx id which is zero modulo this number (which must be a power of
  407. two) is assigned, the field TRX_SYS_TRX_ID_STORE on the transaction system
  408. page is updated */
  409. #define TRX_SYS_TRX_ID_WRITE_MARGIN 256
  410. #ifndef UNIV_NONINL
  411. #include "trx0sys.ic"
  412. #endif
  413. #endif