1 /*-------------------------------------------------------------------------
4 * Functions for WAL Statitstics
6 * Copyright (c) 2022-2025, PostgreSQL Global Development Group
9 * src/backend/access/transam/xlogstats.c
11 *-------------------------------------------------------------------------
15 #include "access/xlogreader.h"
16 #include "access/xlogstats.h"
19 * Calculate the size of a record, split into !FPI and FPI parts.
22 XLogRecGetLen(XLogReaderState
*record
, uint32
*rec_len
,
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.
34 for (block_id
= 0; block_id
<= XLogRecMaxBlockId(record
); block_id
++)
36 if (!XLogRecHasBlockRef(record
, block_id
))
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.
54 XLogRecStoreStats(XLogStats
*stats
, XLogReaderState
*record
)
61 Assert(stats
!= NULL
&& record
!= NULL
);
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
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
)
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
;