• Tom Lane's avatar
    Fix dynahash.c to suppress hash bucket splits while a hash_seq_search() scan · a2e923a6
    Tom Lane authored
    is in progress on the same hashtable.  This seems the least invasive way to
    fix the recently-recognized problem that a split could cause the scan to
    visit entries twice or (with much lower probability) miss them entirely.
    The only field-reported problem caused by this is the "failed to re-find
    shared lock object" PANIC in COMMIT PREPARED reported by Michel Dorochevsky,
    which was caused by multiply visited entries.  However, it seems certain
    that mdsync() is vulnerable to missing required fsync's due to missed
    entries, and I am fearful that RelationCacheInitializePhase2() might be at
    risk as well.  Because of that and the generalized hazard presented by this
    bug, back-patch all the supported branches.
    
    Along the way, fix pg_prepared_statement() and pg_cursor() to not assume
    that the hashtables they are examining will stay static between calls.
    This is risky regardless of the newly noted dynahash problem, because
    hash_seq_search() has never promised to cope with deletion of table entries
    other than the just-returned one.  There may be no bug here because the only
    supported way to call these functions is via ExecMakeTableFunctionResult()
    which will cycle them to completion before doing anything very interesting,
    but it seems best to get rid of the assumption.  This affects 8.2 and HEAD
    only, since those functions weren't there earlier.
    a2e923a6
portalmem.c 25.7 KB