PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
xlogreader.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * xlogreader.h
4  * Definitions for the generic XLog reading facility
5  *
6  * Portions Copyright (c) 2013-2015, PostgreSQL Global Development Group
7  *
8  * IDENTIFICATION
9  * src/include/access/xlogreader.h
10  *
11  * NOTES
12  * See the definition of the XLogReaderState struct for instructions on
13  * how to use the XLogReader infrastructure.
14  *
15  * The basic idea is to allocate an XLogReaderState via
16  * XLogReaderAllocate(), and call XLogReadRecord() until it returns NULL.
17  *
18  * After reading a record with XLogReadRecord(), it's decomposed into
19  * the per-block and main data parts, and the parts can be accessed
20  * with the XLogRec* macros and functions. You can also decode a
21  * record that's already constructed in memory, without reading from
22  * disk, by calling the DecodeXLogRecord() function.
23  *-------------------------------------------------------------------------
24  */
25 #ifndef XLOGREADER_H
26 #define XLOGREADER_H
27 
28 #include "access/xlogrecord.h"
29 
31 
32 /* Function type definition for the read_page callback */
33 typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader,
34  XLogRecPtr targetPagePtr,
35  int reqLen,
36  XLogRecPtr targetRecPtr,
37  char *readBuf,
38  TimeLineID *pageTLI);
39 
40 typedef struct
41 {
42  /* Is this block ref in use? */
43  bool in_use;
44 
45  /* Identify the block this refers to */
49 
50  /* copy of the fork_flags field from the XLogRecordBlockHeader */
52 
53  /* Information on full-page image, if any */
54  bool has_image;
55  char *bkp_image;
60 
61  /* Buffer holding the rmgr-specific data associated with this block */
62  bool has_data;
63  char *data;
67 
69 {
70  /* ----------------------------------------
71  * Public parameters
72  * ----------------------------------------
73  */
74 
75  /*
76  * Data input callback (mandatory).
77  *
78  * This callback shall read at least reqLen valid bytes of the xlog page
79  * starting at targetPagePtr, and store them in readBuf. The callback
80  * shall return the number of bytes read (never more than XLOG_BLCKSZ), or
81  * -1 on failure. The callback shall sleep, if necessary, to wait for the
82  * requested bytes to become available. The callback will not be invoked
83  * again for the same page unless more than the returned number of bytes
84  * are needed.
85  *
86  * targetRecPtr is the position of the WAL record we're reading. Usually
87  * it is equal to targetPagePtr + reqLen, but sometimes xlogreader needs
88  * to read and verify the page or segment header, before it reads the
89  * actual WAL record it's interested in. In that case, targetRecPtr can
90  * be used to determine which timeline to read the page from.
91  *
92  * The callback shall set *pageTLI to the TLI of the file the page was
93  * read from. It is currently used only for error reporting purposes, to
94  * reconstruct the name of the WAL file where an error occurred.
95  */
97 
98  /*
99  * System identifier of the xlog files we're about to read. Set to zero
100  * (the default value) if unknown or unimportant.
101  */
103 
104  /*
105  * Opaque data for callbacks to use. Not used by XLogReader.
106  */
108 
109  /*
110  * Start and end point of last record read. EndRecPtr is also used as the
111  * position to read next, if XLogReadRecord receives an invalid recptr.
112  */
113  XLogRecPtr ReadRecPtr; /* start of last record read */
114  XLogRecPtr EndRecPtr; /* end+1 of last record read */
115 
116 
117  /* ----------------------------------------
118  * Decoded representation of current record
119  *
120  * Use XLogRecGet* functions to investigate the record; these fields
121  * should not be accessed directly.
122  * ----------------------------------------
123  */
124  XLogRecord *decoded_record; /* currently decoded record */
125 
126  char *main_data; /* record's main data portion */
127  uint32 main_data_len; /* main data portion's length */
128  uint32 main_data_bufsz; /* allocated size of the buffer */
129 
131 
132  /* information about blocks referenced by the record. */
134 
135  int max_block_id; /* highest block_id in use (-1 if none) */
136 
137  /* ----------------------------------------
138  * private/internal state
139  * ----------------------------------------
140  */
141 
142  /* Buffer for currently read page (XLOG_BLCKSZ bytes) */
143  char *readBuf;
144 
145  /* last read segment, segment offset, read length, TLI */
150 
151  /* beginning of last page read, and its TLI */
154 
155  /* beginning of the WAL record being read. */
157 
158  /* Buffer for current ReadRecord result (expandable) */
161 
162  /* Buffer to hold error message */
164 };
165 
166 /* Get a new XLogReader */
168  void *private_data);
169 
170 /* Free an XLogReader */
171 extern void XLogReaderFree(XLogReaderState *state);
172 
173 /* Read the next XLog record. Returns NULL on end-of-WAL or failure */
175  XLogRecPtr recptr, char **errormsg);
176 
177 #ifdef FRONTEND
178 extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr);
179 #endif /* FRONTEND */
180 
181 /* Functions for decoding an XLogRecord */
182 
183 extern bool DecodeXLogRecord(XLogReaderState *state, XLogRecord *record,
184  char **errmsg);
185 
186 #define XLogRecGetTotalLen(decoder) ((decoder)->decoded_record->xl_tot_len)
187 #define XLogRecGetPrev(decoder) ((decoder)->decoded_record->xl_prev)
188 #define XLogRecGetInfo(decoder) ((decoder)->decoded_record->xl_info)
189 #define XLogRecGetRmid(decoder) ((decoder)->decoded_record->xl_rmid)
190 #define XLogRecGetXid(decoder) ((decoder)->decoded_record->xl_xid)
191 #define XLogRecGetOrigin(decoder) ((decoder)->record_origin)
192 #define XLogRecGetData(decoder) ((decoder)->main_data)
193 #define XLogRecGetDataLen(decoder) ((decoder)->main_data_len)
194 #define XLogRecHasAnyBlockRefs(decoder) ((decoder)->max_block_id >= 0)
195 #define XLogRecHasBlockRef(decoder, block_id) \
196  ((decoder)->blocks[block_id].in_use)
197 #define XLogRecHasBlockImage(decoder, block_id) \
198  ((decoder)->blocks[block_id].has_image)
199 
200 extern bool RestoreBlockImage(XLogReaderState *recoder, uint8 block_id, char *dst);
201 extern char *XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len);
202 extern bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id,
203  RelFileNode *rnode, ForkNumber *forknum,
204  BlockNumber *blknum);
205 
206 #endif /* XLOGREADER_H */
BlockNumber blkno
Definition: xlogreader.h:48
XLogPageReadCB read_page
Definition: xlogreader.h:96
char * readRecordBuf
Definition: xlogreader.h:159
uint32 TimeLineID
Definition: xlogdefs.h:45
TimeLineID readPageTLI
Definition: xlogreader.h:149
bool DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errmsg)
Definition: xlogreader.c:953
uint16 hole_offset
Definition: xlogreader.h:56
bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileNode *rnode, ForkNumber *forknum, BlockNumber *blknum)
Definition: xlogreader.c:1241
unsigned char uint8
Definition: c.h:252
uint16 RepOriginId
Definition: xlogdefs.h:51
XLogReaderState * XLogReaderAllocate(XLogPageReadCB pagereadfunc, void *private_data)
Definition: xlogreader.c:65
uint32 BlockNumber
Definition: block.h:31
void * private_data
Definition: xlogreader.h:107
uint16 bimg_len
Definition: xlogreader.h:58
XLogRecPtr EndRecPtr
Definition: xlogreader.h:114
unsigned short uint16
Definition: c.h:253
XLogRecPtr latestPagePtr
Definition: xlogreader.h:152
uint16 hole_length
Definition: xlogreader.h:57
uint32 main_data_len
Definition: xlogreader.h:127
uint64 XLogSegNo
Definition: xlogdefs.h:34
XLogRecPtr ReadRecPtr
Definition: xlogreader.h:113
XLogRecord * decoded_record
Definition: xlogreader.h:124
unsigned int uint32
Definition: c.h:254
bool RestoreBlockImage(XLogReaderState *recoder, uint8 block_id, char *dst)
Definition: xlogreader.c:1294
ForkNumber
Definition: relpath.h:24
#define XLR_MAX_BLOCK_ID
Definition: xlogrecord.h:211
uint32 readRecordBufSize
Definition: xlogreader.h:160
ForkNumber forknum
Definition: xlogreader.h:47
uint16 data_len
Definition: xlogreader.h:64
XLogRecPtr currRecPtr
Definition: xlogreader.h:156
uint64 XLogRecPtr
Definition: xlogdefs.h:21
Definition: regguts.h:305
void XLogReaderFree(XLogReaderState *state)
Definition: xlogreader.c:123
XLogSegNo readSegNo
Definition: xlogreader.h:146
uint16 data_bufsz
Definition: xlogreader.h:65
int(* XLogPageReadCB)(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, char *readBuf, TimeLineID *pageTLI)
Definition: xlogreader.h:33
size_t Size
Definition: c.h:341
char * bkp_image
Definition: xlogreader.h:55
uint32 main_data_bufsz
Definition: xlogreader.h:128
char * XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len)
Definition: xlogreader.c:1265
int errmsg(const char *fmt,...)
Definition: elog.c:795
struct XLogRecord * XLogReadRecord(XLogReaderState *state, XLogRecPtr recptr, char **errormsg)
Definition: xlogreader.c:191
uint64 system_identifier
Definition: xlogreader.h:102
char * errormsg_buf
Definition: xlogreader.h:163
char * main_data
Definition: xlogreader.h:126
TimeLineID latestPageTLI
Definition: xlogreader.h:153
RelFileNode rnode
Definition: xlogreader.h:46
RepOriginId record_origin
Definition: xlogreader.h:130
DecodedBkpBlock blocks[XLR_MAX_BLOCK_ID+1]
Definition: xlogreader.h:133