• Tom Lane's avatar
    Fix potential corruption of lock table in CREATE/DROP INDEX CONCURRENTLY. · c00dc337
    Tom Lane authored
    If VirtualXactLock() has to wait for a transaction that holds its VXID lock
    as a fast-path lock, it must first convert the fast-path lock to a regular
    lock.  It failed to take the required "partition" lock on the main
    shared-memory lock table while doing so.  This is the direct cause of the
    assert failure in GetLockStatusData() recently observed in the buildfarm,
    but more worryingly it could result in arbitrary corruption of the shared
    lock table if some other process were concurrently engaged in modifying the
    same partition of the lock table.  Fortunately, VirtualXactLock() is only
    used by CREATE INDEX CONCURRENTLY and DROP INDEX CONCURRENTLY, so the
    opportunities for failure are fewer than they might have been.
    
    In passing, improve some comments and be a bit more consistent about
    order of operations.
    c00dc337
lock.c 117 KB