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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Transaction system
  3. (c) 1996 Innobase Oy
  4. Created 3/26/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "trx0sys.h"
  7. #ifdef UNIV_NONINL
  8. #include "trx0sys.ic"
  9. #endif
  10. #include "fsp0fsp.h"
  11. #include "mtr0mtr.h"
  12. #include "trx0trx.h"
  13. #include "trx0rseg.h"
  14. #include "trx0undo.h"
  15. #include "srv0srv.h"
  16. #include "trx0purge.h"
  17. /* The transaction system */
  18. trx_sys_t* trx_sys  = NULL;
  19. /********************************************************************
  20. Checks that trx is in the trx list. */
  21. ibool
  22. trx_in_trx_list(
  23. /*============*/
  24. /* out: TRUE if is in */
  25. trx_t* in_trx) /* in: trx */
  26. {
  27. trx_t* trx;
  28. ut_ad(mutex_own(&(kernel_mutex)));
  29. trx = UT_LIST_GET_FIRST(trx_sys->trx_list);
  30. while (trx != NULL) {
  31. if (trx == in_trx) {
  32. return(TRUE);
  33. }
  34. trx = UT_LIST_GET_NEXT(trx_list, trx);
  35. }
  36. return(FALSE);
  37. }
  38. /*********************************************************************
  39. Writes the value of max_trx_id to the file based trx system header. */
  40. void
  41. trx_sys_flush_max_trx_id(void)
  42. /*==========================*/
  43. {
  44. trx_sysf_t* sys_header;
  45. mtr_t mtr;
  46. ut_ad(mutex_own(&kernel_mutex));
  47. mtr_start(&mtr);
  48. sys_header = trx_sysf_get(&mtr);
  49. mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE,
  50. trx_sys->max_trx_id, MLOG_8BYTES, &mtr);
  51. mtr_commit(&mtr);
  52. }
  53. /********************************************************************
  54. Looks for a free slot for a rollback segment in the trx system file copy. */
  55. ulint
  56. trx_sysf_rseg_find_free(
  57. /*====================*/
  58. /* out: slot index or ULINT_UNDEFINED if not found */
  59. mtr_t* mtr) /* in: mtr */
  60. {
  61. trx_sysf_t* sys_header;
  62. ulint page_no;
  63. ulint i;
  64. ut_ad(mutex_own(&(kernel_mutex)));
  65. sys_header = trx_sysf_get(mtr);
  66. for (i = 0; i < TRX_SYS_N_RSEGS; i++) {
  67. page_no = trx_sysf_rseg_get_page_no(sys_header, i, mtr);
  68. if (page_no == FIL_NULL) {
  69. return(i);
  70. }
  71. }
  72. return(ULINT_UNDEFINED);
  73. }
  74. /*********************************************************************
  75. Creates the file page for the transaction system. This function is called only
  76. at the database creation, before trx_sys_init. */
  77. static
  78. void
  79. trx_sysf_create(
  80. /*============*/
  81. mtr_t* mtr) /* in: mtr */
  82. {
  83. trx_sysf_t* sys_header;
  84. ulint slot_no;
  85. page_t* page;
  86. ulint page_no;
  87. ulint i;
  88. ut_ad(mtr);
  89. /* Note that below we first reserve the file space x-latch, and
  90. then enter the kernel: we must do it in this order to conform
  91. to the latching order rules. */
  92. mtr_x_lock(fil_space_get_latch(TRX_SYS_SPACE), mtr);
  93. mutex_enter(&kernel_mutex);
  94. /* Create the trx sys file block in a new allocated file segment */
  95. page = fseg_create(TRX_SYS_SPACE, 0, TRX_SYS + TRX_SYS_FSEG_HEADER,
  96.      mtr);
  97. ut_a(buf_frame_get_page_no(page) == TRX_SYS_PAGE_NO);
  98. buf_page_dbg_add_level(page, SYNC_TRX_SYS_HEADER);
  99. sys_header = trx_sysf_get(mtr);
  100. /* Start counting transaction ids from number 1 up */
  101. mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE,
  102. ut_dulint_create(0, 1), MLOG_8BYTES, mtr);
  103. /* Reset the rollback segment slots */
  104. for (i = 0; i < TRX_SYS_N_RSEGS; i++) {
  105. trx_sysf_rseg_set_page_no(sys_header, i, FIL_NULL, mtr);
  106. }
  107. /* Create the first rollback segment in the SYSTEM tablespace */
  108. page_no = trx_rseg_header_create(TRX_SYS_SPACE, ULINT_MAX, &slot_no,
  109. mtr);
  110. ut_a(slot_no == TRX_SYS_SYSTEM_RSEG_ID);
  111. ut_a(page_no != FIL_NULL);
  112. mutex_exit(&kernel_mutex);
  113. }
  114. /*********************************************************************
  115. Creates and initializes the central memory structures for the transaction
  116. system. This is called when the database is started. */
  117. void
  118. trx_sys_init_at_db_start(void)
  119. /*==========================*/
  120. {
  121. trx_sysf_t* sys_header;
  122. mtr_t mtr;
  123. mtr_start(&mtr);
  124. ut_ad(trx_sys == NULL);
  125. mutex_enter(&kernel_mutex);
  126. trx_sys = mem_alloc(sizeof(trx_sys_t));
  127. sys_header = trx_sysf_get(&mtr);
  128. trx_rseg_list_and_array_init(sys_header, &mtr);
  129. trx_sys->latest_rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list);
  130. /* VERY important: after the database is started, max_trx_id value is
  131. divisible by TRX_SYS_TRX_ID_WRITE_MARGIN, and the 'if' in
  132. trx_sys_get_new_trx_id will evaluate to TRUE when the function
  133. is first time called, and the value for trx id will be written
  134. to the disk-based header! Thus trx id values will not overlap when
  135. the database is repeatedly started! */
  136. trx_sys->max_trx_id = ut_dulint_add(
  137.        ut_dulint_align_up(
  138. mtr_read_dulint(sys_header
  139. + TRX_SYS_TRX_ID_STORE,
  140. MLOG_8BYTES, &mtr),
  141. TRX_SYS_TRX_ID_WRITE_MARGIN),
  142. 2 * TRX_SYS_TRX_ID_WRITE_MARGIN);
  143. trx_lists_init_at_db_start();
  144. if (UT_LIST_GET_LEN(trx_sys->trx_list) > 0) {
  145. fprintf(stderr,
  146. "Innobase: %lu uncommitted transaction(s) which must be rolled backn",
  147. UT_LIST_GET_LEN(trx_sys->trx_list));
  148. }
  149. UT_LIST_INIT(trx_sys->view_list);
  150. trx_purge_sys_create();
  151. mutex_exit(&kernel_mutex);
  152. mtr_commit(&mtr);
  153. }
  154. /*********************************************************************
  155. Creates and initializes the transaction system at the database creation. */
  156. void
  157. trx_sys_create(void)
  158. /*================*/
  159. {
  160. mtr_t mtr;
  161. mtr_start(&mtr);
  162. trx_sysf_create(&mtr);
  163. mtr_commit(&mtr);
  164. trx_sys_init_at_db_start();
  165. }