• Andres Freund's avatar
    Fix and improve cache invalidation logic for logical decoding. · 89fd41b3
    Andres Freund authored
    There are basically three situations in which logical decoding needs
    to perform cache invalidation. During/After replaying a transaction
    with catalog changes, when skipping a uninteresting transaction that
    performed catalog changes and when erroring out while replaying a
    transaction. Unfortunately these three cases were all done slightly
    differently - partially because 8de3e410, which greatly simplifies
    matters, got committed in the midst of the development of logical
    decoding.
    
    The actually problematic case was when logical decoding skipped
    transaction commits (and thus processed invalidations). When used via
    the SQL interface cache invalidation could access the catalog - bad,
    because we didn't set up enough state to allow that correctly. It'd
    not be hard to setup sufficient state, but the simpler solution is to
    always perform cache invalidation outside a valid transaction.
    
    Also make the different cache invalidation cases look as similar as
    possible, to ease code review.
    
    This fixes the assertion failure reported by Antonin Houska in
    53EE02D9.7040702@gmail.com. The presented testcase has been expanded
    into a regression test.
    
    Backpatch to 9.4, where logical decoding was introduced.
    89fd41b3
Makefile 2.42 KB