Rename pubgencols_type to pubgencols in pg_publication.
[pgsql.git] / src / backend / access / transam / xlogstats.c
blobf92d9e13b174e313d8b7a043abc6286289406a18
1 /*-------------------------------------------------------------------------
3 * xlogstats.c
4 * Functions for WAL Statitstics
6 * Copyright (c) 2022-2025, PostgreSQL Global Development Group
8 * IDENTIFICATION
9 * src/backend/access/transam/xlogstats.c
11 *-------------------------------------------------------------------------
13 #include "postgres.h"
15 #include "access/xlogreader.h"
16 #include "access/xlogstats.h"
19 * Calculate the size of a record, split into !FPI and FPI parts.
21 void
22 XLogRecGetLen(XLogReaderState *record, uint32 *rec_len,
23 uint32 *fpi_len)
25 int block_id;
28 * Calculate the amount of FPI data in the record.
30 * XXX: We peek into xlogreader's private decoded backup blocks for the
31 * bimg_len indicating the length of FPI data.
33 *fpi_len = 0;
34 for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
36 if (!XLogRecHasBlockRef(record, block_id))
37 continue;
39 if (XLogRecHasBlockImage(record, block_id))
40 *fpi_len += XLogRecGetBlock(record, block_id)->bimg_len;
44 * Calculate the length of the record as the total length - the length of
45 * all the block images.
47 *rec_len = XLogRecGetTotalLen(record) - *fpi_len;
51 * Store per-rmgr and per-record statistics for a given record.
53 void
54 XLogRecStoreStats(XLogStats *stats, XLogReaderState *record)
56 RmgrId rmid;
57 uint8 recid;
58 uint32 rec_len;
59 uint32 fpi_len;
61 Assert(stats != NULL && record != NULL);
63 stats->count++;
65 rmid = XLogRecGetRmid(record);
67 XLogRecGetLen(record, &rec_len, &fpi_len);
69 /* Update per-rmgr statistics */
71 stats->rmgr_stats[rmid].count++;
72 stats->rmgr_stats[rmid].rec_len += rec_len;
73 stats->rmgr_stats[rmid].fpi_len += fpi_len;
76 * Update per-record statistics, where the record is identified by a
77 * combination of the RmgrId and the four bits of the xl_info field that
78 * are the rmgr's domain (resulting in sixteen possible entries per
79 * RmgrId).
82 recid = XLogRecGetInfo(record) >> 4;
85 * XACT records need to be handled differently. Those records use the
86 * first bit of those four bits for an optional flag variable and the
87 * following three bits for the opcode. We filter opcode out of xl_info
88 * and use it as the identifier of the record.
90 if (rmid == RM_XACT_ID)
91 recid &= 0x07;
93 stats->record_stats[rmid][recid].count++;
94 stats->record_stats[rmid][recid].rec_len += rec_len;
95 stats->record_stats[rmid][recid].fpi_len += fpi_len;