• Alexander Korotkov's avatar
    Check for conflicting queries during replay of gistvacuumpage() · c952eae5
    Alexander Korotkov authored
    013ebc0a implements so-called GiST microvacuum.  That is gistgettuple() marks
    index tuples as dead when kill_prior_tuple is set.  Later, when new tuple
    insertion claims page space, those dead index tuples are physically deleted
    from page.  When this deletion is replayed on standby, it might conflict with
    read-only queries.  But 013ebc0a doesn't handle this.  That may lead to
    disappearance of some tuples from read-only snapshots on standby.
    
    This commit implements resolving of conflicts between replay of GiST microvacuum
    and standby queries.  On the master we implement new WAL record type
    XLOG_GIST_DELETE, which comprises necessary information.  On stable releases
    we've to be tricky to keep WAL compatibility.  Information required for conflict
    processing is just appended to data of XLOG_GIST_PAGE_UPDATE record.  So,
    PostgreSQL version, which doesn't know about conflict processing, will just
    ignore that.
    
    Reported-by: Andres Freund
    Diagnosed-by: Andres Freund
    Discussion: https://postgr.es/m/20181212224524.scafnlyjindmrbe6%40alap3.anarazel.de
    Author: Alexander Korotkov
    Backpatch-through: 9.6
    c952eae5
gistxlog.c 19.6 KB