1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1996, 1997, 1998
5 *	Sleepycat Software.  All rights reserved.
6 *
7 *	@(#)log.h	10.30 (Sleepycat) 10/11/98
8 */
9
10#ifndef _LOG_H_
11#define	_LOG_H_
12
13struct __fname;		typedef struct __fname FNAME;
14struct __hdr;		typedef struct __hdr HDR;
15struct __log;		typedef struct __log LOG;
16struct __log_persist;	typedef struct __log_persist LOGP;
17
18#ifndef MAXLFNAME
19#define	LFPREFIX	"log."		/* Log file name prefix. */
20#define	LFNAME		"log.%010d"	/* Log file name template. */
21#define	LFNAME_V1	"log.%05d"	/* Log file name template, rev 1. */
22#define	MAXLFNAME	2000000000	/* Maximum log file name. */
23#endif
24					/* Default log name. */
25#define DB_DEFAULT_LOG_FILE	"__db_log.share"
26
27#define	DEFAULT_MAX	(10 * MEGABYTE)	/* 10 Mb. */
28
29/* Macros to lock/unlock the region and threads. */
30#define	LOCK_LOGTHREAD(dblp)						\
31	if (F_ISSET(dblp, DB_AM_THREAD))				\
32		(void)__db_mutex_lock((dblp)->mutexp, -1)
33#define	UNLOCK_LOGTHREAD(dblp)						\
34	if (F_ISSET(dblp, DB_AM_THREAD))				\
35		(void)__db_mutex_unlock((dblp)->mutexp, -1);
36#define	LOCK_LOGREGION(dblp)						\
37	(void)__db_mutex_lock(&((RLAYOUT *)(dblp)->lp)->lock,		\
38	    (dblp)->reginfo.fd)
39#define	UNLOCK_LOGREGION(dblp)						\
40	(void)__db_mutex_unlock(&((RLAYOUT *)(dblp)->lp)->lock,		\
41	    (dblp)->reginfo.fd)
42
43/* Check for region catastrophic shutdown. */
44#define	LOG_PANIC_CHECK(dblp) {						\
45	if ((dblp)->lp->rlayout.panic)					\
46		return (DB_RUNRECOVERY);				\
47}
48
49/*
50 * The per-process table that maps log file-id's to DB structures.
51 */
52typedef	struct __db_entry {
53	DB	 *dbp;			/* Associated DB structure. */
54	char 	 *name;			/* File name. */
55	u_int32_t refcount;		/* Reference counted. */
56	int	  deleted;		/* File was not found during open. */
57} DB_ENTRY;
58
59/*
60 * DB_LOG
61 *	Per-process log structure.
62 */
63struct __db_log {
64/* These fields need to be protected for multi-threaded support. */
65	db_mutex_t	*mutexp;	/* Mutex for thread protection. */
66
67	DB_ENTRY *dbentry;		/* Recovery file-id mapping. */
68#define	DB_GROW_SIZE	64
69	u_int32_t dbentry_cnt;		/* Entries.  Grows by DB_GROW_SIZE. */
70
71/*
72 * These fields are always accessed while the region lock is held, so they do
73 * not have to be protected by the thread lock as well OR, they are only used
74 * when threads are not being used, i.e. most cursor operations are disallowed
75 * on threaded logs.
76 */
77	u_int32_t lfname;		/* Log file "name". */
78	int	  lfd;			/* Log file descriptor. */
79
80	DB_LSN	  c_lsn;		/* Cursor: current LSN. */
81	DBT	  c_dbt;		/* Cursor: return DBT structure. */
82	int	  c_fd;			/* Cursor: file descriptor. */
83	u_int32_t c_off;		/* Cursor: previous record offset. */
84	u_int32_t c_len;		/* Cursor: current record length. */
85
86/* These fields are not protected. */
87	LOG	 *lp;			/* Address of the shared LOG. */
88
89	DB_ENV	 *dbenv;		/* Reference to error information. */
90	REGINFO	  reginfo;		/* Region information. */
91
92	void     *addr;			/* Address of shalloc() region. */
93
94	char	 *dir;			/* Directory argument. */
95
96/*
97 * These fields are used by XA; since XA forbids threaded execution, these
98 * do not have to be protected.
99 */
100	void 	*xa_info;		/* Committed transaction list that
101					 * has to be carried between calls
102					 * to xa_recover. */
103	DB_LSN	xa_lsn;			/* Position of an XA recovery scan. */
104	DB_LSN	xa_first;		/* LSN to which we need to roll back
105					   for this XA recovery scan. */
106
107	/*
108	 * !!!
109	 * Currently used to hold:
110	 *	DB_AM_THREAD	(a DB flag)
111	 *	DBC_RECOVER	(a DBC flag)
112	 * If they are ever the same bits, we're in serious trouble.
113	 */
114#if DB_AM_THREAD == DBC_RECOVER
115	DB_AM_THREAD, DBC_RECOVER, FLAG MISMATCH
116#endif
117	u_int32_t flags;
118};
119
120/*
121 * HDR --
122 *	Log record header.
123 */
124struct __hdr {
125	u_int32_t prev;			/* Previous offset. */
126	u_int32_t cksum;		/* Current checksum. */
127	u_int32_t len;			/* Current length. */
128};
129
130struct __log_persist {
131	u_int32_t magic;		/* DB_LOGMAGIC */
132	u_int32_t version;		/* DB_LOGVERSION */
133
134	u_int32_t lg_max;		/* Maximum file size. */
135	int	  mode;			/* Log file mode. */
136};
137
138/*
139 * LOG --
140 *	Shared log region.  One of these is allocated in shared memory,
141 *	and describes the log.
142 */
143struct __log {
144	RLAYOUT	  rlayout;		/* General region information. */
145
146	LOGP	  persist;		/* Persistent information. */
147
148	SH_TAILQ_HEAD(__fq) fq;		/* List of file names. */
149
150	/*
151	 * The lsn LSN is the file offset that we're about to write and which
152	 * we will return to the user.
153	 */
154	DB_LSN	  lsn;			/* LSN at current file offset. */
155
156	/*
157	 * The s_lsn LSN is the last LSN that we know is on disk, not just
158	 * written, but synced.
159	 */
160	DB_LSN	  s_lsn;		/* LSN of the last sync. */
161
162	u_int32_t len;			/* Length of the last record. */
163
164	u_int32_t w_off;		/* Current write offset in the file. */
165
166	DB_LSN	  chkpt_lsn;		/* LSN of the last checkpoint. */
167	time_t	  chkpt;		/* Time of the last checkpoint. */
168
169	DB_LOG_STAT stat;		/* Log statistics. */
170
171	/*
172	 * The f_lsn LSN is the LSN (returned to the user) that "owns" the
173	 * first byte of the buffer.  If the record associated with the LSN
174	 * spans buffers, it may not reflect the physical file location of
175	 * the first byte of the buffer.
176	 */
177	DB_LSN	  f_lsn;		/* LSN of first byte in the buffer. */
178	size_t	  b_off;		/* Current offset in the buffer. */
179	u_int8_t buf[4 * 1024];		/* Log buffer. */
180};
181
182/*
183 * FNAME --
184 *	File name and id.
185 */
186struct __fname {
187	SH_TAILQ_ENTRY q;		/* File name queue. */
188
189	u_int16_t ref;			/* Reference count. */
190
191	u_int32_t id;			/* Logging file id. */
192	DBTYPE	  s_type;		/* Saved DB type. */
193
194	size_t	  name_off;		/* Name offset. */
195	u_int8_t  ufid[DB_FILE_ID_LEN];	/* Unique file id. */
196};
197
198/* File open/close register log record opcodes. */
199#define	LOG_CHECKPOINT	1		/* Checkpoint: file name/id dump. */
200#define	LOG_CLOSE	2		/* File close. */
201#define	LOG_OPEN	3		/* File open. */
202
203#include "log_auto.h"
204#include "log_ext.h"
205#endif /* _LOG_H_ */
206