• Tom Lane's avatar
    Fix two serious bugs introduced into hash indexes by the 8.4 patch that made · c4afdca4
    Tom Lane authored
    hash indexes keep entries sorted by hash value.  First, the original plans for
    concurrency assumed that insertions would happen only at the end of a page,
    which is no longer true; this could cause scans to transiently fail to find
    index entries in the presence of concurrent insertions.  We can compensate
    by teaching scans to re-find their position after re-acquiring read locks.
    Second, neither the bucket split nor the bucket compaction logic had been
    fixed to preserve hashvalue ordering, so application of either of those
    processes could lead to permanent corruption of an index, in the sense
    that searches might fail to find entries that are present.
    
    This patch fixes the split and compaction logic to preserve hashvalue
    ordering, but it cannot do anything about pre-existing corruption.  We will
    need to recommend reindexing all hash indexes in the 8.4.2 release notes.
    
    To buy back the performance loss hereby induced in split and compaction,
    fix them to use PageIndexMultiDelete instead of retail PageIndexDelete
    operations.  We might later want to do something with qsort'ing the
    page contents rather than doing a binary search for each insertion,
    but that seemed more invasive than I cared to risk in a back-patch.
    
    Per bug #5157 from Jeff Janes and subsequent investigation.
    c4afdca4
hash.c 18.2 KB