• Peter Geoghegan's avatar
    Add nbtree Valgrind buffer lock checks. · 4a70f829
    Peter Geoghegan authored
    Holding just a buffer pin (with no buffer lock) on an nbtree buffer/page
    provides very weak guarantees, especially compared to heapam, where it's
    often safe to read a page while only holding a buffer pin.  This commit
    has Valgrind enforce the following rule: it is never okay to access an
    nbtree buffer without holding both a pin and a lock on the buffer.
    
    A draft version of this patch detected questionable code that was
    cleaned up by commits fa7ff642 and 7154aa16.  The code in question used
    to access an nbtree buffer page's special/opaque area with no buffer
    lock (only a buffer pin).  This practice (which isn't obviously unsafe)
    is hereby formally disallowed in nbtree.  There doesn't seem to be any
    reason to allow it, and banning it keeps things simple for Valgrind.
    
    The new checks are implemented by adding custom nbtree client requests
    (located in LockBuffer() wrapper functions); these requests are
    "superimposed" on top of the generic bufmgr.c Valgrind client requests
    added by commit 1e0dfd16.  No custom resource management cleanup code is
    needed to undo the effects of marking buffers as non-accessible under
    this scheme.
    
    Author: Peter Geoghegan
    Reviewed-By: Anastasia Lubennikova, Georgios Kokolatos
    Discussion: https://postgr.es/m/CAH2-WzkLgyN3zBvRZ1pkNJThC=xi_0gpWRUb_45eexLH1+k2_Q@mail.gmail.com
    4a70f829
nbtsearch.c 74.8 KB