• Andres Freund's avatar
    Improve multixact emergency autovacuum logic. · 667912ae
    Andres Freund authored
    Previously autovacuum was not necessarily triggered if space in the
    members slru got tight. The first problem was that the signalling was
    tied to values in the offsets slru, but members can advance much
    faster. Thats especially a problem if old sessions had been around that
    previously prevented the multixact horizon to increase. Secondly the
    skipping logic doesn't work if the database was restarted after
    autovacuum was triggered - that knowledge is not preserved across
    restart. This is especially a problem because it's a common
    panic-reaction to restart the database if it gets slow to
    anti-wraparound vacuums.
    
    Fix the first problem by separating the logic for members from
    offsets. Trigger autovacuum whenever a multixact crosses a segment
    boundary, as the current member offset increases in irregular values, so
    we can't use a simple modulo logic as for offsets.  Add a stopgap for
    the second problem, by signalling autovacuum whenver ERRORing out
    because of boundaries.
    
    Discussion: 20150608163707.GD20772@alap3.anarazel.de
    
    Backpatch into 9.3, where it became more likely that multixacts wrap
    around.
    667912ae
multixact.c 108 KB