• Andres Freund's avatar
    Improve relcache invalidation handling of currently invisible relations. · 31912d01
    Andres Freund authored
    The corner case where a relcache invalidation tried to rebuild the
    entry for a referenced relation but couldn't find it in the catalog
    wasn't correct.
    
    The code tried to RelationCacheDelete/RelationDestroyRelation the
    entry. That didn't work when assertions are enabled because the latter
    contains an assertion ensuring the refcount is zero. It's also more
    generally a bad idea, because by virtue of being referenced somebody
    might actually look at the entry, which is possible if the error is
    trapped and handled via a subtransaction abort.
    
    Instead just error out, without deleting the entry. As the entry is
    marked invalid, the worst that can happen is that the invalid (and at
    some point unused) entry lingers in the relcache.
    
    Discussion: 22459.1418656530@sss.pgh.pa.us
    
    There should be no way to hit this case < 9.4 where logical decoding
    introduced a bug that can hit this. But since the code for handling
    the corner case is there it should do something halfway sane, so
    backpatch all the the way back.  The logical decoding bug will be
    handled in a separate commit.
    31912d01
relcache.c 162 KB