On Thu, May 29, 2025 at 11:37 AM Peter Geoghegan <p...@bowt.ie> wrote: > > Your concern is that the horizon might be overly aggressive/too > conservative. But your patch (for 16) makes us take the > don't-use-snapshotConflictHorizon-twice block *less* frequently (and > the "use OldestXmin conservatively" block *more* frequently): > > - if (prunestate->all_visible && prunestate->all_frozen) > + if (prunestate->all_visible && prunestate->all_frozen && lpdead_items == 0) > { > /* Using same cutoff when setting VM is now unnecessary */ > snapshotConflictHorizon = prunestate->visibility_cutoff_xid; > prunestate->visibility_cutoff_xid = InvalidTransactionId; > } > else > { > /* Avoids false conflicts when hot_standby_feedback in use */ > snapshotConflictHorizon = vacrel->cutoffs.OldestXmin; > TransactionIdRetreat(snapshotConflictHorizon); > } > > How can taking the "Avoids false conflicts when hot_standby_feedback > in use" path more often result in fewer unnecessary conflicts on > standbys? Isn't it the other way around?
You're right. I forgot that the visibility_cutoff_xid will be older than OldestXmin when all the tuples are going to be frozen. I associate the visibility_cutoff_xid with being younger/newer than OldestXmin because it often will be when there are newer live tuples we don't freeze. And, in the case where the page is not actually all-frozen because of LP_DEAD items we haven't accounted for yet in the value of all_frozen, they wouldn't affect the freeze record's snapshot conflict horizon in 16 because they won't be frozen and thus unaffected by the WAL record and in the case of the prune/freeze WAL record in 17/master, I calculate the newer of the latest_xid_removed and the snapshot conflict horizon calculated for freezing, so it would also be fine. - Melanie