@@ -37,12 +37,10 @@ PG_FUNCTION_INFO_V1(pg_get_wal_stats);
37
37
PG_FUNCTION_INFO_V1 (pg_get_wal_stats_till_end_of_wal );
38
38
39
39
static bool IsFutureLSN (XLogRecPtr lsn , XLogRecPtr * curr_lsn );
40
- static XLogReaderState * InitXLogReaderState (XLogRecPtr lsn ,
41
- XLogRecPtr * first_record );
42
- static XLogRecord * ReadNextXLogRecord (XLogReaderState * xlogreader ,
43
- XLogRecPtr first_record );
44
- static void GetWALRecordInfo (XLogReaderState * record , XLogRecPtr lsn ,
45
- Datum * values , bool * nulls , uint32 ncols );
40
+ static XLogReaderState * InitXLogReaderState (XLogRecPtr lsn );
41
+ static XLogRecord * ReadNextXLogRecord (XLogReaderState * xlogreader );
42
+ static void GetWALRecordInfo (XLogReaderState * record , Datum * values ,
43
+ bool * nulls , uint32 ncols );
46
44
static XLogRecPtr ValidateInputLSNs (bool till_end_of_wal ,
47
45
XLogRecPtr start_lsn , XLogRecPtr end_lsn );
48
46
static void GetWALRecordsInfo (FunctionCallInfo fcinfo , XLogRecPtr start_lsn ,
@@ -86,10 +84,11 @@ IsFutureLSN(XLogRecPtr lsn, XLogRecPtr *curr_lsn)
86
84
* Intialize WAL reader and identify first valid LSN.
87
85
*/
88
86
static XLogReaderState *
89
- InitXLogReaderState (XLogRecPtr lsn , XLogRecPtr * first_record )
87
+ InitXLogReaderState (XLogRecPtr lsn )
90
88
{
91
89
XLogReaderState * xlogreader ;
92
90
ReadLocalXLogPageNoWaitPrivate * private_data ;
91
+ XLogRecPtr first_valid_record ;
93
92
94
93
/*
95
94
* Reading WAL below the first page of the first segments isn't allowed.
@@ -117,9 +116,9 @@ InitXLogReaderState(XLogRecPtr lsn, XLogRecPtr *first_record)
117
116
errdetail ("Failed while allocating a WAL reading processor." )));
118
117
119
118
/* first find a valid recptr to start from */
120
- * first_record = XLogFindNextRecord (xlogreader , lsn );
119
+ first_valid_record = XLogFindNextRecord (xlogreader , lsn );
121
120
122
- if (XLogRecPtrIsInvalid (* first_record ))
121
+ if (XLogRecPtrIsInvalid (first_valid_record ))
123
122
ereport (ERROR ,
124
123
(errmsg ("could not find a valid record after %X/%X" ,
125
124
LSN_FORMAT_ARGS (lsn ))));
@@ -140,7 +139,7 @@ InitXLogReaderState(XLogRecPtr lsn, XLogRecPtr *first_record)
140
139
* that case we'll return NULL.
141
140
*/
142
141
static XLogRecord *
143
- ReadNextXLogRecord (XLogReaderState * xlogreader , XLogRecPtr first_record )
142
+ ReadNextXLogRecord (XLogReaderState * xlogreader )
144
143
{
145
144
XLogRecord * record ;
146
145
char * errormsg ;
@@ -162,12 +161,12 @@ ReadNextXLogRecord(XLogReaderState *xlogreader, XLogRecPtr first_record)
162
161
ereport (ERROR ,
163
162
(errcode_for_file_access (),
164
163
errmsg ("could not read WAL at %X/%X: %s" ,
165
- LSN_FORMAT_ARGS (first_record ), errormsg )));
164
+ LSN_FORMAT_ARGS (xlogreader -> EndRecPtr ), errormsg )));
166
165
else
167
166
ereport (ERROR ,
168
167
(errcode_for_file_access (),
169
168
errmsg ("could not read WAL at %X/%X" ,
170
- LSN_FORMAT_ARGS (first_record ))));
169
+ LSN_FORMAT_ARGS (xlogreader -> EndRecPtr ))));
171
170
}
172
171
173
172
return record ;
@@ -177,8 +176,8 @@ ReadNextXLogRecord(XLogReaderState *xlogreader, XLogRecPtr first_record)
177
176
* Get a single WAL record info.
178
177
*/
179
178
static void
180
- GetWALRecordInfo (XLogReaderState * record , XLogRecPtr lsn ,
181
- Datum * values , bool * nulls , uint32 ncols )
179
+ GetWALRecordInfo (XLogReaderState * record , Datum * values ,
180
+ bool * nulls , uint32 ncols )
182
181
{
183
182
const char * id ;
184
183
RmgrData desc ;
@@ -203,7 +202,7 @@ GetWALRecordInfo(XLogReaderState *record, XLogRecPtr lsn,
203
202
204
203
main_data_len = XLogRecGetDataLen (record );
205
204
206
- values [i ++ ] = LSNGetDatum (lsn );
205
+ values [i ++ ] = LSNGetDatum (record -> ReadRecPtr );
207
206
values [i ++ ] = LSNGetDatum (record -> EndRecPtr );
208
207
values [i ++ ] = LSNGetDatum (XLogRecGetPrev (record ));
209
208
values [i ++ ] = TransactionIdGetDatum (XLogRecGetXid (record ));
@@ -233,7 +232,6 @@ pg_get_wal_record_info(PG_FUNCTION_ARGS)
233
232
bool nulls [PG_GET_WAL_RECORD_INFO_COLS ] = {0 };
234
233
XLogRecPtr lsn ;
235
234
XLogRecPtr curr_lsn ;
236
- XLogRecPtr first_record ;
237
235
XLogReaderState * xlogreader ;
238
236
TupleDesc tupdesc ;
239
237
HeapTuple tuple ;
@@ -258,16 +256,15 @@ pg_get_wal_record_info(PG_FUNCTION_ARGS)
258
256
if (get_call_result_type (fcinfo , NULL , & tupdesc ) != TYPEFUNC_COMPOSITE )
259
257
elog (ERROR , "return type must be a row type" );
260
258
261
- xlogreader = InitXLogReaderState (lsn , & first_record );
259
+ xlogreader = InitXLogReaderState (lsn );
262
260
263
- if (!ReadNextXLogRecord (xlogreader , first_record ))
261
+ if (!ReadNextXLogRecord (xlogreader ))
264
262
ereport (ERROR ,
265
263
(errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
266
264
errmsg ("could not read WAL at %X/%X" ,
267
- LSN_FORMAT_ARGS (first_record ))));
265
+ LSN_FORMAT_ARGS (xlogreader -> EndRecPtr ))));
268
266
269
- GetWALRecordInfo (xlogreader , first_record , values , nulls ,
270
- PG_GET_WAL_RECORD_INFO_COLS );
267
+ GetWALRecordInfo (xlogreader , values , nulls , PG_GET_WAL_RECORD_INFO_COLS );
271
268
272
269
pfree (xlogreader -> private_data );
273
270
XLogReaderFree (xlogreader );
@@ -328,22 +325,19 @@ GetWALRecordsInfo(FunctionCallInfo fcinfo, XLogRecPtr start_lsn,
328
325
XLogRecPtr end_lsn )
329
326
{
330
327
#define PG_GET_WAL_RECORDS_INFO_COLS 11
331
- XLogRecPtr first_record ;
332
328
XLogReaderState * xlogreader ;
333
329
ReturnSetInfo * rsinfo = (ReturnSetInfo * ) fcinfo -> resultinfo ;
334
330
Datum values [PG_GET_WAL_RECORDS_INFO_COLS ] = {0 };
335
331
bool nulls [PG_GET_WAL_RECORDS_INFO_COLS ] = {0 };
336
332
337
333
SetSingleFuncCall (fcinfo , 0 );
338
334
339
- xlogreader = InitXLogReaderState (start_lsn , & first_record );
340
-
341
- Assert (xlogreader );
335
+ xlogreader = InitXLogReaderState (start_lsn );
342
336
343
- while (ReadNextXLogRecord (xlogreader , first_record ) &&
337
+ while (ReadNextXLogRecord (xlogreader ) &&
344
338
xlogreader -> EndRecPtr <= end_lsn )
345
339
{
346
- GetWALRecordInfo (xlogreader , xlogreader -> currRecPtr , values , nulls ,
340
+ GetWALRecordInfo (xlogreader , values , nulls ,
347
341
PG_GET_WAL_RECORDS_INFO_COLS );
348
342
349
343
tuplestore_putvalues (rsinfo -> setResult , rsinfo -> setDesc ,
@@ -548,7 +542,6 @@ GetWalStats(FunctionCallInfo fcinfo, XLogRecPtr start_lsn,
548
542
XLogRecPtr end_lsn , bool stats_per_record )
549
543
{
550
544
#define PG_GET_WAL_STATS_COLS 9
551
- XLogRecPtr first_record ;
552
545
XLogReaderState * xlogreader ;
553
546
XLogStats stats = {0 };
554
547
ReturnSetInfo * rsinfo = (ReturnSetInfo * ) fcinfo -> resultinfo ;
@@ -557,9 +550,9 @@ GetWalStats(FunctionCallInfo fcinfo, XLogRecPtr start_lsn,
557
550
558
551
SetSingleFuncCall (fcinfo , 0 );
559
552
560
- xlogreader = InitXLogReaderState (start_lsn , & first_record );
553
+ xlogreader = InitXLogReaderState (start_lsn );
561
554
562
- while (ReadNextXLogRecord (xlogreader , first_record ) &&
555
+ while (ReadNextXLogRecord (xlogreader ) &&
563
556
xlogreader -> EndRecPtr <= end_lsn )
564
557
{
565
558
XLogRecStoreStats (& stats , xlogreader );
0 commit comments