mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
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
This commit is contained in:
@ -508,6 +508,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
|
|||||||
for (blkno = 0; blkno < nblocks; blkno++)
|
for (blkno = 0; blkno < nblocks; blkno++)
|
||||||
{
|
{
|
||||||
BulkWriteBuffer buf;
|
BulkWriteBuffer buf;
|
||||||
|
int piv_flags;
|
||||||
bool checksum_failure;
|
bool checksum_failure;
|
||||||
bool verified;
|
bool verified;
|
||||||
|
|
||||||
@ -517,9 +518,11 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
|
|||||||
buf = smgr_bulk_get_buf(bulkstate);
|
buf = smgr_bulk_get_buf(bulkstate);
|
||||||
smgrread(src, forkNum, blkno, (Page) buf);
|
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);
|
&checksum_failure);
|
||||||
|
|
||||||
if (checksum_failure)
|
if (checksum_failure)
|
||||||
{
|
{
|
||||||
RelFileLocatorBackend rloc = src->smgr_rlocator;
|
RelFileLocatorBackend rloc = src->smgr_rlocator;
|
||||||
|
@ -1569,6 +1569,7 @@ WaitReadBuffers(ReadBuffersOperation *operation)
|
|||||||
{
|
{
|
||||||
BufferDesc *bufHdr;
|
BufferDesc *bufHdr;
|
||||||
Block bufBlock;
|
Block bufBlock;
|
||||||
|
int piv_flags;
|
||||||
bool verified;
|
bool verified;
|
||||||
bool checksum_failure;
|
bool checksum_failure;
|
||||||
|
|
||||||
@ -1584,8 +1585,11 @@ WaitReadBuffers(ReadBuffersOperation *operation)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check for garbage data */
|
/* 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,
|
verified = PageIsVerified((Page) bufBlock, io_first_block + j,
|
||||||
PIV_LOG_WARNING, &checksum_failure);
|
piv_flags, &checksum_failure);
|
||||||
if (checksum_failure)
|
if (checksum_failure)
|
||||||
{
|
{
|
||||||
RelFileLocatorBackend rloc = operation->smgr->smgr_rlocator;
|
RelFileLocatorBackend rloc = operation->smgr->smgr_rlocator;
|
||||||
|
@ -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
|
* If flag PIV_LOG_WARNING is set, a WARNING is logged in the event of
|
||||||
* a checksum failure.
|
* 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,
|
* To allow the caller to report statistics about checksum failures,
|
||||||
* *checksum_failure_p can be passed in. Note that there may be checksum
|
* *checksum_failure_p can be passed in. Note that there may be checksum
|
||||||
* failures even if this function returns true, due to
|
* failures even if this function returns true, due to
|
||||||
* ignore_checksum_failure.
|
* IGNORE_CHECKSUM_FAILURE.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
PageIsVerified(PageData *page, BlockNumber blkno, int flags, bool *checksum_failure_p)
|
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",
|
errmsg("page verification failed, calculated checksum %u but expected %u",
|
||||||
checksum, p->pd_checksum)));
|
checksum, p->pd_checksum)));
|
||||||
|
|
||||||
if (header_sane && ignore_checksum_failure)
|
if (header_sane && (flags & PIV_IGNORE_CHECKSUM_FAILURE))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -467,6 +467,7 @@ do { \
|
|||||||
|
|
||||||
/* flags for PageIsVerified() */
|
/* flags for PageIsVerified() */
|
||||||
#define PIV_LOG_WARNING (1 << 0)
|
#define PIV_LOG_WARNING (1 << 0)
|
||||||
|
#define PIV_IGNORE_CHECKSUM_FAILURE (1 << 2)
|
||||||
|
|
||||||
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap) \
|
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap) \
|
||||||
PageAddItemExtended(page, item, size, offsetNumber, \
|
PageAddItemExtended(page, item, size, offsetNumber, \
|
||||||
|
Reference in New Issue
Block a user