/* * Mask a GIN page before running consistency checks on it. */ void gin_mask(char *pagedata, BlockNumber blkno) { Page page = (Page) pagedata; GinPageOpaque opaque; mask_page_lsn_and_checksum(page); opaque = GinPageGetOpaque(page); mask_page_hint_bits(page); /* * GIN metapage doesn't use pd_lower/pd_upper. Other page types do. Hence, * we need to apply masking for those pages. */ if (opaque->flags != GIN_META) { /* * For GIN_DELETED page, the page is initialized to empty. Hence, mask * the page content. */ if (opaque->flags & GIN_DELETED) mask_page_content(page); else mask_unused_space(page); } }
/* * Mask a generic page before performing consistency checks on it. */ void generic_mask(char *page, BlockNumber blkno) { mask_page_lsn_and_checksum(page); mask_unused_space(page); }
/* * Mask a SpGist page before performing consistency checks on it. */ void spg_mask(char *pagedata, BlockNumber blkno) { Page page = (Page) pagedata; mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); /* * Any SpGist page other than meta contains unused space which needs to be * masked. */ if (!SpGistPageIsMeta(page)) mask_unused_space(page); }
/* * Mask a btree page before performing consistency checks on it. */ void btree_mask(char *pagedata, BlockNumber blkno) { Page page = (Page) pagedata; BTPageOpaque maskopaq; mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); mask_unused_space(page); maskopaq = (BTPageOpaque) PageGetSpecialPointer(page); if (P_ISDELETED(maskopaq)) { /* * Mask page content on a DELETED page since it will be re-initialized * during replay. See btree_xlog_unlink_page() for details. */ mask_page_content(page); } else if (P_ISLEAF(maskopaq)) { /* * In btree leaf pages, it is possible to modify the LP_FLAGS without * emitting any WAL record. Hence, mask the line pointer flags. See * _bt_killitems(), _bt_check_unique() for details. */ mask_lp_flags(page); } /* * BTP_HAS_GARBAGE is just an un-logged hint bit. So, mask it. See * _bt_killitems(), _bt_check_unique() for details. */ maskopaq->btpo_flags &= ~BTP_HAS_GARBAGE; /* * During replay of a btree page split, we don't set the BTP_SPLIT_END * flag of the right sibling and initialize the cycle_id to 0 for the same * page. See btree_xlog_split() for details. */ maskopaq->btpo_flags &= ~BTP_SPLIT_END; maskopaq->btpo_cycleid = 0; }
/* * Mask a BRIN page before doing consistency checks. */ void brin_mask(char *pagedata, BlockNumber blkno) { Page page = (Page) pagedata; PageHeader pagehdr = (PageHeader) page; mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); /* * Regular brin pages contain unused space which needs to be masked. * Similarly for meta pages, but mask it only if pd_lower appears to have * been set correctly. */ if (BRIN_IS_REGULAR_PAGE(page) || (BRIN_IS_META_PAGE(page) && pagehdr->pd_lower > SizeOfPageHeaderData)) { mask_unused_space(page); } }
/* * Mask a Gist page before running consistency checks on it. */ void gist_mask(char *pagedata, BlockNumber blkno) { Page page = (Page) pagedata; mask_page_lsn_and_checksum(page); mask_page_hint_bits(page); mask_unused_space(page); /* * NSN is nothing but a special purpose LSN. Hence, mask it for the same * reason as mask_page_lsn_and_checksum. */ GistPageSetNSN(page, (uint64) MASK_MARKER); /* * We update F_FOLLOW_RIGHT flag on the left child after writing WAL * record. Hence, mask this flag. See gistplacetopage() for details. */ GistMarkFollowRight(page); if (GistPageIsLeaf(page)) { /* * In gist leaf pages, it is possible to modify the LP_FLAGS without * emitting any WAL record. Hence, mask the line pointer flags. See * gistkillitems() for details. */ mask_lp_flags(page); } /* * During gist redo, we never mark a page as garbage. Hence, mask it to * ignore any differences. */ GistClearPageHasGarbage(page); }