PostgreSQL Source Code git master
Loading...
Searching...
No Matches
bufmask.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * bufmask.c
4 * Routines for buffer masking. Used to mask certain bits
5 * in a page which can be different when the WAL is generated
6 * and when the WAL is applied.
7 *
8 * Portions Copyright (c) 2016-2026, PostgreSQL Global Development Group
9 *
10 * Contains common routines required for masking a page.
11 *
12 * IDENTIFICATION
13 * src/backend/access/common/bufmask.c
14 *
15 *-------------------------------------------------------------------------
16 */
17
18#include "postgres.h"
19
20#include "access/bufmask.h"
21
22/*
23 * mask_page_lsn_and_checksum
24 *
25 * In consistency checks, the LSN of the two pages compared will likely be
26 * different because of concurrent operations when the WAL is generated and
27 * the state of the page when WAL is applied. Also, mask out checksum as
28 * masking anything else on page means checksum is not going to match as well.
29 */
30void
38
39/*
40 * mask_page_hint_bits
41 *
42 * Mask hint bits in PageHeader. We want to ignore differences in hint bits,
43 * since they can be set without emitting any WAL.
44 */
45void
47{
48 PageHeader phdr = (PageHeader) page;
49
50 /* Ignore prune_xid (it's like a hint-bit) */
52
53 /* Ignore PD_PAGE_FULL and PD_HAS_FREE_LINES flags, they are just hints. */
54 PageClearFull(page);
56
57 /*
58 * PD_ALL_VISIBLE is masked during WAL consistency checking. XXX: It is
59 * worth investigating if we could stop doing this.
60 */
62}
63
64/*
65 * mask_unused_space
66 *
67 * Mask the unused space of a page between pd_lower and pd_upper.
68 */
69void
71{
72 int pd_lower = ((PageHeader) page)->pd_lower;
73 int pd_upper = ((PageHeader) page)->pd_upper;
74 int pd_special = ((PageHeader) page)->pd_special;
75
76 /* Sanity check */
77 if (pd_lower > pd_upper || pd_special < pd_upper ||
79 {
80 elog(ERROR, "invalid page pd_lower %u pd_upper %u pd_special %u",
81 pd_lower, pd_upper, pd_special);
82 }
83
84 memset(page + pd_lower, MASK_MARKER, pd_upper - pd_lower);
85}
86
87/*
88 * mask_lp_flags
89 *
90 * In some index AMs, line pointer flags can be modified on the primary
91 * without emitting any WAL record.
92 */
93void
95{
96 OffsetNumber offnum,
97 maxoff;
98
99 maxoff = PageGetMaxOffsetNumber(page);
100 for (offnum = FirstOffsetNumber;
101 offnum <= maxoff;
102 offnum = OffsetNumberNext(offnum))
103 {
104 ItemId itemId = PageGetItemId(page, offnum);
105
106 if (ItemIdIsUsed(itemId))
107 itemId->lp_flags = LP_UNUSED;
108 }
109}
110
111/*
112 * mask_page_content
113 *
114 * In some index AMs, the contents of deleted pages need to be almost
115 * completely ignored.
116 */
117void
119{
120 /* Mask Page Content */
123
124 /* Mask pd_lower and pd_upper */
125 memset(&((PageHeader) page)->pd_lower, MASK_MARKER,
126 sizeof(uint16));
127 memset(&((PageHeader) page)->pd_upper, MASK_MARKER,
128 sizeof(uint16));
129}
void mask_lp_flags(Page page)
Definition bufmask.c:94
void mask_page_content(Page page)
Definition bufmask.c:118
void mask_page_lsn_and_checksum(Page page)
Definition bufmask.c:31
void mask_unused_space(Page page)
Definition bufmask.c:70
void mask_page_hint_bits(Page page)
Definition bufmask.c:46
#define MASK_MARKER
Definition bufmask.h:24
PageHeaderData * PageHeader
Definition bufpage.h:199
static void PageXLogRecPtrSet(volatile PageXLogRecPtr *ptr, XLogRecPtr lsn)
Definition bufpage.h:131
static void PageClearAllVisible(Page page)
Definition bufpage.h:464
static void PageClearFull(Page page)
Definition bufpage.h:448
#define SizeOfPageHeaderData
Definition bufpage.h:241
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
Definition bufpage.h:268
static void PageClearHasFreeLinePointers(Page page)
Definition bufpage.h:432
PageData * Page
Definition bufpage.h:81
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
Definition bufpage.h:396
uint64_t uint64
Definition c.h:625
uint16_t uint16
Definition c.h:623
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
#define LP_UNUSED
Definition itemid.h:38
#define ItemIdIsUsed(itemId)
Definition itemid.h:92
#define OffsetNumberNext(offsetNumber)
Definition off.h:52
uint16 OffsetNumber
Definition off.h:24
#define FirstOffsetNumber
Definition off.h:27
static int fb(int x)
PageXLogRecPtr pd_lsn
Definition bufpage.h:187
uint16 pd_checksum
Definition bufpage.h:189
TransactionId pd_prune_xid
Definition bufpage.h:195