diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-02-11 22:55:26 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-02-11 22:55:26 +0000 |
commit | c3c09be34b6b0d7892f1087a23fc6eb93f3c4f04 (patch) | |
tree | 53331a1f14775c903a6b520f3344b533f9f275ab /src/include | |
parent | 0cb117eb33558bc779df833480958a97227dcbc2 (diff) | |
download | postgresql-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')
-rw-r--r-- | src/include/access/xact.h | 17 | ||||
-rw-r--r-- | src/include/access/xlog.h | 30 | ||||
-rw-r--r-- | src/include/access/xlogutils.h | 4 | ||||
-rw-r--r-- | src/include/catalog/pg_control.h | 14 | ||||
-rw-r--r-- | src/include/pg_config_manual.h | 10 | ||||
-rw-r--r-- | src/include/storage/smgr.h | 3 |
6 files changed, 61 insertions, 17 deletions
diff --git a/src/include/access/xact.h b/src/include/access/xact.h index 54ae24e53f9..95de83dc461 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -7,7 +7,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/xact.h,v 1.60 2004/01/26 22:51:56 momjian Exp $ + * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.61 2004/02/11 22:55:25 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -101,20 +101,23 @@ typedef TransactionStateData *TransactionState; typedef struct xl_xact_commit { time_t xtime; - - /* - * Array of RelFileNode-s to drop may follow at the end of struct - */ + /* Array of RelFileNode(s) to drop at commit */ + /* The XLOG record length determines how many there are */ + RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */ } xl_xact_commit; -#define SizeOfXactCommit ((offsetof(xl_xact_commit, xtime) + sizeof(time_t))) +#define MinSizeOfXactCommit offsetof(xl_xact_commit, xnodes) typedef struct xl_xact_abort { time_t xtime; + /* Array of RelFileNode(s) to drop at abort */ + /* The XLOG record length determines how many there are */ + RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */ } xl_xact_abort; -#define SizeOfXactAbort ((offsetof(xl_xact_abort, xtime) + sizeof(time_t))) +#define MinSizeOfXactAbort offsetof(xl_xact_abort, xnodes) + /* ---------------- * extern definitions 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). diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 3dd2a71482c..8b1dc671fa0 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.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/xlogutils.h,v 1.13 2003/11/29 22:40:55 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/access/xlogutils.h,v 1.14 2004/02/11 22:55:25 tgl Exp $ */ #ifndef XLOG_UTILS_H #define XLOG_UTILS_H @@ -24,6 +24,8 @@ extern void XLogInitRelationCache(void); extern void XLogCloseRelationCache(void); extern Relation XLogOpenRelation(bool redo, RmgrId rmid, RelFileNode rnode); +extern void XLogCloseRelation(RelFileNode rnode); + extern Buffer XLogReadBuffer(bool extend, Relation reln, BlockNumber blkno); #endif diff --git a/src/include/catalog/pg_control.h b/src/include/catalog/pg_control.h index fa8e7f219d6..8bc6e94d4d5 100644 --- a/src/include/catalog/pg_control.h +++ b/src/include/catalog/pg_control.h @@ -8,7 +8,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/pg_control.h,v 1.12 2003/11/29 22:40:58 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/catalog/pg_control.h,v 1.13 2004/02/11 22:55:26 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -22,7 +22,7 @@ /* Version identifier for this pg_control format */ -#define PG_CONTROL_VERSION 72 +#define PG_CONTROL_VERSION 73 /* * Body of CheckPoint XLOG records. This is declared here because we keep @@ -46,6 +46,8 @@ typedef struct CheckPoint #define XLOG_CHECKPOINT_SHUTDOWN 0x00 #define XLOG_CHECKPOINT_ONLINE 0x10 #define XLOG_NEXTOID 0x30 +#define XLOG_FILE_HEADER 0x40 +#define XLOG_WASTED_SPACE 0x50 /* System status indicator */ @@ -89,6 +91,12 @@ typedef struct ControlFileData uint32 catalog_version_no; /* see catversion.h */ /* + * Unique system identifier --- to ensure we match up xlog files with + * the installation that produced them. + */ + uint64 system_identifier; + + /* * System status data */ DBState state; /* see enum above */ @@ -107,6 +115,8 @@ typedef struct ControlFileData uint32 blcksz; /* block size for this DB */ uint32 relseg_size; /* blocks per segment of large relation */ + uint32 xlog_seg_size; /* size of each WAL segment */ + uint32 nameDataLen; /* catalog name field width */ uint32 funcMaxArgs; /* maximum number of function arguments */ diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 3722798ccee..8226c6d5cf7 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -6,7 +6,7 @@ * for developers. If you edit any of these, be sure to do a *full* * rebuild (and an initdb if noted). * - * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.9 2004/01/06 17:26:23 neilc Exp $ + * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.10 2004/02/11 22:55:26 tgl Exp $ *------------------------------------------------------------------------ */ @@ -44,6 +44,14 @@ #define RELSEG_SIZE (0x40000000 / BLCKSZ) /* + * XLOG_SEG_SIZE is the size of a single WAL file. This must be a power of 2 + * and larger than BLCKSZ (preferably, a great deal larger than BLCKSZ). + * + * Changing XLOG_SEG_SIZE requires an initdb. + */ +#define XLOG_SEG_SIZE (16*1024*1024) + +/* * Maximum number of columns in an index and maximum number of * arguments to a function. They must be the same value. * diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h index 738e436fb7d..41367d35e81 100644 --- a/src/include/storage/smgr.h +++ b/src/include/storage/smgr.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/smgr.h,v 1.40 2004/02/10 01:55:26 tgl Exp $ + * $PostgreSQL: pgsql/src/include/storage/smgr.h,v 1.41 2004/02/11 22:55:26 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -61,6 +61,7 @@ extern void smgrwrite(SMgrRelation reln, BlockNumber blocknum, char *buffer); extern BlockNumber smgrnblocks(SMgrRelation reln); extern BlockNumber smgrtruncate(SMgrRelation reln, BlockNumber nblocks); extern void smgrDoPendingDeletes(bool isCommit); +extern int smgrGetPendingDeletes(bool forCommit, RelFileNode **ptr); extern void smgrcommit(void); extern void smgrabort(void); extern void smgrsync(void); |