• Robert Haas's avatar
    amcheck: fix multiple problems with TOAST pointer validation · ec7ffb80
    Robert Haas authored
    First, don't perform database access while holding a buffer lock.
    When checking a heap, we can validate that TOAST pointers are sane by
    performing a scan on the TOAST index and looking up the chunks that
    correspond to each value ID that appears in a TOAST poiner in the main
    table. But, to do that while holding a buffer lock at least risks
    causing other backends to wait uninterruptibly, and probably can cause
    undetected and uninterruptible deadlocks.  So, instead, make a list of
    checks to perform while holding the lock, and then perform the checks
    after releasing it.
    
    Second, adjust things so that we don't try to follow TOAST pointers
    for tuples that are already eligible to be pruned. The TOAST tuples
    become eligible for pruning at the same time that the main tuple does,
    so trying to check them may lead to spurious reports of corruption,
    as observed in the buildfarm. The necessary infrastructure to decide
    whether or not the tuple being checked is prunable was added by
    commit 3b6c1259, but it wasn't
    actually used for its intended purpose prior to this patch.
    
    Mark Dilger, adjusted by me to avoid a memory leak.
    
    Discussion: http://postgr.es/m/AC5479E4-6321-473D-AC92-5EC36299FBC2@enterprisedb.com
    ec7ffb80
verify_heapam.c 53.5 KB