aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2025-03-30 16:10:51 -0400
committerAndres Freund <andres@anarazel.de>2025-03-30 16:27:10 -0400
commitd445990adc419f435360f0dcd91c05c082f5fa3f (patch)
tree9493349a1b20d78e495e277068a8d820188448ad /src
parentb96d3c389755fc5d20f4a5b9ded58b68541b8ba3 (diff)
downloadpostgresql-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.c7
-rw-r--r--src/backend/storage/buffer/bufmgr.c6
-rw-r--r--src/backend/storage/page/bufpage.c8
-rw-r--r--src/include/storage/bufpage.h1
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, \