PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
xlogstats.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * xlogstats.c
4 * Functions for WAL Statitstics
5 *
6 * Copyright (c) 2022-2025, PostgreSQL Global Development Group
7 *
8 * IDENTIFICATION
9 * src/backend/access/transam/xlogstats.c
10 *
11 *-------------------------------------------------------------------------
12 */
13#include "postgres.h"
14
15#include "access/xlogreader.h"
16#include "access/xlogstats.h"
17
18/*
19 * Calculate the size of a record, split into !FPI and FPI parts.
20 */
21void
23 uint32 *fpi_len)
24{
25 int block_id;
26
27 /*
28 * Calculate the amount of FPI data in the record.
29 *
30 * XXX: We peek into xlogreader's private decoded backup blocks for the
31 * bimg_len indicating the length of FPI data.
32 */
33 *fpi_len = 0;
34 for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
35 {
36 if (!XLogRecHasBlockRef(record, block_id))
37 continue;
38
39 if (XLogRecHasBlockImage(record, block_id))
40 *fpi_len += XLogRecGetBlock(record, block_id)->bimg_len;
41 }
42
43 /*
44 * Calculate the length of the record as the total length - the length of
45 * all the block images.
46 */
47 *rec_len = XLogRecGetTotalLen(record) - *fpi_len;
48}
49
50/*
51 * Store per-rmgr and per-record statistics for a given record.
52 */
53void
55{
56 RmgrId rmid;
57 uint8 recid;
58 uint32 rec_len;
59 uint32 fpi_len;
60
61 Assert(stats != NULL && record != NULL);
62
63 stats->count++;
64
65 rmid = XLogRecGetRmid(record);
66
67 XLogRecGetLen(record, &rec_len, &fpi_len);
68
69 /* Update per-rmgr statistics */
70
71 stats->rmgr_stats[rmid].count++;
72 stats->rmgr_stats[rmid].rec_len += rec_len;
73 stats->rmgr_stats[rmid].fpi_len += fpi_len;
74
75 /*
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).
80 */
81
82 recid = XLogRecGetInfo(record) >> 4;
83
84 /*
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.
89 */
90 if (rmid == RM_XACT_ID)
91 recid &= 0x07;
92
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;
96}
uint8_t uint8
Definition: c.h:483
#define Assert(condition)
Definition: c.h:812
uint32_t uint32
Definition: c.h:485
uint8 RmgrId
Definition: rmgr.h:11
uint64 count
Definition: xlogstats.h:23
uint64 fpi_len
Definition: xlogstats.h:25
uint64 rec_len
Definition: xlogstats.h:24
XLogRecStats record_stats[RM_MAX_ID+1][MAX_XLINFO_TYPES]
Definition: xlogstats.h:36
uint64 count
Definition: xlogstats.h:30
XLogRecStats rmgr_stats[RM_MAX_ID+1]
Definition: xlogstats.h:35
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:410
#define XLogRecGetRmid(decoder)
Definition: xlogreader.h:411
#define XLogRecGetTotalLen(decoder)
Definition: xlogreader.h:408
#define XLogRecGetBlock(decoder, i)
Definition: xlogreader.h:419
#define XLogRecMaxBlockId(decoder)
Definition: xlogreader.h:418
#define XLogRecHasBlockImage(decoder, block_id)
Definition: xlogreader.h:423
#define XLogRecHasBlockRef(decoder, block_id)
Definition: xlogreader.h:420
void XLogRecStoreStats(XLogStats *stats, XLogReaderState *record)
Definition: xlogstats.c:54
void XLogRecGetLen(XLogReaderState *record, uint32 *rec_len, uint32 *fpi_len)
Definition: xlogstats.c:22