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 <[email protected]>
Discussion: https://postgr.es/m/
20250329212929[email protected]
for (blkno = 0; blkno < nblocks; blkno++)
{
BulkWriteBuffer buf;
+ int piv_flags;
bool checksum_failure;
bool verified;
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;
{
BufferDesc *bufHdr;
Block bufBlock;
+ int piv_flags;
bool verified;
bool checksum_failure;
}
/* 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;
* 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)
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;
}
/* 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, \