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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Mini-transaction logging routines
  3. (c) 1995 Innobase Oy
  4. Created 12/7/1995 Heikki Tuuri
  5. *******************************************************/
  6. #include "mach0data.h"
  7. #include "ut0lst.h"
  8. #include "buf0buf.h"
  9. /************************************************************
  10. Opens a buffer to mlog. It must be closed with mlog_close. */
  11. UNIV_INLINE
  12. byte*
  13. mlog_open(
  14. /*======*/
  15. /* out: buffer, NULL if log mode MTR_LOG_NONE */
  16. mtr_t* mtr, /* in: mtr */
  17. ulint size) /* in: buffer size in bytes; MUST be
  18. smaller than DYN_ARRAY_DATA_SIZE! */
  19. {
  20. dyn_array_t* mlog;
  21. mtr->modifications = TRUE;
  22. if (mtr_get_log_mode(mtr) == MTR_LOG_NONE) {
  23. return(NULL);
  24. }
  25. mlog = &(mtr->log);
  26. return(dyn_array_open(mlog, size));
  27. }
  28. /************************************************************
  29. Closes a buffer opened to mlog. */
  30. UNIV_INLINE
  31. void
  32. mlog_close(
  33. /*=======*/
  34. mtr_t* mtr, /* in: mtr */
  35. byte* ptr) /* in: buffer space from ptr up was not used */
  36. {
  37. dyn_array_t* mlog;
  38. ut_ad(mtr_get_log_mode(mtr) != MTR_LOG_NONE);
  39. mlog = &(mtr->log);
  40. dyn_array_close(mlog, ptr);
  41. }
  42. /************************************************************
  43. Catenates 1 - 4 bytes to the mtr log. The value is not compressed. */
  44. UNIV_INLINE
  45. void
  46. mlog_catenate_ulint(
  47. /*================*/
  48. mtr_t* mtr, /* in: mtr */
  49. ulint val, /* in: value to write */
  50. ulint type) /* in: MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES */
  51. {
  52. dyn_array_t* mlog;
  53. byte* ptr;
  54. if (mtr_get_log_mode(mtr) == MTR_LOG_NONE) {
  55. return;
  56. }
  57. mlog = &(mtr->log);
  58. ut_ad(MLOG_1BYTE == 1);
  59. ut_ad(MLOG_2BYTES == 2);
  60. ut_ad(MLOG_4BYTES == 4);
  61. ptr = dyn_array_push(mlog, type);
  62. if (type == MLOG_4BYTES) {
  63. mach_write_to_4(ptr, val);
  64. } else if (type == MLOG_2BYTES) {
  65. mach_write_to_2(ptr, val);
  66. } else {
  67. ut_ad(type == MLOG_1BYTE);
  68. mach_write_to_1(ptr, val);
  69.   }
  70. }
  71. /************************************************************
  72. Catenates a compressed ulint to mlog. */
  73. UNIV_INLINE
  74. void
  75. mlog_catenate_ulint_compressed(
  76. /*===========================*/
  77. mtr_t* mtr, /* in: mtr */
  78. ulint val) /* in: value to write */
  79. {
  80. byte* log_ptr;
  81. log_ptr = mlog_open(mtr, 10);
  82. /* If no logging is requested, we may return now */
  83. if (log_ptr == NULL) {
  84. return;
  85. }
  86. log_ptr += mach_write_compressed(log_ptr, val);
  87. mlog_close(mtr, log_ptr);
  88. }
  89. /************************************************************
  90. Catenates a compressed dulint to mlog. */
  91. UNIV_INLINE
  92. void
  93. mlog_catenate_dulint_compressed(
  94. /*============================*/
  95. mtr_t* mtr, /* in: mtr */
  96. dulint val) /* in: value to write */
  97. {
  98. byte* log_ptr;
  99. log_ptr = mlog_open(mtr, 15);
  100. /* If no logging is requested, we may return now */
  101. if (log_ptr == NULL) {
  102. return;
  103. }
  104. log_ptr += mach_dulint_write_compressed(log_ptr, val);
  105. mlog_close(mtr, log_ptr);
  106. }
  107. /************************************************************
  108. Writes the initial part of a log record (3..11 bytes).
  109. If the implementation of this function is changed, all
  110. size parameters to mlog_open() should be adjusted accordingly! */
  111. UNIV_INLINE
  112. byte*
  113. mlog_write_initial_log_record_fast(
  114. /*===============================*/
  115. /* out: new value of log_ptr */
  116. byte* ptr, /* in: pointer to (inside) a buffer frame holding the
  117. file page where modification is made */
  118. byte type, /* in: log item type: MLOG_1BYTE, ... */
  119. byte* log_ptr,/* in: pointer to mtr log which has been opened */
  120. mtr_t* mtr) /* in: mtr */
  121. {
  122. buf_block_t* block;
  123. ulint space;
  124. ulint offset;
  125. ut_ad(mtr_memo_contains(mtr, buf_block_align(ptr), 
  126. MTR_MEMO_PAGE_X_FIX));
  127. ut_ad(type <= MLOG_BIGGEST_TYPE);
  128. ut_ad(ptr && log_ptr);
  129. block = buf_block_align(ptr);
  130. space = buf_block_get_space(block);
  131. offset = buf_block_get_page_no(block);
  132. mach_write_to_1(log_ptr, type);
  133. log_ptr++;
  134. log_ptr += mach_write_compressed(log_ptr, space);
  135. log_ptr += mach_write_compressed(log_ptr, offset);
  136. mtr->n_log_recs++;
  137. #ifdef UNIV_LOG_DEBUG
  138. /* fprintf(stderr,
  139. "Adding to mtr log record type %lu space %lu page no %lun",
  140. type, space, offset); */
  141. #endif
  142. #ifdef UNIV_DEBUG
  143. /* We now assume that all x-latched pages have been modified! */
  144. if (!mtr_memo_contains(mtr, block, MTR_MEMO_MODIFY)) {
  145. mtr_memo_push(mtr, block, MTR_MEMO_MODIFY);
  146. }
  147. #endif
  148. return(log_ptr);
  149. }
  150. /************************************************************
  151. Writes a log record about an .ibd file create/delete/rename. */
  152. UNIV_INLINE
  153. byte*
  154. mlog_write_initial_log_record_for_file_op(
  155. /*======================================*/
  156. /* out: new value of log_ptr */
  157. ulint type, /* in: MLOG_FILE_CREATE, MLOG_FILE_DELETE, or
  158. MLOG_FILE_RENAME */
  159. ulint space_id,/* in: space id, if applicable */
  160. ulint page_no,/* in: page number (not relevant currently) */
  161. byte* log_ptr,/* in: pointer to mtr log which has been opened */
  162. mtr_t* mtr) /* in: mtr */
  163. {
  164. ut_ad(log_ptr);
  165. mach_write_to_1(log_ptr, type);
  166. log_ptr++;
  167. /* We write dummy space id and page number */
  168. log_ptr += mach_write_compressed(log_ptr, space_id);
  169. log_ptr += mach_write_compressed(log_ptr, page_no);
  170. mtr->n_log_recs++;
  171. return(log_ptr);
  172. }