• Peter Geoghegan's avatar
    Handle parallel index builds on mapped relations. · 4974d7f8
    Peter Geoghegan authored
    Commit 9da0cc35, which introduced parallel CREATE INDEX, failed to
    propagate relmapper.c backend local cache state to parallel worker
    processes.  This could result in parallel index builds against mapped
    catalog relations where the leader process (participating as a worker)
    scans the new, pristine relfilenode, while worker processes scan the
    obsolescent relfilenode.  When this happened, the final index structure
    was typically not consistent with the owning table's structure.  The
    final index structure could contain entries formed from both heap
    relfilenodes.  Only rebuilds on mapped catalog relations that occur as
    part of a VACUUM FULL or CLUSTER could become corrupt in practice, since
    their mapped relation relfilenode swap is what allows the inconsistency
    to arise.
    
    On master, fix the problem by propagating the required relmapper.c
    backend state as part of standard parallel initialization (Cf. commit
    29d58fd3).  On v11, simply disallow builds against mapped catalog
    relations by deeming them parallel unsafe.
    
    Author: Peter Geoghegan
    Reported-By: "death lock"
    Reviewed-By: Tom Lane, Amit Kapila
    Bug: #15309
    Discussion: https://postgr.es/m/153329671686.1405.18298309097348420351@wrigleys.postgresql.org
    Backpatch: 11-, where parallel CREATE INDEX was introduced.
    4974d7f8
parallel.c 46.6 KB