• Michael Paquier's avatar
    Add CheckBuffer() to check on-disk pages without shared buffer loading · c780a7a9
    Michael Paquier authored
    CheckBuffer() is designed to be a concurrent-safe function able to run
    sanity checks on a relation page without loading it into the shared
    buffers.  The operation is done using a lock on the partition involved
    in the shared buffer mapping hashtable and an I/O lock for the buffer
    itself, preventing the risk of false positives due to any concurrent
    activity.
    
    The primary use of this function is the detection of on-disk corruptions
    for relation pages.  If a page is found in shared buffers, the on-disk
    page is checked if not dirty (a follow-up checkpoint would flush a valid
    version of the page if dirty anyway), as it could be possible that a
    page was present for a long time in shared buffers with its on-disk
    version corrupted.  Such a scenario could lead to a corrupted cluster if
    a host is plugged off for example.  If the page is not found in shared
    buffers, its on-disk state is checked.  PageIsVerifiedExtended() is used
    to apply the same sanity checks as when a page gets loaded into shared
    buffers.
    
    This function will be used by an upcoming patch able to check the state
    of on-disk relation pages using a SQL function.
    
    Author: Julien Rouhaud, Michael Paquier
    Reviewed-by:  Masahiko Sawada
    Discussion: https://postgr.es/m/CAOBaU_aVvMjQn=ge5qPiJOPMmOj5=ii3st5Q0Y+WuLML5sR17w@mail.gmail.com
    c780a7a9
bufmgr.c 133 KB