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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Database log
  3. (c) 1995 Innobase Oy
  4. Created 12/9/1995 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef log0log_h
  7. #define log0log_h
  8. #include "univ.i"
  9. #include "ut0byte.h"
  10. #include "sync0sync.h"
  11. #include "sync0rw.h"
  12. typedef struct log_struct log_t;
  13. typedef struct log_group_struct log_group_t;
  14. extern ibool log_do_write;
  15. extern  ibool log_debug_writes;
  16. /* Wait modes for log_flush_up_to */
  17. #define LOG_NO_WAIT 91
  18. #define LOG_WAIT_ONE_GROUP 92
  19. #define LOG_WAIT_ALL_GROUPS 93
  20. #define LOG_MAX_N_GROUPS 32
  21. /****************************************************************
  22. Writes to the log the string given. The log must be released with
  23. log_release. */
  24. UNIV_INLINE
  25. dulint
  26. log_reserve_and_write_fast(
  27. /*=======================*/
  28. /* out: end lsn of the log record, ut_dulint_zero if
  29. did not succeed */
  30. byte* str, /* in: string */
  31. ulint len, /* in: string length */
  32. dulint* start_lsn,/* out: start lsn of the log record */
  33. ibool* success);/* out: TRUE if success */
  34. /***************************************************************************
  35. Releases the log mutex. */
  36. UNIV_INLINE
  37. void
  38. log_release(void);
  39. /*=============*/
  40. /***************************************************************************
  41. Checks if there is need for a log buffer flush or a new checkpoint, and does
  42. this if yes. Any database operation should call this when it has modified
  43. more than about 4 pages. NOTE that this function may only be called when the
  44. OS thread owns no synchronization objects except the dictionary mutex. */
  45. UNIV_INLINE
  46. void
  47. log_free_check(void);
  48. /*================*/
  49. /****************************************************************
  50. Opens the log for log_write_low. The log must be closed with log_close and
  51. released with log_release. */
  52. dulint
  53. log_reserve_and_open(
  54. /*=================*/
  55. /* out: start lsn of the log record */
  56. ulint len); /* in: length of data to be catenated */
  57. /****************************************************************
  58. Writes to the log the string given. It is assumed that the caller holds the
  59. log mutex. */
  60. void
  61. log_write_low(
  62. /*==========*/
  63. byte* str, /* in: string */
  64. ulint str_len); /* in: string length */
  65. /****************************************************************
  66. Closes the log. */
  67. dulint
  68. log_close(void);
  69. /*===========*/
  70. /* out: lsn */
  71. /****************************************************************
  72. Gets the current lsn. */
  73. UNIV_INLINE
  74. dulint
  75. log_get_lsn(void);
  76. /*=============*/
  77. /* out: current lsn */
  78. /****************************************************************************
  79. Gets the online backup lsn. */
  80. UNIV_INLINE
  81. dulint
  82. log_get_online_backup_lsn_low(void);
  83. /*===============================*/
  84. /****************************************************************************
  85. Gets the online backup state. */
  86. UNIV_INLINE
  87. ibool
  88. log_get_online_backup_state_low(void);
  89. /*=================================*/
  90. /* out: online backup state, the caller must
  91. own the log_sys mutex */
  92. /**********************************************************
  93. Initializes the log. */
  94. void
  95. log_init(void);
  96. /*==========*/
  97. /**********************************************************************
  98. Inits a log group to the log system. */
  99. void
  100. log_group_init(
  101. /*===========*/
  102. ulint id, /* in: group id */
  103. ulint n_files, /* in: number of log files */
  104. ulint file_size, /* in: log file size in bytes */
  105. ulint space_id, /* in: space id of the file space
  106. which contains the log files of this
  107. group */
  108. ulint archive_space_id); /* in: space id of the file space
  109. which contains some archived log
  110. files for this group; currently, only
  111. for the first log group this is
  112. used */
  113. /**********************************************************
  114. Completes an i/o to a log file. */
  115. void
  116. log_io_complete(
  117. /*============*/
  118. log_group_t* group); /* in: log group */
  119. /**********************************************************
  120. This function is called, e.g., when a transaction wants to commit. It checks
  121. that the log has been flushed to disk up to the last log entry written by the
  122. transaction. If there is a flush running, it waits and checks if the flush
  123. flushed enough. If not, starts a new flush. */
  124. void
  125. log_flush_up_to(
  126. /*============*/
  127. dulint lsn, /* in: log sequence number up to which the log should
  128. be flushed, ut_dulint_max if not specified */
  129. ulint wait); /* in: LOG_NO_WAIT, LOG_WAIT_ONE_GROUP,
  130. or LOG_WAIT_ALL_GROUPS */
  131. /********************************************************************
  132. Advances the smallest lsn for which there are unflushed dirty blocks in the
  133. buffer pool and also may make a new checkpoint. NOTE: this function may only
  134. be called if the calling thread owns no synchronization objects! */
  135. ibool
  136. log_preflush_pool_modified_pages(
  137. /*=============================*/
  138. /* out: FALSE if there was a flush batch of
  139. the same type running, which means that we
  140. could not start this flush batch */
  141. dulint new_oldest, /* in: try to advance oldest_modified_lsn
  142. at least to this lsn */
  143. ibool sync); /* in: TRUE if synchronous operation is
  144. desired */
  145. /**********************************************************
  146. Makes a checkpoint. Note that this function does not flush dirty
  147. blocks from the buffer pool: it only checks what is lsn of the oldest
  148. modification in the pool, and writes information about the lsn in
  149. log files. Use log_make_checkpoint_at to flush also the pool. */
  150. ibool
  151. log_checkpoint(
  152. /*===========*/
  153. /* out: TRUE if success, FALSE if a checkpoint
  154. write was already running */
  155. ibool sync, /* in: TRUE if synchronous operation is
  156. desired */
  157. ibool write_always); /* in: the function normally checks if the
  158. the new checkpoint would have a greater
  159. lsn than the previous one: if not, then no
  160. physical write is done; by setting this
  161. parameter TRUE, a physical write will always be
  162. made to log files */
  163. /********************************************************************
  164. Makes a checkpoint at a given lsn or later. */
  165. void
  166. log_make_checkpoint_at(
  167. /*===================*/
  168. dulint lsn, /* in: make a checkpoint at this or a later
  169. lsn, if ut_dulint_max, makes a checkpoint at
  170. the latest lsn */
  171. ibool write_always); /* in: the function normally checks if the
  172. the new checkpoint would have a greater
  173. lsn than the previous one: if not, then no
  174. physical write is done; by setting this
  175. parameter TRUE, a physical write will always be
  176. made to log files */
  177. /********************************************************************
  178. Makes a checkpoint at the latest lsn and writes it to first page of each
  179. data file in the database, so that we know that the file spaces contain
  180. all modifications up to that lsn. This can only be called at database
  181. shutdown. This function also writes all log in log files to the log archive. */
  182. void
  183. logs_empty_and_mark_files_at_shutdown(void);
  184. /*=======================================*/
  185. /**********************************************************
  186. Reads a checkpoint info from a log group header to log_sys->checkpoint_buf. */
  187. void
  188. log_group_read_checkpoint_info(
  189. /*===========================*/
  190. log_group_t* group, /* in: log group */
  191. ulint field); /* in: LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2 */
  192. /***********************************************************************
  193. Gets info from a checkpoint about a log group. */
  194. void
  195. log_checkpoint_get_nth_group_info(
  196. /*==============================*/
  197. byte* buf, /* in: buffer containing checkpoint info */
  198. ulint n, /* in: nth slot */
  199. ulint* file_no,/* out: archived file number */
  200. ulint* offset);/* out: archived file offset */
  201. /**********************************************************
  202. Writes checkpoint info to groups. */
  203. void
  204. log_groups_write_checkpoint_info(void);
  205. /*==================================*/
  206. /************************************************************************
  207. Starts an archiving operation. */
  208. ibool
  209. log_archive_do(
  210. /*===========*/
  211. /* out: TRUE if succeed, FALSE if an archiving
  212. operation was already running */
  213. ibool sync, /* in: TRUE if synchronous operation is desired */
  214. ulint* n_bytes);/* out: archive log buffer size, 0 if nothing to
  215. archive */
  216. /********************************************************************
  217. Writes the log contents to the archive up to the lsn when this function was
  218. called, and stops the archiving. When archiving is started again, the archived
  219. log file numbers start from a number one higher, so that the archiving will
  220. not write again to the archived log files which exist when this function
  221. returns. */
  222. ulint
  223. log_archive_stop(void);
  224. /*==================*/
  225. /* out: DB_SUCCESS or DB_ERROR */
  226. /********************************************************************
  227. Starts again archiving which has been stopped. */
  228. ulint
  229. log_archive_start(void);
  230. /*===================*/
  231. /* out: DB_SUCCESS or DB_ERROR */
  232. /********************************************************************
  233. Stop archiving the log so that a gap may occur in the archived log files. */
  234. ulint
  235. log_archive_noarchivelog(void);
  236. /*==========================*/
  237. /* out: DB_SUCCESS or DB_ERROR */
  238. /********************************************************************
  239. Start archiving the log so that a gap may occur in the archived log files. */
  240. ulint
  241. log_archive_archivelog(void);
  242. /*========================*/
  243. /* out: DB_SUCCESS or DB_ERROR */
  244. /**********************************************************
  245. Generates an archived log file name. */
  246. void
  247. log_archived_file_name_gen(
  248. /*=======================*/
  249. char* buf, /* in: buffer where to write */
  250. ulint id, /* in: group id */
  251. ulint file_no);/* in: file number */
  252. /**********************************************************
  253. Switches the database to the online backup state. */
  254. ulint
  255. log_switch_backup_state_on(void);
  256. /*============================*/
  257. /* out: DB_SUCCESS or DB_ERROR */
  258. /**********************************************************
  259. Switches the online backup state off. */
  260. ulint
  261. log_switch_backup_state_off(void);
  262. /*=============================*/
  263. /* out: DB_SUCCESS or DB_ERROR */
  264. /************************************************************************
  265. Checks that there is enough free space in the log to start a new query step.
  266. Flushes the log buffer or makes a new checkpoint if necessary. NOTE: this
  267. function may only be called if the calling thread owns no synchronization
  268. objects! */
  269. void
  270. log_check_margins(void);
  271. /*===================*/
  272. /**********************************************************
  273. Reads a specified log segment to a buffer. */
  274. void
  275. log_group_read_log_seg(
  276. /*===================*/
  277. ulint type, /* in: LOG_ARCHIVE or LOG_RECOVER */
  278. byte* buf, /* in: buffer where to read */
  279. log_group_t* group, /* in: log group */
  280. dulint start_lsn, /* in: read area start */
  281. dulint end_lsn); /* in: read area end */
  282. /**********************************************************
  283. Writes a buffer to a log file group. */
  284. void
  285. log_group_write_buf(
  286. /*================*/
  287. ulint type, /* in: LOG_FLUSH or LOG_RECOVER */
  288. log_group_t* group, /* in: log group */
  289. byte* buf, /* in: buffer */
  290. ulint len, /* in: buffer len; must be divisible
  291. by OS_FILE_LOG_BLOCK_SIZE */
  292. dulint start_lsn, /* in: start lsn of the buffer; must
  293. be divisible by
  294. OS_FILE_LOG_BLOCK_SIZE */
  295. ulint new_data_offset);/* in: start offset of new data in
  296. buf: this parameter is used to decide
  297. if we have to write a new log file
  298. header */
  299. /************************************************************
  300. Sets the field values in group to correspond to a given lsn. For this function
  301. to work, the values must already be correctly initialized to correspond to
  302. some lsn, for instance, a checkpoint lsn. */
  303. void
  304. log_group_set_fields(
  305. /*=================*/
  306. log_group_t* group, /* in: group */
  307. dulint lsn); /* in: lsn for which the values should be
  308. set */
  309. /**********************************************************
  310. Calculates the data capacity of a log group, when the log file headers are not
  311. included. */
  312. ulint
  313. log_group_get_capacity(
  314. /*===================*/
  315. /* out: capacity in bytes */
  316. log_group_t* group); /* in: log group */
  317. /****************************************************************
  318. Gets a log block flush bit. */
  319. UNIV_INLINE
  320. ibool
  321. log_block_get_flush_bit(
  322. /*====================*/
  323. /* out: TRUE if this block was the first
  324. to be written in a log flush */
  325. byte* log_block); /* in: log block */
  326. /****************************************************************
  327. Gets a log block number stored in the header. */
  328. UNIV_INLINE
  329. ulint
  330. log_block_get_hdr_no(
  331. /*=================*/
  332. /* out: log block number stored in the block
  333. header */
  334. byte* log_block); /* in: log block */
  335. /****************************************************************
  336. Gets a log block data length. */
  337. UNIV_INLINE
  338. ulint
  339. log_block_get_data_len(
  340. /*===================*/
  341. /* out: log block data length measured as a
  342. byte offset from the block start */
  343. byte* log_block); /* in: log block */
  344. /****************************************************************
  345. Sets the log block data length. */
  346. UNIV_INLINE
  347. void
  348. log_block_set_data_len(
  349. /*===================*/
  350. byte* log_block, /* in: log block */
  351. ulint len); /* in: data length */
  352. /****************************************************************
  353. Gets a log block number stored in the trailer. */
  354. UNIV_INLINE
  355. ulint
  356. log_block_get_trl_no(
  357. /*=================*/
  358. /* out: log block number stored in the block
  359. trailer */
  360. byte* log_block); /* in: log block */
  361. /****************************************************************
  362. Gets a log block first mtr log record group offset. */
  363. UNIV_INLINE
  364. ulint
  365. log_block_get_first_rec_group(
  366. /*==========================*/
  367. /* out: first mtr log record group byte offset
  368. from the block start, 0 if none */
  369. byte* log_block); /* in: log block */
  370. /****************************************************************
  371. Sets the log block first mtr log record group offset. */
  372. UNIV_INLINE
  373. void
  374. log_block_set_first_rec_group(
  375. /*==========================*/
  376. byte* log_block, /* in: log block */
  377. ulint offset); /* in: offset, 0 if none */
  378. /****************************************************************
  379. Gets a log block checkpoint number field (4 lowest bytes). */
  380. UNIV_INLINE
  381. ulint
  382. log_block_get_checkpoint_no(
  383. /*========================*/
  384. /* out: checkpoint no (4 lowest bytes) */
  385. byte* log_block); /* in: log block */
  386. /****************************************************************
  387. Initializes a log block in the log buffer. */
  388. UNIV_INLINE
  389. void
  390. log_block_init(
  391. /*===========*/
  392. byte* log_block, /* in: pointer to the log buffer */
  393. dulint lsn); /* in: lsn within the log block */
  394. /****************************************************************
  395. Converts a lsn to a log block number. */
  396. UNIV_INLINE
  397. ulint
  398. log_block_convert_lsn_to_no(
  399. /*========================*/
  400. /* out: log block number, it is > 0 and <= 1G */
  401. dulint lsn); /* in: lsn of a byte within the block */
  402. /**********************************************************
  403. Prints info of the log. */
  404. void
  405. log_print(void);
  406. /*===========*/
  407. extern log_t* log_sys;
  408. /* Values used as flags */
  409. #define LOG_FLUSH 7652559
  410. #define LOG_CHECKPOINT 78656949
  411. #define LOG_ARCHIVE 11122331
  412. #define LOG_RECOVER 98887331
  413. /* The counting of lsn's starts from this value: this must be non-zero */
  414. #define LOG_START_LSN ut_dulint_create(0, 16 * OS_FILE_LOG_BLOCK_SIZE)
  415. #define LOG_BUFFER_SIZE  (srv_log_buffer_size * UNIV_PAGE_SIZE)
  416. #define LOG_ARCHIVE_BUF_SIZE (srv_log_buffer_size * UNIV_PAGE_SIZE / 4)
  417. /* Offsets of a log block header */
  418. #define LOG_BLOCK_HDR_NO 0 /* block number which must be > 0 and
  419. is allowed to wrap around at 2G; the
  420. highest bit is set to 1 if this is the
  421. first log block in a log flush write
  422. segment */
  423. #define LOG_BLOCK_FLUSH_BIT_MASK 0x80000000
  424. /* mask used to get the highest bit in
  425. the preceding field */
  426. #define LOG_BLOCK_HDR_DATA_LEN 4 /* number of bytes of log written to
  427. this block */
  428. #define LOG_BLOCK_FIRST_REC_GROUP 6 /* offset of the first start of an
  429. mtr log record group in this log block,
  430. 0 if none; if the value is the same
  431. as LOG_BLOCK_HDR_DATA_LEN, it means
  432. that the first rec group has not yet
  433. been catenated to this log block, but
  434. if it will, it will start at this
  435. offset; an archive recovery can
  436. start parsing the log records starting
  437. from this offset in this log block,
  438. if value not 0 */
  439. #define LOG_BLOCK_CHECKPOINT_NO 8 /* 4 lower bytes of the value of
  440. log_sys->next_checkpoint_no when the
  441. log block was last written to: if the
  442. block has not yet been written full,
  443. this value is only updated before a
  444. log buffer flush */
  445. #define LOG_BLOCK_HDR_SIZE 12 /* size of the log block header in
  446. bytes */
  447. /* Offsets of a log block trailer from the end of the block */
  448. #define LOG_BLOCK_TRL_NO 4 /* log block number */
  449. #define LOG_BLOCK_TRL_SIZE 4 /* trailer size in bytes */
  450. /* Offsets for a checkpoint field */
  451. #define LOG_CHECKPOINT_NO 0
  452. #define LOG_CHECKPOINT_LSN 8
  453. #define LOG_CHECKPOINT_OFFSET 16
  454. #define LOG_CHECKPOINT_LOG_BUF_SIZE 20
  455. #define LOG_CHECKPOINT_ARCHIVED_LSN 24
  456. #define LOG_CHECKPOINT_GROUP_ARRAY 32
  457. /* For each value < LOG_MAX_N_GROUPS the following 8 bytes: */
  458. #define LOG_CHECKPOINT_ARCHIVED_FILE_NO 0
  459. #define LOG_CHECKPOINT_ARCHIVED_OFFSET 4
  460. #define LOG_CHECKPOINT_ARRAY_END (LOG_CHECKPOINT_GROUP_ARRAY
  461. + LOG_MAX_N_GROUPS * 8)
  462. #define LOG_CHECKPOINT_CHECKSUM_1  LOG_CHECKPOINT_ARRAY_END
  463. #define LOG_CHECKPOINT_CHECKSUM_2  (4 + LOG_CHECKPOINT_ARRAY_END)
  464. #define LOG_CHECKPOINT_SIZE (8 + LOG_CHECKPOINT_ARRAY_END)
  465. /* Offsets of a log file header */
  466. #define LOG_GROUP_ID 0 /* log group number */
  467. #define LOG_FILE_START_LSN 4 /* lsn of the start of data in this
  468. log file */
  469. #define LOG_FILE_NO 12 /* 4-byte archived log file number */
  470. #define LOG_FILE_ARCH_COMPLETED OS_FILE_LOG_BLOCK_SIZE
  471. /* this 4-byte field is TRUE when
  472. the writing of an archived log file
  473. has been completed */
  474. #define LOG_FILE_END_LSN (OS_FILE_LOG_BLOCK_SIZE + 4)
  475. /* lsn where the archived log file
  476. at least extends: actually the
  477. archived log file may extend to a
  478. later lsn, as long as it is within the
  479. same log block as this lsn; this field
  480. is defined only when an archived log
  481. file has been completely written */
  482. #define LOG_CHECKPOINT_1 OS_FILE_LOG_BLOCK_SIZE
  483. #define LOG_CHECKPOINT_2 (3 * OS_FILE_LOG_BLOCK_SIZE)
  484. #define LOG_FILE_HDR_SIZE (4 * OS_FILE_LOG_BLOCK_SIZE)
  485. #define LOG_GROUP_OK 301
  486. #define LOG_GROUP_CORRUPTED 302
  487. /* Log group consists of a number of log files, each of the same size; a log
  488. group is implemented as a space in the sense of the module fil0fil. */
  489. struct log_group_struct{
  490. /* The following fields are protected by log_sys->mutex */
  491. ulint id; /* log group id */
  492. ulint n_files; /* number of files in the group */
  493. ulint file_size; /* individual log file size in bytes,
  494. including the log file header */
  495. ulint space_id; /* file space which implements the log
  496. group */
  497. ulint state; /* LOG_GROUP_OK or
  498. LOG_GROUP_CORRUPTED */
  499. dulint lsn; /* lsn used to fix coordinates within
  500. the log group */
  501. ulint lsn_offset; /* the offset of the above lsn */
  502. ulint n_pending_writes;/* number of currently pending flush
  503. writes for this log group */
  504. byte** file_header_bufs;/* buffers for each file header in the
  505. group */
  506. /*-----------------------------*/
  507. byte** archive_file_header_bufs;/* buffers for each file
  508. header in the group */
  509. ulint archive_space_id;/* file space which implements the log
  510. group archive */
  511. ulint archived_file_no;/* file number corresponding to
  512. log_sys->archived_lsn */
  513. ulint archived_offset;/* file offset corresponding to
  514. log_sys->archived_lsn, 0 if we have
  515. not yet written to the archive file
  516. number archived_file_no */
  517. ulint next_archived_file_no;/* during an archive write,
  518. until the write is completed, we
  519. store the next value for
  520. archived_file_no here: the write
  521. completion function then sets the new
  522. value to ..._file_no */
  523. ulint next_archived_offset; /* like the preceding field */
  524. /*-----------------------------*/
  525. dulint scanned_lsn; /* used only in recovery: recovery scan
  526. succeeded up to this lsn in this log
  527. group */
  528. byte* checkpoint_buf; /* checkpoint header is written from
  529. this buffer to the group */
  530. UT_LIST_NODE_T(log_group_t)
  531. log_groups; /* list of log groups */
  532. };
  533. struct log_struct{
  534. byte pad[64]; /* padding to prevent other memory
  535. update hotspots from residing on the
  536. same memory cache line */
  537. dulint lsn; /* log sequence number */
  538. ulint buf_free; /* first free offset within the log
  539. buffer */
  540. mutex_t mutex; /* mutex protecting the log */
  541. byte* buf; /* log buffer */
  542. ulint buf_size; /* log buffer size in bytes */
  543. ulint max_buf_free; /* recommended maximum value of
  544. buf_free, after which the buffer is
  545. flushed */
  546. ulint old_buf_free; /* value of buf free when log was
  547. last time opened; only in the debug
  548. version */
  549. dulint old_lsn; /* value of lsn when log was last time
  550. opened; only in the debug version */
  551. ibool check_flush_or_checkpoint;
  552. /* this is set to TRUE when there may
  553. be need to flush the log buffer, or
  554. preflush buffer pool pages, or make
  555. a checkpoint; this MUST be TRUE when
  556. lsn - last_checkpoint_lsn >
  557. max_checkpoint_age; this flag is
  558. peeked at by log_free_check(), which
  559. does not reserve the log mutex */
  560. UT_LIST_BASE_NODE_T(log_group_t)
  561. log_groups; /* log groups */
  562. /* The fields involved in the log buffer flush */
  563. ulint buf_next_to_write;/* first offset in the log buffer
  564. where the byte content may not exist
  565. written to file, e.g., the start
  566. offset of a log record catenated
  567. later; this is advanced when a flush
  568. operation is completed to all the log
  569. groups */
  570. dulint written_to_some_lsn;
  571. /* first log sequence number not yet
  572. written to any log group; for this to
  573. be advanced, it is enough that the
  574. write i/o has been completed for any
  575. one log group */
  576. dulint written_to_all_lsn;
  577. /* first log sequence number not yet
  578. written to some log group; for this to
  579. be advanced, it is enough that the
  580. write i/o has been completed for all
  581. log groups */
  582. dulint flush_lsn; /* end lsn for the current flush */
  583. ulint flush_end_offset;/* the data in buffer ha been flushed
  584. up to this offset when the current
  585. flush ends: this field will then
  586. be copied to buf_next_to_write */
  587. ulint n_pending_writes;/* number of currently pending flush
  588. writes */
  589. os_event_t no_flush_event; /* this event is in the reset state
  590. when a flush is running; a thread
  591. should wait for this without owning
  592. the log mutex, but NOTE that to set or
  593. reset this event, the thread MUST own
  594. the log mutex! */
  595. ibool one_flushed; /* during a flush, this is first FALSE
  596. and becomes TRUE when one log group
  597. has been flushed */
  598. os_event_t one_flushed_event;/* this event is reset when the
  599. flush has not yet completed for any
  600. log group; e.g., this means that a
  601. transaction has been committed when
  602. this is set; a thread should wait
  603. for this without owning the log mutex,
  604. but NOTE that to set or reset this
  605. event, the thread MUST own the log
  606. mutex! */
  607. ulint n_log_ios; /* number of log i/os initiated thus
  608. far */
  609. /* Fields involved in checkpoints */
  610. ulint max_modified_age_async;
  611. /* when this recommended value for lsn
  612. - buf_pool_get_oldest_modification()
  613. is exceeded, we start an asynchronous
  614. preflush of pool pages */
  615. ulint max_modified_age_sync;
  616. /* when this recommended value for lsn
  617. - buf_pool_get_oldest_modification()
  618. is exceeded, we start a synchronous
  619. preflush of pool pages */
  620. ulint adm_checkpoint_interval;
  621. /* administrator-specified checkpoint
  622. interval in terms of log growth in
  623. bytes; the interval actually used by
  624. the database can be smaller */
  625. ulint max_checkpoint_age_async;
  626. /* when this checkpoint age is exceeded
  627. we start an asynchronous writing of a
  628. new checkpoint */
  629. ulint max_checkpoint_age;
  630. /* this is the maximum allowed value
  631. for lsn - last_checkpoint_lsn when a
  632. new query step is started */
  633. dulint next_checkpoint_no;
  634. /* next checkpoint number */
  635. dulint last_checkpoint_lsn;
  636. /* latest checkpoint lsn */
  637. dulint next_checkpoint_lsn;
  638. /* next checkpoint lsn */
  639. ulint n_pending_checkpoint_writes;
  640. /* number of currently pending
  641. checkpoint writes */
  642. rw_lock_t checkpoint_lock;/* this latch is x-locked when a
  643. checkpoint write is running; a thread
  644. should wait for this without owning
  645. the log mutex */
  646. byte* checkpoint_buf; /* checkpoint header is read to this
  647. buffer */
  648. /* Fields involved in archiving */
  649. ulint archiving_state;/* LOG_ARCH_ON, LOG_ARCH_STOPPING
  650. LOG_ARCH_STOPPED, LOG_ARCH_OFF */
  651. dulint archived_lsn; /* archiving has advanced to this lsn */
  652. ulint max_archived_lsn_age_async;
  653. /* recommended maximum age of
  654. archived_lsn, before we start
  655. asynchronous copying to the archive */
  656. ulint max_archived_lsn_age;
  657. /* maximum allowed age for
  658. archived_lsn */
  659. dulint next_archived_lsn;/* during an archive write,
  660. until the write is completed, we
  661. store the next value for
  662. archived_lsn here: the write
  663. completion function then sets the new
  664. value to archived_lsn */
  665. ulint archiving_phase;/* LOG_ARCHIVE_READ or
  666. LOG_ARCHIVE_WRITE */
  667. ulint n_pending_archive_ios;
  668. /* number of currently pending reads
  669. or writes in archiving */
  670. rw_lock_t archive_lock; /* this latch is x-locked when an
  671. archive write is running; a thread
  672. should wait for this without owning
  673. the log mutex */
  674. ulint archive_buf_size;/* size of archive_buf */
  675. byte* archive_buf; /* log segment is written to the
  676. archive from this buffer */
  677. os_event_t archiving_on; /* if archiving has been stopped,
  678. a thread can wait for this event to
  679. become signaled */
  680. /* Fields involved in online backups */
  681. ibool online_backup_state;
  682. /* TRUE if the database is in the
  683. online backup state */
  684. dulint online_backup_lsn;
  685. /* lsn when the state was changed to
  686. the online backup state */
  687. };
  688. #define LOG_ARCH_ON 71
  689. #define LOG_ARCH_STOPPING 72
  690. #define LOG_ARCH_STOPPING2 73
  691. #define LOG_ARCH_STOPPED 74
  692. #define LOG_ARCH_OFF 75
  693. #ifndef UNIV_NONINL
  694. #include "log0log.ic"
  695. #endif
  696. #endif