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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: log.h,v 11.60 2002/08/06 06:37:08 bostic Exp $
  8.  */
  9. #ifndef _LOG_H_
  10. #define _LOG_H_
  11. struct __db_log; typedef struct __db_log DB_LOG;
  12. struct __hdr; typedef struct __hdr HDR;
  13. struct __log; typedef struct __log LOG;
  14. struct __log_persist; typedef struct __log_persist LOGP;
  15. #define LFPREFIX "log." /* Log file name prefix. */
  16. #define LFNAME "log.%010d" /* Log file name template. */
  17. #define LFNAME_V1 "log.%05d" /* Log file name template, rev 1. */
  18. #define LG_MAX_DEFAULT (10 * MEGABYTE) /* 10 MB. */
  19. #define LG_BSIZE_DEFAULT (32 * 1024) /* 32 KB. */
  20. #define LG_BASE_REGION_SIZE (60 * 1024) /* 60 KB. */
  21. /*
  22.  * The per-process table that maps log file-id's to DB structures.
  23.  */
  24. typedef struct __db_entry {
  25. DB *dbp; /* Open dbp for this file id. */
  26. int deleted; /* File was not found during open. */
  27. } DB_ENTRY;
  28. /*
  29.  * DB_LOG
  30.  * Per-process log structure.
  31.  */
  32. struct __db_log {
  33. /*
  34.  * These fields need to be protected for multi-threaded support.
  35.  *
  36.  * !!!
  37.  * As this structure is allocated in per-process memory, the mutex may need
  38.  * to be stored elsewhere on architectures unable to support mutexes in heap
  39.  * memory, e.g., HP/UX 9.
  40.  */
  41. DB_MUTEX  *mutexp; /* Mutex for thread protection. */
  42. DB_ENTRY *dbentry; /* Recovery file-id mapping. */
  43. #define DB_GROW_SIZE 64
  44. int32_t dbentry_cnt; /* Entries.  Grows by DB_GROW_SIZE. */
  45. /*
  46.  * These fields are always accessed while the region lock is held, so they do
  47.  * not have to be protected by the thread lock as well, OR, they are only used
  48.  * when threads are not being used, i.e. most cursor operations are disallowed
  49.  * on threaded logs.
  50.  */
  51. u_int32_t lfname; /* Log file "name". */
  52. DB_FH   lfh; /* Log file handle. */
  53. u_int8_t *bufp; /* Region buffer. */
  54. /* These fields are not protected. */
  55. DB_ENV  *dbenv; /* Reference to error information. */
  56. REGINFO   reginfo; /* Region information. */
  57. #define DBLOG_RECOVER 0x01 /* We are in recovery. */
  58. #define DBLOG_FORCE_OPEN 0x02 /* Force the DB open even if it appears
  59.  * to be deleted.
  60.  */
  61. u_int32_t flags;
  62. };
  63. /*
  64.  * HDR --
  65.  * Log record header.
  66.  */
  67. struct __hdr {
  68. u_int32_t prev; /* Previous offset. */
  69. u_int32_t len; /* Current length. */
  70. u_int8_t  chksum[DB_MAC_KEY]; /* Current checksum. */
  71. u_int8_t  iv[DB_IV_BYTES]; /* IV */
  72. u_int32_t orig_size; /* Original size of log record */
  73. /* !!! - 'size' is not written to log, must be last in hdr */
  74. size_t   size; /* Size of header to use */
  75. };
  76. /*
  77.  * We use HDR internally, and then when we write out, we write out
  78.  * prev, len, and then a 4-byte checksum if normal operation or
  79.  * a crypto-checksum and IV and original size if running in crypto
  80.  * mode.  We must store the original size in case we pad.  Set the
  81.  * size when we set up the header.  We compute a DB_MAC_KEY size
  82.  * checksum regardless, but we can safely just use the first 4 bytes.
  83.  */
  84. #define HDR_NORMAL_SZ 12
  85. #define HDR_CRYPTO_SZ 12 + DB_MAC_KEY + DB_IV_BYTES
  86. struct __log_persist {
  87. u_int32_t magic; /* DB_LOGMAGIC */
  88. u_int32_t version; /* DB_LOGVERSION */
  89. u_int32_t log_size; /* Log file size. */
  90. u_int32_t mode; /* Log file mode. */
  91. };
  92. /*
  93.  * LOG --
  94.  * Shared log region.  One of these is allocated in shared memory,
  95.  * and describes the log.
  96.  */
  97. struct __log {
  98. /*
  99.  * Due to alignment constraints on some architectures (e.g. HP-UX),
  100.  * DB_MUTEXes must be the first element of shalloced structures,
  101.  * and as a corollary there can be only one per structure.  Thus,
  102.  * flush_mutex_off points to a mutex in a separately-allocated chunk.
  103.  */
  104. DB_MUTEX fq_mutex; /* Mutex guarding file name list. */
  105. LOGP  persist; /* Persistent information. */
  106. SH_TAILQ_HEAD(__fq1) fq; /* List of file names. */
  107. int32_t fid_max; /* Max fid allocated. */
  108. roff_t free_fid_stack; /* Stack of free file ids. */
  109. int free_fids; /* Height of free fid stack. */
  110. int free_fids_alloced; /* Number of free fid slots alloc'ed. */
  111. /*
  112.  * The lsn LSN is the file offset that we're about to write and which
  113.  * we will return to the user.
  114.  */
  115. DB_LSN   lsn; /* LSN at current file offset. */
  116. /*
  117.  * The f_lsn LSN is the LSN (returned to the user) that "owns" the
  118.  * first byte of the buffer.  If the record associated with the LSN
  119.  * spans buffers, it may not reflect the physical file location of
  120.  * the first byte of the buffer.
  121.  */
  122. DB_LSN   f_lsn; /* LSN of first byte in the buffer. */
  123. size_t   b_off; /* Current offset in the buffer. */
  124. u_int32_t w_off; /* Current write offset in the file. */
  125. u_int32_t len; /* Length of the last record. */
  126. /*
  127.  * The s_lsn LSN is the last LSN that we know is on disk, not just
  128.  * written, but synced.  This field is protected by the flush mutex
  129.  * rather than by the region mutex.
  130.  */
  131. int   in_flush; /* Log flush in progress. */
  132. roff_t   flush_mutex_off; /* Mutex guarding flushing. */
  133. DB_LSN   s_lsn; /* LSN of the last sync. */
  134. DB_LOG_STAT stat; /* Log statistics. */
  135. /*
  136.  * The waiting_lsn is used by the replication system.  It is the
  137.  * first LSN that we are holding without putting in the log, because
  138.  * we received one or more log records out of order.  Associated with
  139.  * the waiting_lsn is the number of log records that we still have to
  140.  * receive before we decide that we should request it again.
  141.  */
  142. DB_LSN   waiting_lsn; /* First log record after a gap. */
  143. DB_LSN   verify_lsn; /* LSN we are waiting to verify. */
  144. u_int32_t wait_recs; /* Records to wait before requesting. */
  145. u_int32_t rcvd_recs; /* Records received while waiting. */
  146. /*
  147.  * The ready_lsn is also used by the replication system.  It is the
  148.  * next LSN we expect to receive.  It's normally equal to "lsn",
  149.  * except at the beginning of a log file, at which point it's set
  150.  * to the LSN of the first record of the new file (after the
  151.  * header), rather than to 0.
  152.  */
  153. DB_LSN   ready_lsn;
  154. /*
  155.  * During initialization, the log system walks forward through the
  156.  * last log file to find its end.  If it runs into a checkpoint
  157.  * while it's doing so, it caches it here so that the transaction
  158.  * system doesn't need to walk through the file again on its
  159.  * initialization.
  160.  */
  161. DB_LSN cached_ckp_lsn;
  162. roff_t   buffer_off; /* Log buffer offset in the region. */
  163. u_int32_t buffer_size; /* Log buffer size. */
  164. u_int32_t log_size; /* Log file's size. */
  165. u_int32_t log_nsize; /* Next log file's size. */
  166. u_int32_t ncommit; /* Number of txns waiting to commit. */
  167. DB_LSN   t_lsn; /* LSN of first commit */
  168. SH_TAILQ_HEAD(__commit) commits;/* list of txns waiting to commit. */
  169. SH_TAILQ_HEAD(__free) free_commits;/* free list of commit structs. */
  170. #ifdef HAVE_MUTEX_SYSTEM_RESOURCES
  171. #define LG_MAINT_SIZE (sizeof(roff_t) * DB_MAX_HANDLES)
  172. roff_t   maint_off; /* offset of region maintenance info */
  173. #endif
  174. };
  175. /*
  176.  * __db_commit structure --
  177.  * One of these is allocated for each transaction waiting
  178.  * to commit.
  179.  */
  180. struct __db_commit {
  181. DB_MUTEX mutex; /* Mutex for txn to wait on. */
  182. DB_LSN lsn; /* LSN of commit record. */
  183. SH_TAILQ_ENTRY links; /* Either on free or waiting list. */
  184. #define DB_COMMIT_FLUSH 0x0001 /* Flush the log when you wake up. */
  185. u_int32_t flags;
  186. };
  187. /*
  188.  * FNAME --
  189.  * File name and id.
  190.  */
  191. struct __fname {
  192. SH_TAILQ_ENTRY q; /* File name queue. */
  193. int32_t id; /* Logging file id. */
  194. DBTYPE   s_type; /* Saved DB type. */
  195. roff_t   name_off; /* Name offset. */
  196. db_pgno_t meta_pgno; /* Page number of the meta page. */
  197. u_int8_t  ufid[DB_FILE_ID_LEN]; /* Unique file id. */
  198. u_int32_t create_txnid; /*
  199.  * Txn ID of the DB create, stored so
  200.  * we can log it at register time.
  201.  */
  202. };
  203. /* File open/close register log record opcodes. */
  204. #define LOG_CHECKPOINT 1 /* Checkpoint: file name/id dump. */
  205. #define LOG_CLOSE 2 /* File close. */
  206. #define LOG_OPEN 3 /* File open. */
  207. #define LOG_RCLOSE 4 /* File close after recovery. */
  208. #define CHECK_LSN(redo, cmp, lsn, prev)
  209. DB_ASSERT(!DB_REDO(redo) ||
  210.     (cmp) >= 0 || IS_NOT_LOGGED_LSN(*lsn));
  211. if (DB_REDO(redo) && (cmp) < 0 && !IS_NOT_LOGGED_LSN(*(lsn))) {
  212. __db_err(dbenv,
  213. "Log sequence error: page LSN %lu %lu; previous LSN %lu %lu",
  214.     (u_long)(lsn)->file, (u_long)(lsn)->offset,
  215.     (u_long)(prev)->file, (u_long)(prev)->offset);
  216. goto out;
  217. }
  218. /*
  219.  * Status codes indicating the validity of a log file examined by
  220.  * __log_valid().
  221.  */
  222. typedef enum {
  223. DB_LV_INCOMPLETE,
  224. DB_LV_NONEXISTENT,
  225. DB_LV_NORMAL,
  226. DB_LV_OLD_READABLE,
  227. DB_LV_OLD_UNREADABLE
  228. } logfile_validity;
  229. #include "dbinc_auto/dbreg_auto.h"
  230. #include "dbinc_auto/dbreg_ext.h"
  231. #include "dbinc_auto/log_ext.h"
  232. #endif /* !_LOG_H_ */