• Andres Freund's avatar
    Fix temporary object cleanup failing due to toast access without snapshot. · 7bbfe599
    Andres Freund authored
    When cleaning up temporary objects during process exit the cleanup could fail
    with:
      FATAL: cannot fetch toast data without an active snapshot
    
    The bug is caused by RemoveTempRelationsCallback() not setting up a
    snapshot. If an object with toasted catalog data needs to be cleaned up,
    init_toast_snapshot() could fail with the above error.
    
    Most of the time however the the problem is masked due to cached catalog
    snapshots being returned by GetOldestSnapshot(). But dropping an object can
    cause catalog invalidations to be emitted. If no further catalog accesses are
    necessary between the invalidation processing and the next toast datum
    deletion, the bug becomes visible.
    
    It's easy to miss this bug because it typically happens after clients
    disconnect and the FATAL error just ends up in the log.
    
    Luckily temporary table cleanup at the next use of the same temporary schema
    or during DISCARD ALL does not have the same problem.
    
    Fix the bug by pushing a snapshot in RemoveTempRelationsCallback(). Also add
    isolation tests for temporary object cleanup, including objects with toasted
    catalog data.
    
    A future HEAD only commit will add more assertions.
    
    Reported-By: Miles Delahunty
    Author: Andres Freund
    Discussion: https://postgr.es/m/CAOFAq3BU5Mf2TTvu8D9n_ZOoFAeQswuzk7yziAb7xuw_qyw5gw@mail.gmail.com
    Backpatch: 10-
    7bbfe599
namespace.c 129 KB