diff options
author | Andres Freund <andres@anarazel.de> | 2025-03-30 16:10:51 -0400 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2025-03-30 16:27:10 -0400 |
commit | d445990adc419f435360f0dcd91c05c082f5fa3f (patch) | |
tree | 9493349a1b20d78e495e277068a8d820188448ad /src | |
parent | b96d3c389755fc5d20f4a5b9ded58b68541b8ba3 (diff) | |
download | postgresql-d445990adc419f435360f0dcd91c05c082f5fa3f.tar.gz postgresql-d445990adc419f435360f0dcd91c05c082f5fa3f.zip |
Let caller of PageIsVerified() control ignore_checksum_failure
For AIO the completion of a read into shared buffers (i.e. verifying the page
including the checksum, updating the BufferDesc to reflect the IO) can happen
in a different backend than the backend that started the IO. As
ignore_checksum_failure can differ between backends, we need to allow the
caller of PageIsVerified() control whether to ignore checksum failures.
The commit leaves a gap in the PIV_* values, as an upcoming commit, which
depends on this commit, will add PIV_LOG_LOG, which better fits just after
PIV_LOG_WARNING.
Reviewed-by: Noah Misch <noah@leadboat.com>
Discussion: https://postgr.es/m/20250329212929.a6.nmisch@google.com
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/storage.c | 7 | ||||
-rw-r--r-- | src/backend/storage/buffer/bufmgr.c | 6 | ||||
-rw-r--r-- | src/backend/storage/page/bufpage.c | 8 | ||||
-rw-r--r-- | src/include/storage/bufpage.h | 1 |
4 files changed, 17 insertions, 5 deletions
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 2577f69cbde..227df90f89c 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,11 @@ 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 16b5b69efda..3b66c5c6b4c 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1569,6 +1569,7 @@ WaitReadBuffers(ReadBuffersOperation *operation) { BufferDesc *bufHdr; Block bufBlock; + int piv_flags; bool verified; bool checksum_failure; @@ -1584,8 +1585,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; diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index 5d1b039fcbb..0afeab5140c 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -81,10 +81,14 @@ PageInit(Page page, Size pageSize, Size specialSize) * If flag PIV_LOG_WARNING is set, a WARNING 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 - * ignore_checksum_failure. + * IGNORE_CHECKSUM_FAILURE. */ bool PageIsVerified(PageData *page, BlockNumber blkno, int flags, bool *checksum_failure_p) @@ -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; } diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h index b943db707db..26d0a551fc9 100644 --- a/src/include/storage/bufpage.h +++ b/src/include/storage/bufpage.h @@ -467,6 +467,7 @@ do { \ /* flags for PageIsVerified() */ #define PIV_LOG_WARNING (1 << 0) +#define PIV_IGNORE_CHECKSUM_FAILURE (1 << 2) #define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap) \ PageAddItemExtended(page, item, size, offsetNumber, \ |