• T
    Fix a problem introduced by my patch of 2010-01-12 that revised the way · 32616fb1
    Tom Lane 提交于
    relcache reload works.  In the patched code, a relcache entry in process of
    being rebuilt doesn't get unhooked from the relcache hash table; which means
    that if a cache flush occurs due to sinval queue overrun while we're
    rebuilding it, the entry could get blown away by RelationCacheInvalidate,
    resulting in crash or misbehavior.  Fix by ensuring that an entry being
    rebuilt has positive refcount, so it won't be seen as a target for removal
    if a cache flush occurs.  (This will mean that the entry gets rebuilt twice
    in such a scenario, but that's okay.)  It appears that the problem can only
    arise within a transaction that has previously reassigned the relfilenode of
    a pre-existing table, via TRUNCATE or a similar operation.  Per bug #5412
    from Rusty Conover.
    
    Back-patch to 8.2, same as the patch that introduced the problem.
    I think that the failure can't actually occur in 8.2, since it lacks the
    rd_newRelfilenodeSubid optimization, but let's make it work like the later
    branches anyway.
    
    Patch by Heikki, slightly editorialized on by me.
    32616fb1
relcache.c 122.9 KB