PostgreSQL Source Code git master
Loading...
Searching...
No Matches
walsummaryfuncs.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * walsummaryfuncs.c
4 * SQL-callable functions for accessing WAL summary data.
5 *
6 * Portions Copyright (c) 2010-2026, PostgreSQL Global Development Group
7 *
8 * src/backend/backup/walsummaryfuncs.c
9 *
10 *-------------------------------------------------------------------------
11 */
12
13#include "postgres.h"
14
15#include "access/htup_details.h"
16#include "backup/walsummary.h"
17#include "common/blkreftable.h"
18#include "funcapi.h"
19#include "miscadmin.h"
21#include "utils/fmgrprotos.h"
22#include "utils/pg_lsn.h"
23#include "utils/tuplestore.h"
24
25#define NUM_WS_ATTS 3
26#define NUM_SUMMARY_ATTS 6
27#define NUM_STATE_ATTS 4
28#define MAX_BLOCKS_PER_CALL 256
29
30/*
31 * List the WAL summary files available in pg_wal/summaries.
32 */
35{
36 ReturnSetInfo *rsi;
37 List *wslist;
38 ListCell *lc;
40 bool nulls[NUM_WS_ATTS];
41
42 InitMaterializedSRF(fcinfo, 0);
43 rsi = (ReturnSetInfo *) fcinfo->resultinfo;
44
45 memset(nulls, 0, sizeof(nulls));
46
48 foreach(lc, wslist)
49 {
51 HeapTuple tuple;
52
54
55 values[0] = Int64GetDatum((int64) ws->tli);
56 values[1] = LSNGetDatum(ws->start_lsn);
57 values[2] = LSNGetDatum(ws->end_lsn);
58
59 tuple = heap_form_tuple(rsi->setDesc, values, nulls);
60 tuplestore_puttuple(rsi->setResult, tuple);
61 }
62
63 return (Datum) 0;
64}
65
66/*
67 * List the contents of a WAL summary file identified by TLI, start LSN,
68 * and end LSN.
69 */
72{
73 ReturnSetInfo *rsi;
75 bool nulls[NUM_SUMMARY_ATTS];
77 WalSummaryIO io;
78 BlockRefTableReader *reader;
80 RelFileLocator rlocator;
81 ForkNumber forknum;
82 BlockNumber limit_block;
83
84 InitMaterializedSRF(fcinfo, 0);
85 rsi = (ReturnSetInfo *) fcinfo->resultinfo;
86 memset(nulls, 0, sizeof(nulls));
87
88 /*
89 * Since the timeline could at least in theory be more than 2^31, and
90 * since we don't have unsigned types at the SQL level, it is passed as a
91 * 64-bit integer. Test whether it's out of range.
92 */
97 errmsg("invalid timeline %" PRId64, raw_tli));
98
99 /* Prepare to read the specified WAL summary file. */
100 ws.tli = (TimeLineID) raw_tli;
101 ws.start_lsn = PG_GETARG_LSN(1);
102 ws.end_lsn = PG_GETARG_LSN(2);
103 io.filepos = 0;
104 io.file = OpenWalSummaryFile(&ws, false);
106 FilePathName(io.file),
108
109 /* Loop over relation forks. */
110 while (BlockRefTableReaderNextRelation(reader, &rlocator, &forknum,
111 &limit_block))
112 {
114 HeapTuple tuple;
115
117
118 values[0] = ObjectIdGetDatum(rlocator.relNumber);
119 values[1] = ObjectIdGetDatum(rlocator.spcOid);
120 values[2] = ObjectIdGetDatum(rlocator.dbOid);
121 values[3] = Int16GetDatum((int16) forknum);
122
123 /*
124 * If the limit block is not InvalidBlockNumber, emit an extra row
125 * with that block number and limit_block = true.
126 *
127 * There is no point in doing this when the limit_block is
128 * InvalidBlockNumber, because no block with that number or any higher
129 * number can ever exist.
130 */
131 if (BlockNumberIsValid(limit_block))
132 {
133 values[4] = Int64GetDatum((int64) limit_block);
134 values[5] = BoolGetDatum(true);
135
136 tuple = heap_form_tuple(rsi->setDesc, values, nulls);
137 tuplestore_puttuple(rsi->setResult, tuple);
138 }
139
140 /* Loop over blocks within the current relation fork. */
141 while (1)
142 {
143 unsigned nblocks;
144 unsigned i;
145
147
148 nblocks = BlockRefTableReaderGetBlocks(reader, blocks,
150 if (nblocks == 0)
151 break;
152
153 /*
154 * For each block that we specifically know to have been modified,
155 * emit a row with that block number and limit_block = false.
156 */
157 values[5] = BoolGetDatum(false);
158 for (i = 0; i < nblocks; ++i)
159 {
160 values[4] = Int64GetDatum((int64) blocks[i]);
161
162 tuple = heap_form_tuple(rsi->setDesc, values, nulls);
163 tuplestore_puttuple(rsi->setResult, tuple);
164 }
165 }
166 }
167
168 /* Cleanup */
170 FileClose(io.file);
171
172 return (Datum) 0;
173}
174
175/*
176 * Returns information about the state of the WAL summarizer process.
177 */
178Datum
180{
182 bool nulls[NUM_STATE_ATTS];
183 TimeLineID summarized_tli;
184 XLogRecPtr summarized_lsn;
185 XLogRecPtr pending_lsn;
186 int summarizer_pid;
187 TupleDesc tupdesc;
188 HeapTuple htup;
189
190 GetWalSummarizerState(&summarized_tli, &summarized_lsn, &pending_lsn,
192
193 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
194 elog(ERROR, "return type must be a row type");
195
196 memset(nulls, 0, sizeof(nulls));
197
198 values[0] = Int64GetDatum((int64) summarized_tli);
199 values[1] = LSNGetDatum(summarized_lsn);
200 values[2] = LSNGetDatum(pending_lsn);
201
202 if (summarizer_pid < 0)
203 nulls[3] = true;
204 else
206
207 htup = heap_form_tuple(tupdesc, values, nulls);
208
210}
bool BlockRefTableReaderNextRelation(BlockRefTableReader *reader, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *limit_block)
BlockRefTableReader * CreateBlockRefTableReader(io_callback_fn read_callback, void *read_callback_arg, char *error_filename, report_error_fn error_callback, void *error_callback_arg)
unsigned BlockRefTableReaderGetBlocks(BlockRefTableReader *reader, BlockNumber *blocks, int nblocks)
void DestroyBlockRefTableReader(BlockRefTableReader *reader)
uint32 BlockNumber
Definition block.h:31
static bool BlockNumberIsValid(BlockNumber blockNumber)
Definition block.h:71
static Datum values[MAXATTR]
Definition bootstrap.c:188
#define PG_INT32_MAX
Definition c.h:675
int64_t int64
Definition c.h:615
int16_t int16
Definition c.h:613
int errcode(int sqlerrcode)
Definition elog.c:874
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
#define ereport(elevel,...)
Definition elog.h:150
char * FilePathName(File file)
Definition fd.c:2500
void FileClose(File file)
Definition fd.c:1966
#define PG_GETARG_INT64(n)
Definition fmgr.h:284
#define PG_RETURN_DATUM(x)
Definition fmgr.h:354
#define PG_FUNCTION_ARGS
Definition fmgr.h:193
void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
Definition funcapi.c:76
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
Definition funcapi.c:276
@ TYPEFUNC_COMPOSITE
Definition funcapi.h:149
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
Definition funcapi.h:230
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
Definition heaptuple.c:1037
int i
Definition isn.c:77
#define CHECK_FOR_INTERRUPTS()
Definition miscadmin.h:123
static char * errmsg
#define lfirst(lc)
Definition pg_list.h:172
#define PG_GETARG_LSN(n)
Definition pg_lsn.h:36
static Datum LSNGetDatum(XLogRecPtr X)
Definition pg_lsn.h:31
static Datum Int64GetDatum(int64 X)
Definition postgres.h:413
static Datum Int16GetDatum(int16 X)
Definition postgres.h:172
static Datum BoolGetDatum(bool X)
Definition postgres.h:112
static Datum ObjectIdGetDatum(Oid X)
Definition postgres.h:252
uint64_t Datum
Definition postgres.h:70
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
static int fb(int x)
ForkNumber
Definition relpath.h:56
Definition pg_list.h:54
RelFileNumber relNumber
TupleDesc setDesc
Definition execnodes.h:375
Tuplestorestate * setResult
Definition execnodes.h:374
off_t filepos
Definition walsummary.h:24
void tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple)
Definition tuplestore.c:765
void GetWalSummarizerState(TimeLineID *summarized_tli, XLogRecPtr *summarized_lsn, XLogRecPtr *pending_lsn, int *summarizer_pid)
File OpenWalSummaryFile(WalSummaryFile *ws, bool missing_ok)
Definition walsummary.c:205
int ReadWalSummary(void *wal_summary_io, void *data, int length)
Definition walsummary.c:273
List * GetWalSummaries(TimeLineID tli, XLogRecPtr start_lsn, XLogRecPtr end_lsn)
Definition walsummary.c:43
void ReportWalSummaryError(void *callback_arg, char *fmt,...)
Definition walsummary.c:322
Datum pg_get_wal_summarizer_state(PG_FUNCTION_ARGS)
#define NUM_SUMMARY_ATTS
#define NUM_STATE_ATTS
Datum pg_available_wal_summaries(PG_FUNCTION_ARGS)
#define NUM_WS_ATTS
#define MAX_BLOCKS_PER_CALL
Datum pg_wal_summary_contents(PG_FUNCTION_ARGS)
uint64 XLogRecPtr
Definition xlogdefs.h:21
#define InvalidXLogRecPtr
Definition xlogdefs.h:28
uint32 TimeLineID
Definition xlogdefs.h:63