aboutsummaryrefslogtreecommitdiff
path: root/src/include/access/xlog.h
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-02-11 22:55:26 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-02-11 22:55:26 +0000
commitc3c09be34b6b0d7892f1087a23fc6eb93f3c4f04 (patch)
tree53331a1f14775c903a6b520f3344b533f9f275ab /src/include/access/xlog.h
parent0cb117eb33558bc779df833480958a97227dcbc2 (diff)
downloadpostgresql-c3c09be34b6b0d7892f1087a23fc6eb93f3c4f04.tar.gz
postgresql-c3c09be34b6b0d7892f1087a23fc6eb93f3c4f04.zip
Commit the reasonably uncontroversial parts of J.R. Nield's PITR patch, to
wit: Add a header record to each WAL segment file so that it can be reliably identified. Avoid splitting WAL records across segment files (this is not strictly necessary, but makes it simpler to incorporate the header records). Make WAL entries for file creation, deletion, and truncation (as foreseen but never implemented by Vadim). Also, add support for making XLOG_SEG_SIZE configurable at compile time, similarly to BLCKSZ. Fix a couple bugs I introduced in WAL replay during recent smgr API changes. initdb is forced due to changes in pg_control contents.
Diffstat (limited to 'src/include/access/xlog.h')
-rw-r--r--src/include/access/xlog.h30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index d0ff1d99f50..8f9d97adad3 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.48 2004/01/19 19:04:40 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.49 2004/02/11 22:55:25 tgl Exp $
*/
#ifndef XLOG_H
#define XLOG_H
@@ -131,15 +131,35 @@ typedef XLogPageHeaderData *XLogPageHeader;
#define XLP_ALL_FLAGS 0x0001
/*
- * We break each logical log file (xlogid value) into 16Mb segments.
- * One possible segment at the end of each log file is wasted, to ensure
- * that we don't have problems representing last-byte-position-plus-1.
+ * We break each logical log file (xlogid value) into segment files of the
+ * size indicated by XLOG_SEG_SIZE. One possible segment at the end of each
+ * log file is wasted, to ensure that we don't have problems representing
+ * last-byte-position-plus-1.
*/
-#define XLogSegSize ((uint32) (16*1024*1024))
+#define XLogSegSize ((uint32) XLOG_SEG_SIZE)
#define XLogSegsPerFile (((uint32) 0xffffffff) / XLogSegSize)
#define XLogFileSize (XLogSegsPerFile * XLogSegSize)
/*
+ * The first XLOG record in each segment file is always an XLOG_FILE_HEADER
+ * record. This record does nothing as far as XLOG replay is concerned,
+ * but it is useful for verifying that we haven't mixed up XLOG segment files.
+ * The body of an XLOG_FILE_HEADER record is a struct XLogFileHeaderData.
+ * Note: the xlogid/segno fields are really redundant with xlp_pageaddr in
+ * the page header, but we store them anyway as an extra check.
+ */
+typedef struct XLogFileHeaderData
+{
+ uint64 xlfhd_sysid; /* system identifier from pg_control */
+ uint32 xlfhd_xlogid; /* logical log file # */
+ uint32 xlfhd_segno; /* segment number within logical log file */
+ uint32 xlfhd_seg_size; /* just as a cross-check */
+} XLogFileHeaderData;
+
+#define SizeOfXLogFHD MAXALIGN(sizeof(XLogFileHeaderData))
+
+
+/*
* Method table for resource managers.
*
* RmgrTable[] is indexed by RmgrId values (see rmgr.h).