diff options
Diffstat (limited to 'src/include/access/xlogrecord.h')
-rw-r--r-- | src/include/access/xlogrecord.h | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/include/access/xlogrecord.h b/src/include/access/xlogrecord.h new file mode 100644 index 00000000000..ab0fb1c5004 --- /dev/null +++ b/src/include/access/xlogrecord.h @@ -0,0 +1,100 @@ +/* + * xlogrecord.h + * + * Definitions for the WAL record format. + * + * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/access/xlogrecord.h + */ +#ifndef XLOGRECORD_H +#define XLOGRECORD_H + +#include "access/rmgr.h" +#include "access/xlogdefs.h" +#include "storage/block.h" +#include "storage/relfilenode.h" +#include "utils/pg_crc.h" + +/* + * The overall layout of an XLOG record is: + * Fixed-size header (XLogRecord struct) + * rmgr-specific data + * BkpBlock + * backup block data + * BkpBlock + * backup block data + * ... + * + * 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 + * to align BkpBlock structs or backup block data. + * + * NOTE: xl_len counts only the rmgr data, not the XLogRecord header, + * and also not any backup blocks. xl_tot_len counts everything. Neither + * length field is rounded up to an alignment boundary. + */ +typedef struct XLogRecord +{ + uint32 xl_tot_len; /* total len of entire record */ + TransactionId xl_xid; /* xact id */ + uint32 xl_len; /* total len of rmgr data */ + uint8 xl_info; /* flag bits, see below */ + RmgrId xl_rmid; /* resource manager for this record */ + /* 2 bytes of padding here, initialize to zero */ + XLogRecPtr xl_prev; /* ptr to previous record in log */ + pg_crc32 xl_crc; /* CRC for this record */ + + /* If MAXALIGN==8, there are 4 wasted bytes here */ + + /* ACTUAL LOG DATA FOLLOWS AT END OF STRUCT */ + +} XLogRecord; + +#define SizeOfXLogRecord MAXALIGN(sizeof(XLogRecord)) + +#define XLogRecGetData(record) ((char*) (record) + SizeOfXLogRecord) + +/* + * XLOG uses only low 4 bits of xl_info. High 4 bits may be used by rmgr. + */ +#define XLR_INFO_MASK 0x0F + +/* + * 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 4 disk blocks per XLOG + * record. + */ +#define XLR_BKP_BLOCK_MASK 0x0F /* all info bits used for bkp blocks */ +#define XLR_MAX_BKP_BLOCKS 4 +#define XLR_BKP_BLOCK(iblk) (0x08 >> (iblk)) /* iblk in 0..3 */ + +/* + * Header info for a backup block appended to an XLOG record. + * + * As a trivial form of data compression, the XLOG code is aware that + * PG data pages usually contain an unused "hole" in the middle, which + * contains only zero bytes. If hole_length > 0 then we have removed + * such a "hole" from the stored data (and it's not counted in the + * XLOG record's CRC, either). Hence, the amount of block data actually + * present following the BkpBlock struct is BLCKSZ - hole_length bytes. + * + * Note that we don't attempt to align either the BkpBlock struct or the + * block's data. So, the struct must be copied to aligned local storage + * before use. + */ +typedef struct BkpBlock +{ + RelFileNode node; /* relation containing block */ + ForkNumber fork; /* fork within the relation */ + BlockNumber block; /* block number */ + uint16 hole_offset; /* number of bytes before "hole" */ + uint16 hole_length; /* number of bytes in "hole" */ + + /* ACTUAL BLOCK DATA FOLLOWS AT END OF STRUCT */ +} BkpBlock; + +#endif /* XLOGRECORD_H */ |