diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c index e4d501a85d..c9f9e755dc 100644 --- a/contrib/amcheck/verify_nbtree.c +++ b/contrib/amcheck/verify_nbtree.c @@ -2864,11 +2864,8 @@ palloc_btree_page(BtreeCheckState *state, BlockNumber blocknum) * As noted at the beginning of _bt_binsrch(), an internal page must have * children, since there must always be a negative infinity downlink * (there may also be a highkey). In the case of non-rightmost leaf - * pages, there must be at least a highkey. Deleted pages on replica - * might contain no items, because page unlink re-initializes - * page-to-be-deleted. Deleted pages with no items might be on primary - * too due to preceding recovery, but on primary new deletions can't - * happen concurrently to amcheck. + * pages, there must be at least a highkey. The exceptions are deleted + * pages, which contain no items. * * This is correct when pages are half-dead, since internal pages are * never half-dead, and leaf pages must have a high key when half-dead diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 53dff32680..d5db9aaa3a 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -2058,6 +2058,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, BTMetaPageData *metad = NULL; ItemId itemid; Page page; + PageHeader header; BTPageOpaque opaque; bool rightsib_is_rightmost; int targetlevel; @@ -2327,6 +2328,14 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, BlockNumber scanblkno, opaque->btpo_flags |= BTP_DELETED; opaque->btpo.xact = ReadNewTransactionId(); + /* + * Remove the remaining tuples on the page. This keeps things simple for + * WAL consistency checking. + */ + header = (PageHeader) page; + header->pd_lower = SizeOfPageHeaderData; + header->pd_upper = header->pd_special; + /* And update the metapage, if needed */ if (BufferIsValid(metabuf)) { diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index 09d1b0e341..be0fa450f3 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -1051,15 +1051,7 @@ btree_mask(char *pagedata, BlockNumber blkno) 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)) + if (P_ISLEAF(maskopaq)) { /* * In btree leaf pages, it is possible to modify the LP_FLAGS without