1999-09-27 17:48:12 +02:00
|
|
|
/*
|
|
|
|
* xlog.h
|
|
|
|
*
|
2000-11-21 22:16:06 +01:00
|
|
|
* PostgreSQL transaction log manager
|
1999-09-27 17:48:12 +02:00
|
|
|
*
|
2001-02-26 01:50:08 +01:00
|
|
|
* $Header: /cvsroot/pgsql/src/include/access/xlog.h,v 1.18 2001/02/26 00:50:07 tgl Exp $
|
1999-09-27 17:48:12 +02:00
|
|
|
*/
|
|
|
|
#ifndef XLOG_H
|
|
|
|
#define XLOG_H
|
|
|
|
|
|
|
|
#include "access/rmgr.h"
|
|
|
|
#include "access/transam.h"
|
2000-10-28 18:21:00 +02:00
|
|
|
#include "access/xlogdefs.h"
|
2000-11-21 22:16:06 +01:00
|
|
|
#include "access/xlogutils.h"
|
1999-09-27 17:48:12 +02:00
|
|
|
|
2000-12-28 14:00:29 +01:00
|
|
|
typedef struct crc64
|
|
|
|
{
|
|
|
|
uint32 crc1;
|
|
|
|
uint32 crc2;
|
|
|
|
} crc64;
|
|
|
|
|
1999-09-27 17:48:12 +02:00
|
|
|
typedef struct XLogRecord
|
|
|
|
{
|
2000-12-28 14:00:29 +01:00
|
|
|
crc64 xl_crc;
|
2000-04-12 19:17:23 +02:00
|
|
|
XLogRecPtr xl_prev; /* ptr to previous record in log */
|
|
|
|
XLogRecPtr xl_xact_prev; /* ptr to previous record of this xact */
|
|
|
|
TransactionId xl_xid; /* xact id */
|
2000-12-28 14:00:29 +01:00
|
|
|
uint16 xl_len; /* total len of record *data* */
|
2000-04-12 19:17:23 +02:00
|
|
|
uint8 xl_info;
|
|
|
|
RmgrId xl_rmid; /* resource manager inserted this record */
|
1999-09-27 17:48:12 +02:00
|
|
|
|
|
|
|
/* ACTUAL LOG DATA FOLLOWS AT END OF STRUCT */
|
|
|
|
|
|
|
|
} XLogRecord;
|
|
|
|
|
2000-04-12 19:17:23 +02:00
|
|
|
#define SizeOfXLogRecord DOUBLEALIGN(sizeof(XLogRecord))
|
|
|
|
#define MAXLOGRECSZ (2 * BLCKSZ)
|
2000-07-04 03:49:44 +02:00
|
|
|
|
|
|
|
#define XLogRecGetData(record) \
|
|
|
|
((char*)record + SizeOfXLogRecord)
|
|
|
|
|
1999-09-27 17:48:12 +02:00
|
|
|
/*
|
2000-12-28 14:00:29 +01:00
|
|
|
* When there is no space on current page we continue
|
|
|
|
* on the next page with subrecord.
|
1999-09-27 17:48:12 +02:00
|
|
|
*/
|
|
|
|
typedef struct XLogSubRecord
|
|
|
|
{
|
2000-12-28 14:00:29 +01:00
|
|
|
uint16 xl_len; /* len of data left */
|
1999-09-27 17:48:12 +02:00
|
|
|
|
|
|
|
/* ACTUAL LOG DATA FOLLOWS AT END OF STRUCT */
|
|
|
|
|
|
|
|
} XLogSubRecord;
|
|
|
|
|
2000-12-28 14:00:29 +01:00
|
|
|
#define SizeOfXLogSubRecord DOUBLEALIGN(sizeof(XLogSubRecord))
|
1999-09-27 17:48:12 +02:00
|
|
|
|
2000-06-02 12:20:27 +02:00
|
|
|
/*
|
2000-12-28 14:00:29 +01:00
|
|
|
* XLOG uses only low 4 bits of xl_info.
|
|
|
|
* High 4 bits may be used by rmgr...
|
|
|
|
*
|
|
|
|
* We support backup of 2 blocks per record only.
|
|
|
|
* If we backed up some of these blocks then we use
|
|
|
|
* flags below to signal rmgr about this on recovery.
|
2000-06-02 12:20:27 +02:00
|
|
|
*/
|
2000-12-28 14:00:29 +01:00
|
|
|
#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 */
|
2000-06-02 12:20:27 +02:00
|
|
|
#define XLR_INFO_MASK 0x0F
|
1999-09-27 17:48:12 +02:00
|
|
|
|
2000-11-30 02:47:33 +01:00
|
|
|
/*
|
|
|
|
* Sometimes we log records which are out of transaction control.
|
|
|
|
* Rmgr may use flag below for this purpose.
|
|
|
|
*/
|
|
|
|
#define XLOG_NO_TRAN XLR_INFO_MASK
|
|
|
|
|
2000-04-12 19:17:23 +02:00
|
|
|
#define XLOG_PAGE_MAGIC 0x17345168
|
1999-09-27 17:48:12 +02:00
|
|
|
|
|
|
|
typedef struct XLogPageHeaderData
|
|
|
|
{
|
|
|
|
uint32 xlp_magic;
|
|
|
|
uint16 xlp_info;
|
|
|
|
} XLogPageHeaderData;
|
|
|
|
|
2000-04-12 19:17:23 +02:00
|
|
|
#define SizeOfXLogPHD DOUBLEALIGN(sizeof(XLogPageHeaderData))
|
1999-09-27 17:48:12 +02:00
|
|
|
|
|
|
|
typedef XLogPageHeaderData *XLogPageHeader;
|
|
|
|
|
2000-12-28 14:00:29 +01:00
|
|
|
/* When record crosses page boundary */
|
2000-04-12 19:17:23 +02:00
|
|
|
#define XLP_FIRST_IS_SUBRECORD 0x0001
|
1999-09-27 17:48:12 +02:00
|
|
|
|
2000-10-20 13:01:21 +02:00
|
|
|
#define XLByteLT(left, right) \
|
|
|
|
(right.xlogid > left.xlogid || \
|
|
|
|
(right.xlogid == left.xlogid && right.xrecoff > left.xrecoff))
|
|
|
|
|
|
|
|
#define XLByteLE(left, right) \
|
|
|
|
(right.xlogid > left.xlogid || \
|
|
|
|
(right.xlogid == left.xlogid && right.xrecoff >= left.xrecoff))
|
|
|
|
|
|
|
|
#define XLByteEQ(left, right) \
|
|
|
|
(right.xlogid == left.xlogid && right.xrecoff == left.xrecoff)
|
|
|
|
|
2000-10-28 18:21:00 +02:00
|
|
|
extern StartUpID ThisStartUpID; /* current SUI */
|
2000-10-20 13:01:21 +02:00
|
|
|
extern bool InRecovery;
|
2000-10-21 17:43:36 +02:00
|
|
|
extern XLogRecPtr MyLastRecPtr;
|
|
|
|
|
|
|
|
typedef struct RmgrData
|
|
|
|
{
|
|
|
|
char *rm_name;
|
|
|
|
void (*rm_redo)(XLogRecPtr lsn, XLogRecord *rptr);
|
|
|
|
void (*rm_undo)(XLogRecPtr lsn, XLogRecord *rptr);
|
|
|
|
void (*rm_desc)(char *buf, uint8 xl_info, char *rec);
|
|
|
|
} RmgrData;
|
|
|
|
|
|
|
|
extern RmgrData RmgrTable[];
|
2000-07-03 04:54:21 +02:00
|
|
|
|
2000-12-28 14:00:29 +01:00
|
|
|
/*
|
|
|
|
* List of these structs is used to pass data to XLOG.
|
|
|
|
* If buffer is valid then XLOG will check if buffer must
|
|
|
|
* be backup-ed. For backup-ed buffer data will not be
|
|
|
|
* inserted into record (and XLOG sets
|
|
|
|
* XLR_BKP_BLOCK_X bit in xl_info).
|
|
|
|
*/
|
|
|
|
typedef struct XLogRecData
|
|
|
|
{
|
|
|
|
Buffer buffer; /* buffer associated with this data */
|
|
|
|
char *data;
|
|
|
|
uint32 len;
|
|
|
|
struct XLogRecData *next;
|
|
|
|
} XLogRecData;
|
|
|
|
|
|
|
|
extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info, XLogRecData *rdata);
|
2000-04-12 19:17:23 +02:00
|
|
|
extern void XLogFlush(XLogRecPtr RecPtr);
|
1999-09-27 17:48:12 +02:00
|
|
|
|
2000-11-05 23:50:21 +01:00
|
|
|
extern void CreateCheckPoint(bool shutdown);
|
|
|
|
|
2000-11-21 22:16:06 +01:00
|
|
|
extern void xlog_redo(XLogRecPtr lsn, XLogRecord *record);
|
|
|
|
extern void xlog_undo(XLogRecPtr lsn, XLogRecord *record);
|
|
|
|
extern void xlog_desc(char *buf, uint8 xl_info, char* rec);
|
|
|
|
|
|
|
|
extern void UpdateControlFile(void);
|
|
|
|
extern int XLOGShmemSize(void);
|
|
|
|
extern void XLOGShmemInit(void);
|
2000-11-25 21:33:54 +01:00
|
|
|
extern void XLOGPathInit(void);
|
2000-11-21 22:16:06 +01:00
|
|
|
extern void BootStrapXLOG(void);
|
|
|
|
extern void StartupXLOG(void);
|
|
|
|
extern void ShutdownXLOG(void);
|
|
|
|
extern void CreateCheckPoint(bool shutdown);
|
|
|
|
extern void SetThisStartUpID(void);
|
|
|
|
|
2001-02-26 01:50:08 +01:00
|
|
|
/* in storage/ipc/sinval.c, but don't want to declare in sinval.h because
|
|
|
|
* we'd have to include xlog.h into that ...
|
|
|
|
*/
|
|
|
|
extern XLogRecPtr GetUndoRecPtr(void);
|
|
|
|
|
2000-04-12 19:17:23 +02:00
|
|
|
#endif /* XLOG_H */
|