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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Recovery
  3. (c) 1997 Innobase Oy
  4. Created 9/20/1997 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef log0recv_h
  7. #define log0recv_h
  8. #include "univ.i"
  9. #include "ut0byte.h"
  10. #include "page0types.h"
  11. #include "hash0hash.h"
  12. #include "log0log.h"
  13. /***********************************************************************
  14. Returns TRUE if recovery is currently running. */
  15. UNIV_INLINE
  16. ibool
  17. recv_recovery_is_on(void);
  18. /*=====================*/
  19. /***********************************************************************
  20. Returns TRUE if recovery from backup is currently running. */
  21. UNIV_INLINE
  22. ibool
  23. recv_recovery_from_backup_is_on(void);
  24. /*=================================*/
  25. /****************************************************************************
  26. Applies the hashed log records to the page, if the page lsn is less than the
  27. lsn of a log record. This can be called when a buffer page has just been
  28. read in, or also for a page already in the buffer pool. */
  29. void
  30. recv_recover_page(
  31. /*==============*/
  32. ibool just_read_in, /* in: TRUE if the i/o-handler calls this for
  33. a freshly read page */
  34. page_t* page, /* in: buffer page */
  35. ulint space, /* in: space id */
  36. ulint page_no); /* in: page number */
  37. /************************************************************
  38. Recovers from a checkpoint. When this function returns, the database is able
  39. to start processing of new user transactions, but the function
  40. recv_recovery_from_checkpoint_finish should be called later to complete
  41. the recovery and free the resources used in it. */
  42. ulint
  43. recv_recovery_from_checkpoint_start(
  44. /*================================*/
  45. /* out: error code or DB_SUCCESS */
  46. ulint type, /* in: LOG_CHECKPOINT or LOG_ARCHIVE */
  47. dulint limit_lsn, /* in: recover up to this lsn if possible */
  48. dulint min_flushed_lsn,/* in: min flushed lsn from data files */
  49. dulint max_flushed_lsn);/* in: max flushed lsn from data files */
  50. /************************************************************
  51. Completes recovery from a checkpoint. */
  52. void
  53. recv_recovery_from_checkpoint_finish(void);
  54. /*======================================*/
  55. /***********************************************************
  56. Scans log from a buffer and stores new log data to the parsing buffer. Parses
  57. and hashes the log records if new data found. */
  58. ibool
  59. recv_scan_log_recs(
  60. /*===============*/
  61. /* out: TRUE if limit_lsn has been reached, or
  62. not able to scan any more in this log group */
  63. ibool store_to_hash, /* in: TRUE if the records should be stored
  64. to the hash table; this is set FALSE if just
  65. debug checking is needed */
  66. byte* buf, /* in: buffer containing a log segment or
  67. garbage */
  68. ulint len, /* in: buffer length */
  69. dulint start_lsn, /* in: buffer start lsn */
  70. dulint* contiguous_lsn, /* in/out: it is known that all log groups
  71. contain contiguous log data up to this lsn */
  72. dulint* group_scanned_lsn);/* out: scanning succeeded up to this lsn */
  73. /**********************************************************
  74. Resets the logs. The contents of log files will be lost! */
  75. void
  76. recv_reset_logs(
  77. /*============*/
  78. dulint lsn, /* in: reset to this lsn rounded up to
  79. be divisible by OS_FILE_LOG_BLOCK_SIZE,
  80. after which we add LOG_BLOCK_HDR_SIZE */
  81. ulint arch_log_no, /* in: next archived log file number */
  82. ibool new_logs_created);/* in: TRUE if resetting logs is done
  83. at the log creation; FALSE if it is done
  84. after archive recovery */
  85. /************************************************************
  86. Creates the recovery system. */
  87. void
  88. recv_sys_create(void);
  89. /*=================*/
  90. /************************************************************
  91. Inits the recovery system for a recovery operation. */
  92. void
  93. recv_sys_init(void);
  94. /*===============*/
  95. /***********************************************************************
  96. Empties the hash table of stored log records, applying them to appropriate
  97. pages. */
  98. void
  99. recv_apply_hashed_log_recs(
  100. /*=======================*/
  101. ibool allow_ibuf); /* in: if TRUE, also ibuf operations are
  102. allowed during the application; if FALSE,
  103. no ibuf operations are allowed, and after
  104. the application all file pages are flushed to
  105. disk and invalidated in buffer pool: this
  106. alternative means that no new log records
  107. can be generated during the application */
  108. /************************************************************
  109. Recovers from archived log files, and also from log files, if they exist. */
  110. ulint
  111. recv_recovery_from_archive_start(
  112. /*=============================*/
  113. /* out: error code or DB_SUCCESS */
  114. dulint min_flushed_lsn,/* in: min flushed lsn field from the
  115. data files */
  116. dulint limit_lsn, /* in: recover up to this lsn if possible */
  117. ulint first_log_no); /* in: number of the first archived log file
  118. to use in the recovery; the file will be
  119. searched from INNOBASE_LOG_ARCH_DIR specified
  120. in server config file */
  121. /************************************************************
  122. Completes recovery from archive. */
  123. void
  124. recv_recovery_from_archive_finish(void);
  125. /*===================================*/
  126. /***********************************************************************
  127. Checks that a replica of a space is identical to the original space. */
  128. void
  129. recv_compare_spaces(
  130. /*================*/
  131. ulint space1, /* in: space id */
  132. ulint space2, /* in: space id */
  133. ulint n_pages);/* in: number of pages */
  134. /***********************************************************************
  135. Checks that a replica of a space is identical to the original space. Disables
  136. ibuf operations and flushes and invalidates the buffer pool pages after the
  137. test. This function can be used to check the recovery before dict or trx
  138. systems are initialized. */
  139. void
  140. recv_compare_spaces_low(
  141. /*====================*/
  142. ulint space1, /* in: space id */
  143. ulint space2, /* in: space id */
  144. ulint n_pages);/* in: number of pages */
  145. /* Block of log record data */
  146. typedef struct recv_data_struct recv_data_t;
  147. struct recv_data_struct{
  148. recv_data_t* next; /* pointer to the next block or NULL */
  149. /* the log record data is stored physically
  150. immediately after this struct, max amount
  151. RECV_DATA_BLOCK_SIZE bytes of it */
  152. };
  153. /* Stored log record struct */
  154. typedef struct recv_struct recv_t;
  155. struct recv_struct{
  156. byte type; /* log record type */
  157. ulint len; /* log record body length in bytes */
  158. recv_data_t* data; /* chain of blocks containing the log record
  159. body */
  160. dulint start_lsn;/* start lsn of the log segment written by
  161. the mtr which generated this log record: NOTE
  162. that this is not necessarily the start lsn of
  163. this log record */
  164. dulint end_lsn;/* end lsn of the log segment written by
  165. the mtr which generated this log record: NOTE
  166. that this is not necessarily the end lsn of
  167. this log record */
  168. UT_LIST_NODE_T(recv_t)
  169. rec_list;/* list of log records for this page */
  170. };
  171. /* Hashed page file address struct */
  172. typedef struct recv_addr_struct recv_addr_t;
  173. struct recv_addr_struct{
  174. ulint state; /* RECV_NOT_PROCESSED, RECV_BEING_PROCESSED,
  175. or RECV_PROCESSED */
  176. ulint space; /* space id */
  177. ulint page_no;/* page number */
  178. UT_LIST_BASE_NODE_T(recv_t)
  179. rec_list;/* list of log records for this page */
  180. hash_node_t addr_hash;
  181. };
  182. /* Recovery system data structure */
  183. typedef struct recv_sys_struct recv_sys_t;
  184. struct recv_sys_struct{
  185. mutex_t mutex; /* mutex protecting the fields apply_log_recs,
  186. n_addrs, and the state field in each recv_addr
  187. struct */
  188. ibool apply_log_recs;
  189. /* this is TRUE when log rec application to
  190. pages is allowed; this flag tells the
  191. i/o-handler if it should do log record
  192. application */
  193. ibool apply_batch_on;
  194. /* this is TRUE when a log rec application
  195. batch is running */
  196. dulint lsn; /* log sequence number */
  197. ulint last_log_buf_size;
  198. /* size of the log buffer when the database
  199. last time wrote to the log */
  200. byte* last_block;
  201. /* possible incomplete last recovered log
  202. block */
  203. byte* last_block_buf_start;
  204. /* the nonaligned start address of the
  205. preceding buffer */
  206. byte* buf; /* buffer for parsing log records */
  207. ulint len; /* amount of data in buf */
  208. dulint parse_start_lsn;
  209. /* this is the lsn from which we were able to
  210. start parsing log records and adding them to
  211. the hash table; ut_dulint_zero if a suitable
  212. start point not found yet */
  213. dulint scanned_lsn;
  214. /* the log data has been scanned up to this
  215. lsn */
  216. ulint scanned_checkpoint_no;
  217. /* the log data has been scanned up to this
  218. checkpoint number (lowest 4 bytes) */
  219. ulint recovered_offset;
  220. /* start offset of non-parsed log records in
  221. buf */
  222. dulint recovered_lsn;
  223. /* the log records have been parsed up to
  224. this lsn */
  225. dulint limit_lsn;/* recovery should be made at most up to this
  226. lsn */
  227. log_group_t* archive_group;
  228. /* in archive recovery: the log group whose
  229. archive is read */
  230. mem_heap_t* heap; /* memory heap of log records and file
  231. addresses*/
  232. hash_table_t* addr_hash;/* hash table of file addresses of pages */
  233. ulint n_addrs;/* number of not processed hashed file
  234. addresses in the hash table */
  235. };
  236. extern recv_sys_t* recv_sys;
  237. extern ibool recv_recovery_on;
  238. extern ibool recv_no_ibuf_operations;
  239. /* States of recv_addr_struct */
  240. #define RECV_NOT_PROCESSED 71
  241. #define RECV_BEING_READ 72
  242. #define RECV_BEING_PROCESSED 73
  243. #define RECV_PROCESSED 74
  244. /* The number which is added to a space id to obtain the replicate space
  245. in the debug version: spaces with an odd number as the id are replicate
  246. spaces */
  247. #define RECV_REPLICA_SPACE_ADD 1
  248. /* This many blocks must be left free in the buffer pool when we scan
  249. the log and store the scanned log records in the buffer pool: we will
  250. use these free blocks to read in pages when we start applying the
  251. log records to the database. */
  252. #define RECV_POOL_N_FREE_BLOCKS  (ut_min(256, buf_pool_get_curr_size() / 8))
  253. #ifndef UNIV_NONINL
  254. #include "log0recv.ic"
  255. #endif
  256. #endif