/* * 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 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 hash page before performing consistency checks on it. */ void hash_mask(char *pagedata, BlockNumber blkno) { Page page = (Page) pagedata; HashPageOpaque opaque; mask_page_lsn(page); mask_page_hint_bits(page); mask_unused_space(page); opaque = (HashPageOpaque) PageGetSpecialPointer(page); if (opaque->hasho_flag & LH_UNUSED_PAGE) { /* * Mask everything on a UNUSED page. */ mask_page_content(page); } else if ((opaque->hasho_flag & LH_BUCKET_PAGE) || (opaque->hasho_flag & LH_OVERFLOW_PAGE)) { /* * In hash bucket and overflow pages, it is possible to modify the * LP_FLAGS without emitting any WAL record. Hence, mask the line * pointer flags. See hashgettuple(), _hash_kill_items() for details. */ mask_lp_flags(page); } /* * It is possible that the hint bit LH_PAGE_HAS_DEAD_TUPLES may remain * unlogged. So, mask it. See _hash_kill_items() for details. */ opaque->hasho_flag &= ~LH_PAGE_HAS_DEAD_TUPLES; }