From 505f390da755bf83ec4005a726c213fc0a000b3f Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 28 Mar 2025 16:48:57 -0400 Subject: [PATCH v2.14 11/29] Let caller of PageIsVerified() control ignore_checksum_failure Author: Reviewed-by: Discussion: https://postgr.es/m/ Backpatch: --- src/include/storage/bufpage.h | 1 + src/backend/catalog/storage.c | 8 ++++++-- src/backend/storage/buffer/bufmgr.c | 7 ++++++- src/backend/storage/page/bufpage.c | 6 +++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h index 7dbdfc564ed..aeb67c498c5 100644 --- a/src/include/storage/bufpage.h +++ b/src/include/storage/bufpage.h @@ -468,6 +468,7 @@ do { \ /* flags for PageIsVerified() */ #define PIV_LOG_WARNING (1 << 0) #define PIV_LOG_LOG (1 << 1) +#define PIV_IGNORE_CHECKSUM_FAILURE (1 << 2) #define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap) \ PageAddItemExtended(page, item, size, offsetNumber, \ diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 2577f69cbde..57a5e43c881 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -508,6 +508,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst, for (blkno = 0; blkno < nblocks; blkno++) { BulkWriteBuffer buf; + int piv_flags; bool checksum_failure; bool verified; @@ -517,9 +518,12 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst, buf = smgr_bulk_get_buf(bulkstate); smgrread(src, forkNum, blkno, (Page) buf); - verified = PageIsVerified((Page) buf, blkno, PIV_LOG_WARNING, + piv_flags = PIV_LOG_WARNING; + if (ignore_checksum_failure) + piv_flags |= PIV_IGNORE_CHECKSUM_FAILURE; + + verified = PageIsVerified((Page) buf, blkno, piv_flags, &checksum_failure); - if (checksum_failure) { RelFileLocatorBackend rloc = src->smgr_rlocator; diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index ca89d9345f3..13c116d05d0 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1572,6 +1572,7 @@ WaitReadBuffers(ReadBuffersOperation *operation) { BufferDesc *bufHdr; Block bufBlock; + int piv_flags; bool verified; bool checksum_failure; @@ -1587,8 +1588,11 @@ WaitReadBuffers(ReadBuffersOperation *operation) } /* check for garbage data */ + piv_flags = PIV_LOG_WARNING; + if (ignore_checksum_failure) + piv_flags |= PIV_IGNORE_CHECKSUM_FAILURE; verified = PageIsVerified((Page) bufBlock, io_first_block + j, - PIV_LOG_WARNING, &checksum_failure); + piv_flags, &checksum_failure); if (checksum_failure) { RelFileLocatorBackend rloc = operation->smgr->smgr_rlocator; @@ -6485,6 +6489,7 @@ buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer, BufferTag tag = buf_hdr->tag; char *bufdata = BufferGetBlock(buffer); uint32 set_flag_bits; + int piv_flags; /* check that the buffer is in the expected state for a read */ #ifdef USE_ASSERT_CHECKING diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index 84c63b1590b..652746e1fa2 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -81,6 +81,10 @@ PageInit(Page page, Size pageSize, Size specialSize) * If flag PIV_LOG_WARNING/PIV_LOG_LOG is set, a WARNING/LOG message is logged * in the event of a checksum failure. * + * If flag PIV_IGNORE_CHECKSUM_FAILURE is set, checksum failures will cause a + * message about the failure to be emitted, but will not cause + * PageIsVerified() to return false. + * * To allow the caller to report statistics about checksum failures, * *checksum_failure_p can be passed in. Note that there may be checksum * failures even if this function returns true, due to @@ -150,7 +154,7 @@ PageIsVerified(PageData *page, BlockNumber blkno, int flags, bool *checksum_fail errmsg("page verification failed, calculated checksum %u but expected %u", checksum, p->pd_checksum))); - if (header_sane && ignore_checksum_failure) + if (header_sane && (flags & PIV_IGNORE_CHECKSUM_FAILURE)) return true; } -- 2.48.1.76.g4e746b1a31.dirty