PostgreSQL Source Code git master
Macros | Functions
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 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

 
 
 

Macro Definition Documentation

MAX_BLOCKS_PER_CALL

#define MAX_BLOCKS_PER_CALL   256

Definition at line 27 of file walsummaryfuncs.c.

NUM_STATE_ATTS

#define NUM_STATE_ATTS   4

Definition at line 26 of file walsummaryfuncs.c.

NUM_SUMMARY_ATTS

#define NUM_SUMMARY_ATTS   6

Definition at line 25 of file walsummaryfuncs.c.

NUM_WS_ATTS

#define NUM_WS_ATTS   3

Definition at line 24 of file walsummaryfuncs.c.

Function Documentation

pg_available_wal_summaries()

Datum pg_available_wal_summaries ( PG_FUNCTION_ARGS  )

Definition at line 33 of file walsummaryfuncs.c.

34{
35 ReturnSetInfo *rsi;
36 List *wslist;
37 ListCell *lc;
39 bool nulls[NUM_WS_ATTS];
40
41 InitMaterializedSRF(fcinfo, 0);
42 rsi = (ReturnSetInfo *) fcinfo->resultinfo;
43
44 memset(nulls, 0, sizeof(nulls));
45
47 foreach(lc, wslist)
48 {
50 HeapTuple tuple;
51
53
54 values[0] = Int64GetDatum((int64) ws->tli);
56 values[2] = LSNGetDatum(ws->end_lsn);
57
58 tuple = heap_form_tuple(rsi->setDesc, values, nulls);
59 tuplestore_puttuple(rsi->setResult, tuple);
60 }
61
62 return (Datum) 0;
63}
static Datum values[MAXATTR]
Definition: bootstrap.c:153
int64_t int64
Definition: c.h:535
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:1117
#define CHECK_FOR_INTERRUPTS()
Definition: miscadmin.h:122
#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:403
uint64_t Datum
Definition: postgres.h:70
Definition: pg_list.h:54
TupleDesc setDesc
Definition: execnodes.h:364
Tuplestorestate * setResult
Definition: execnodes.h:363
XLogRecPtr end_lsn
Definition: walsummary.h:30
TimeLineID tli
Definition: walsummary.h:31
XLogRecPtr start_lsn
Definition: walsummary.h:29
void tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple)
Definition: tuplestore.c:764
Definition: pg_list.h:46
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, WalSummaryFile::end_lsn, GetWalSummaries(), heap_form_tuple(), InitMaterializedSRF(), Int64GetDatum(), InvalidXLogRecPtr, lfirst, LSNGetDatum(), NUM_WS_ATTS, ReturnSetInfo::setDesc, ReturnSetInfo::setResult, WalSummaryFile::start_lsn, WalSummaryFile::tli, tuplestore_puttuple(), and values.

pg_get_wal_summarizer_state()

Datum pg_get_wal_summarizer_state ( PG_FUNCTION_ARGS  )

Definition at line 178 of file walsummaryfuncs.c.

179{
181 bool nulls[NUM_STATE_ATTS];
182 TimeLineID summarized_tli;
183 XLogRecPtr summarized_lsn;
184 XLogRecPtr pending_lsn;
185 int summarizer_pid;
186 TupleDesc tupdesc;
187 HeapTuple htup;
188
189 GetWalSummarizerState(&summarized_tli, &summarized_lsn, &pending_lsn,
190 &summarizer_pid);
191
192 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
193 elog(ERROR, "return type must be a row type");
194
195 memset(nulls, 0, sizeof(nulls));
196
197 values[0] = Int64GetDatum((int64) summarized_tli);
198 values[1] = LSNGetDatum(summarized_lsn);
199 values[2] = LSNGetDatum(pending_lsn);
200
201 if (summarizer_pid < 0)
202 nulls[3] = true;
203 else
204 values[3] = Int32GetDatum(summarizer_pid);
205
206 htup = heap_form_tuple(tupdesc, values, nulls);
207
209}
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:226
#define PG_RETURN_DATUM(x)
Definition: fmgr.h:353
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:222
void GetWalSummarizerState(TimeLineID *summarized_tli, XLogRecPtr *summarized_lsn, XLogRecPtr *pending_lsn, int *summarizer_pid)
Definition: walsummarizer.c:450
#define NUM_STATE_ATTS
uint64 XLogRecPtr
Definition: xlogdefs.h:21
uint32 TimeLineID
Definition: xlogdefs.h:62

References elog, ERROR, 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 70 of file walsummaryfuncs.c.

71{
72 ReturnSetInfo *rsi;
74 bool nulls[NUM_SUMMARY_ATTS];
76 WalSummaryIO io;
77 BlockRefTableReader *reader;
78 int64 raw_tli;
79 RelFileLocator rlocator;
80 ForkNumber forknum;
81 BlockNumber limit_block;
82
83 InitMaterializedSRF(fcinfo, 0);
84 rsi = (ReturnSetInfo *) fcinfo->resultinfo;
85 memset(nulls, 0, sizeof(nulls));
86
87 /*
88 * Since the timeline could at least in theory be more than 2^31, and
89 * since we don't have unsigned types at the SQL level, it is passed as a
90 * 64-bit integer. Test whether it's out of range.
91 */
92 raw_tli = PG_GETARG_INT64(0);
93 if (raw_tli < 1 || raw_tli > PG_INT32_MAX)
95 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
96 errmsg("invalid timeline %" PRId64, raw_tli));
97
98 /* Prepare to read the specified WAL summary file. */
99 ws.tli = (TimeLineID) raw_tli;
100 ws.start_lsn = PG_GETARG_LSN(1);
101 ws.end_lsn = PG_GETARG_LSN(2);
102 io.filepos = 0;
103 io.file = OpenWalSummaryFile(&ws, false);
105 FilePathName(io.file),
107
108 /* Loop over relation forks. */
109 while (BlockRefTableReaderNextRelation(reader, &rlocator, &forknum,
110 &limit_block))
111 {
113 HeapTuple tuple;
114
116
117 values[0] = ObjectIdGetDatum(rlocator.relNumber);
118 values[1] = ObjectIdGetDatum(rlocator.spcOid);
119 values[2] = ObjectIdGetDatum(rlocator.dbOid);
120 values[3] = Int16GetDatum((int16) forknum);
121
122 /*
123 * If the limit block is not InvalidBlockNumber, emit an extra row
124 * with that block number and limit_block = true.
125 *
126 * There is no point in doing this when the limit_block is
127 * InvalidBlockNumber, because no block with that number or any higher
128 * number can ever exist.
129 */
130 if (BlockNumberIsValid(limit_block))
131 {
132 values[4] = Int64GetDatum((int64) limit_block);
133 values[5] = BoolGetDatum(true);
134
135 tuple = heap_form_tuple(rsi->setDesc, values, nulls);
136 tuplestore_puttuple(rsi->setResult, tuple);
137 }
138
139 /* Loop over blocks within the current relation fork. */
140 while (1)
141 {
142 unsigned nblocks;
143 unsigned i;
144
146
147 nblocks = BlockRefTableReaderGetBlocks(reader, blocks,
149 if (nblocks == 0)
150 break;
151
152 /*
153 * For each block that we specifically know to have been modified,
154 * emit a row with that block number and limit_block = false.
155 */
156 values[5] = BoolGetDatum(false);
157 for (i = 0; i < nblocks; ++i)
158 {
159 values[4] = Int64GetDatum((int64) blocks[i]);
160
161 tuple = heap_form_tuple(rsi->setDesc, values, nulls);
162 tuplestore_puttuple(rsi->setResult, tuple);
163 }
164 }
165 }
166
167 /* Cleanup */
169 FileClose(io.file);
170
171 return (Datum) 0;
172}
bool BlockRefTableReaderNextRelation(BlockRefTableReader *reader, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *limit_block)
Definition: blkreftable.c:613
BlockRefTableReader * CreateBlockRefTableReader(io_callback_fn read_callback, void *read_callback_arg, char *error_filename, report_error_fn error_callback, void *error_callback_arg)
Definition: blkreftable.c:577
unsigned BlockRefTableReaderGetBlocks(BlockRefTableReader *reader, BlockNumber *blocks, int nblocks)
Definition: blkreftable.c:689
void DestroyBlockRefTableReader(BlockRefTableReader *reader)
Definition: blkreftable.c:773
uint32 BlockNumber
Definition: block.h:31
static bool BlockNumberIsValid(BlockNumber blockNumber)
Definition: block.h:71
#define PG_INT32_MAX
Definition: c.h:594
int16_t int16
Definition: c.h:533
int errcode(int sqlerrcode)
Definition: elog.c:854
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define ereport(elevel,...)
Definition: elog.h:150
char * FilePathName(File file)
Definition: fd.c:2513
void FileClose(File file)
Definition: fd.c:1979
#define PG_GETARG_INT64(n)
Definition: fmgr.h:283
i
int i
Definition: isn.c:77
#define PG_GETARG_LSN(n)
Definition: pg_lsn.h:36
static Datum Int16GetDatum(int16 X)
Definition: postgres.h:182
static Datum BoolGetDatum(bool X)
Definition: postgres.h:112
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:262
ForkNumber
Definition: relpath.h:56
RelFileNumber relNumber
Definition: relfilelocator.h:62
File file
Definition: walsummary.h:23
off_t filepos
Definition: walsummary.h:24
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(), WalSummaryFile::end_lsn, ereport, errcode(), errmsg(), ERROR, 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, WalSummaryFile::start_lsn, WalSummaryFile::tli, tuplestore_puttuple(), and values.

AltStyle によって変換されたページ (->オリジナル) /