On 2015-06-02 11:49:56 -0400, Robert Haas wrote: > On Tue, Jun 2, 2015 at 11:44 AM, Andres Freund <and...@anarazel.de> wrote: > > On 2015-06-02 11:37:02 -0400, Robert Haas wrote: > >> The exact circumstances under which we're willing to replace a > >> relminmxid with a newly-computed one that differs are not altogether > >> clear to me, but there's an "if" statement protecting that logic, so > >> there are some circumstances in which we'll leave the existing value > >> intact. > > > > I guess we'd have to change that then. > > Yeah, but first we'd need to assess why it's like that. Tom was the > one who installed the current logic, but I haven't been able to fully > understand it.
We're talking about: /* Similarly for relminmxid */ if (MultiXactIdIsValid(minmulti) && pgcform->relminmxid != minmulti && (MultiXactIdPrecedes(pgcform->relminmxid, minmulti) || MultiXactIdPrecedes(ReadNextMultiXactId(), pgcform->relminmxid))) { pgcform->relminmxid = minmulti; dirty = true; } right? Before that change (78db307bb/87f830e0ce) we only updated relminmxid if the new value was newer than the old one. That's to avoid values from going backwards, e.g. when a relation is first VACUUM FREEZEd and then a normal VACUUM is performed (these values are unfortunately based on the cutoff values instead of the observed minima). The new thing is the || MultiXactIdPrecedes(ReadNextMultiXactId(), pgcform->relminmxid) which is there to recognize values from the future. E.g. the 1 errorneously left in place by pg_upgrade. Makes sense? > >> It would similarly do so when the oldest MXID reference in the > >> relation is in fact 1, but that value can't be vacuumed away yet. > > > > I'd thought of just forcing consumption of one multixact in that > > case. Not pretty, but imo acceptable. > > What if multixact 1 still has living members? I think we should just trigger the logic if 1 is below the multi freezing horizon - in which case a) the 1 will automatically be replaced, because the horizon is newer b) it can't have a living member anyway. - Andres -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers