PostgreSQL Source Code git master
Loading...
Searching...
No Matches
walsummaryfuncs.c File Reference
#include "postgres.h"
#include "access/htup_details.h"
#include "backup/walsummary.h"
#include "common/blkreftable.h"
#include "funcapi.h"
#include "miscadmin.h"
#include "postmaster/walsummarizer.h"
#include "utils/fmgrprotos.h"
#include "utils/pg_lsn.h"
#include "utils/tuplestore.h"
Include dependency graph for walsummaryfuncs.c:

Go to the source code of this file.

Macros

#define NUM_WS_ATTS   3
 
#define NUM_SUMMARY_ATTS   6
 
#define NUM_STATE_ATTS   4
 
#define MAX_BLOCKS_PER_CALL   256
 

Functions

Datum pg_available_wal_summaries (PG_FUNCTION_ARGS)
 
Datum pg_wal_summary_contents (PG_FUNCTION_ARGS)
 
Datum pg_get_wal_summarizer_state (PG_FUNCTION_ARGS)
 

Macro Definition Documentation

◆ MAX_BLOCKS_PER_CALL

#define MAX_BLOCKS_PER_CALL   256

Definition at line 28 of file walsummaryfuncs.c.

◆ NUM_STATE_ATTS

#define NUM_STATE_ATTS   4

Definition at line 27 of file walsummaryfuncs.c.

◆ NUM_SUMMARY_ATTS

#define NUM_SUMMARY_ATTS   6

Definition at line 26 of file walsummaryfuncs.c.

◆ NUM_WS_ATTS

#define NUM_WS_ATTS   3

Definition at line 25 of file walsummaryfuncs.c.

Function Documentation

◆ pg_available_wal_summaries()

Datum pg_available_wal_summaries ( PG_FUNCTION_ARGS  )

Definition at line 34 of file walsummaryfuncs.c.

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}
static Datum values[MAXATTR]
Definition bootstrap.c:188
int64_t int64
Definition c.h:615
void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
Definition funcapi.c:76
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
Definition heaptuple.c:1037
#define CHECK_FOR_INTERRUPTS()
Definition miscadmin.h:123
#define lfirst(lc)
Definition pg_list.h:172
static Datum LSNGetDatum(XLogRecPtr X)
Definition pg_lsn.h:31
static Datum Int64GetDatum(int64 X)
Definition postgres.h:413
uint64_t Datum
Definition postgres.h:70
static int fb(int x)
Definition pg_list.h:54
void tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple)
Definition tuplestore.c:765
List * GetWalSummaries(TimeLineID tli, XLogRecPtr start_lsn, XLogRecPtr end_lsn)
Definition walsummary.c:43
#define NUM_WS_ATTS
#define InvalidXLogRecPtr
Definition xlogdefs.h:28

References CHECK_FOR_INTERRUPTS, fb(), GetWalSummaries(), heap_form_tuple(), InitMaterializedSRF(), Int64GetDatum(), InvalidXLogRecPtr, lfirst, LSNGetDatum(), NUM_WS_ATTS, ReturnSetInfo::setDesc, ReturnSetInfo::setResult, tuplestore_puttuple(), and values.

◆ pg_get_wal_summarizer_state()

Datum pg_get_wal_summarizer_state ( PG_FUNCTION_ARGS  )

Definition at line 179 of file walsummaryfuncs.c.

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}
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
#define PG_RETURN_DATUM(x)
Definition fmgr.h:354
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
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
void GetWalSummarizerState(TimeLineID *summarized_tli, XLogRecPtr *summarized_lsn, XLogRecPtr *pending_lsn, int *summarizer_pid)
#define NUM_STATE_ATTS
uint64 XLogRecPtr
Definition xlogdefs.h:21
uint32 TimeLineID
Definition xlogdefs.h:63

References elog, ERROR, fb(), get_call_result_type(), GetWalSummarizerState(), heap_form_tuple(), HeapTupleGetDatum(), Int32GetDatum(), Int64GetDatum(), LSNGetDatum(), NUM_STATE_ATTS, PG_RETURN_DATUM, TYPEFUNC_COMPOSITE, and values.

◆ pg_wal_summary_contents()

Datum pg_wal_summary_contents ( PG_FUNCTION_ARGS  )

Definition at line 71 of file walsummaryfuncs.c.

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}
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
#define PG_INT32_MAX
Definition c.h:675
int16_t int16
Definition c.h:613
int errcode(int sqlerrcode)
Definition elog.c:874
#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
int i
Definition isn.c:77
static char * errmsg
#define PG_GETARG_LSN(n)
Definition pg_lsn.h:36
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
ForkNumber
Definition relpath.h:56
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
void ReportWalSummaryError(void *callback_arg, char *fmt,...)
Definition walsummary.c:322
#define NUM_SUMMARY_ATTS
#define MAX_BLOCKS_PER_CALL

References BlockNumberIsValid(), BlockRefTableReaderGetBlocks(), BlockRefTableReaderNextRelation(), BoolGetDatum(), CHECK_FOR_INTERRUPTS, CreateBlockRefTableReader(), RelFileLocator::dbOid, DestroyBlockRefTableReader(), ereport, errcode(), errmsg, ERROR, fb(), WalSummaryIO::file, FileClose(), FilePathName(), WalSummaryIO::filepos, heap_form_tuple(), i, InitMaterializedSRF(), Int16GetDatum(), Int64GetDatum(), MAX_BLOCKS_PER_CALL, NUM_SUMMARY_ATTS, ObjectIdGetDatum(), OpenWalSummaryFile(), PG_GETARG_INT64, PG_GETARG_LSN, PG_INT32_MAX, ReadWalSummary(), RelFileLocator::relNumber, ReportWalSummaryError(), ReturnSetInfo::setDesc, ReturnSetInfo::setResult, RelFileLocator::spcOid, tuplestore_puttuple(), and values.