aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-12-12 16:22:14 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2011-12-12 16:22:14 -0500
commit2dd9322ba6eea76800b38bfea0599fbc459458f2 (patch)
tree360f11d83e27e9c35c0e4c7a4f380c2722bceefb /src/include
parent8409b60476a4112e654d1a5099dd67a54f197afd (diff)
downloadpostgresql-2dd9322ba6eea76800b38bfea0599fbc459458f2.tar.gz
postgresql-2dd9322ba6eea76800b38bfea0599fbc459458f2.zip
Move BKP_REMOVABLE bit from individual WAL records to WAL page headers.
Removing this bit from xl_info allows us to restore the old limit of four (not three) separate pages touched by a WAL record, which is needed for the upcoming SP-GiST feature, and will likely be useful elsewhere in future. When we implemented XLR_BKP_REMOVABLE in 2007, we had to do it like that because no special WAL-visible action was taken when starting a backup. However, now we force a segment switch when starting a backup, so a compressing WAL archiver (such as pglesslog) that uses the state shown in the current page header will not be fooled as to removability of backup blocks. The only downside is that the archiver will not return to compressing mode for up to one WAL page after the backup is over, which is a small price to pay for getting back the extra xl_info bit. In any case the archiver could look for XLOG_BACKUP_END records if it thought it was worth the trouble to do so. Bump XLOG_PAGE_MAGIC since this is effectively a change in WAL format.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/access/xlog.h18
-rw-r--r--src/include/access/xlog_internal.h6
2 files changed, 9 insertions, 15 deletions
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index 1b31414060d..86ab3276caf 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -29,7 +29,7 @@
* backup block data
* ...
*
- * where there can be zero to three backup blocks (as signaled by xl_info flag
+ * where there can be zero to four backup blocks (as signaled by xl_info flag
* bits). XLogRecord structs always start on MAXALIGN boundaries in the WAL
* files, and we round up SizeOfXLogRecord so that the rmgr data is also
* guaranteed to begin on a MAXALIGN boundary. However, no padding is added
@@ -66,24 +66,16 @@ typedef struct XLogRecord
/*
* If we backed up any disk blocks with the XLOG record, we use flag bits in
- * xl_info to signal it. We support backup of up to 3 disk blocks per XLOG
+ * xl_info to signal it. We support backup of up to 4 disk blocks per XLOG
* record.
*/
-#define XLR_BKP_BLOCK_MASK 0x0E /* all info bits used for bkp blocks */
-#define XLR_MAX_BKP_BLOCKS 3
+#define XLR_BKP_BLOCK_MASK 0x0F /* all info bits used for bkp blocks */
+#define XLR_MAX_BKP_BLOCKS 4
#define XLR_SET_BKP_BLOCK(iblk) (0x08 >> (iblk))
#define XLR_BKP_BLOCK_1 XLR_SET_BKP_BLOCK(0) /* 0x08 */
#define XLR_BKP_BLOCK_2 XLR_SET_BKP_BLOCK(1) /* 0x04 */
#define XLR_BKP_BLOCK_3 XLR_SET_BKP_BLOCK(2) /* 0x02 */
-
-/*
- * Bit 0 of xl_info is set if the backed-up blocks could safely be removed
- * from a compressed version of XLOG (that is, they are backed up only to
- * prevent partial-page-write problems, and not to ensure consistency of PITR
- * recovery). The compression algorithm would need to extract data from the
- * blocks to create an equivalent non-full-page XLOG record.
- */
-#define XLR_BKP_REMOVABLE 0x01
+#define XLR_BKP_BLOCK_4 XLR_SET_BKP_BLOCK(3) /* 0x01 */
/* Sync methods */
#define SYNC_METHOD_FSYNC 0
diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h
index cb438797734..3f73a6850d2 100644
--- a/src/include/access/xlog_internal.h
+++ b/src/include/access/xlog_internal.h
@@ -71,7 +71,7 @@ typedef struct XLogContRecord
/*
* Each page of XLOG file has a header like this:
*/
-#define XLOG_PAGE_MAGIC 0xD068 /* can be used as WAL version indicator */
+#define XLOG_PAGE_MAGIC 0xD069 /* can be used as WAL version indicator */
typedef struct XLogPageHeaderData
{
@@ -106,8 +106,10 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
#define XLP_FIRST_IS_CONTRECORD 0x0001
/* This flag indicates a "long" page header */
#define XLP_LONG_HEADER 0x0002
+/* This flag indicates backup blocks starting in this page are optional */
+#define XLP_BKP_REMOVABLE 0x0004
/* All defined flag bits in xlp_info (used for validity checking of header) */
-#define XLP_ALL_FLAGS 0x0003
+#define XLP_ALL_FLAGS 0x0007
#define XLogPageHeaderSize(hdr) \
(((hdr)->xlp_info & XLP_LONG_HEADER) ? SizeOfXLogLongPHD : SizeOfXLogShortPHD)