• Tom Lane's avatar
    Fix incorrect order of operations during sinval reset processing. · f4d7f1ad
    Tom Lane authored
    We have to be sure that we have revalidated each nailed-in-cache relcache
    entry before we try to use it to load data for some other relcache entry.
    The introduction of "mapped relations" in 9.0 broke this, because although
    we updated the state kept in relmapper.c early enough, we failed to
    propagate that information into relcache entries soon enough; in
    particular, we could try to fetch pg_class rows out of pg_class before
    we'd updated its relcache entry's rd_node.relNode value from the map.
    
    This bug accounts for Dave Gould's report of failures after "vacuum full
    pg_class", and I believe that there is risk for other system catalogs
    as well.
    
    The core part of the fix is to copy relmapper data into the relcache
    entries during "phase 1" in RelationCacheInvalidate(), before they'll be
    used in "phase 2".  To try to future-proof the code against other similar
    bugs, I also rearranged the order in which nailed relations are visited
    during phase 2: now it's pg_class first, then pg_class_oid_index, then
    other nailed relations.  This should ensure that RelationClearRelation can
    apply RelationReloadIndexInfo to all nailed indexes without risking use
    of not-yet-revalidated relcache entries.
    
    Back-patch to 9.0 where the relation mapper was introduced.
    f4d7f1ad
relcache.c 140 KB