Hi, On 2013-12-12 18:39:43 -0300, Alvaro Herrera wrote: > Alvaro Herrera wrote: > > One last thing (I hope). It's not real easy to disable this check, > > because it actually lives in GetNewMultiXactId. It would uglify the API > > a lot if we were to pass a flag down two layers of routines; and moving > > it to higher-level routines doesn't seem all that appropriate > > either.
Unfortunately I find that too ugly. Adding a flag in the procarray because of an Assert() in a lowlevel routine? That's overkill. What's the problem with moving the check to MultiXactIdCreate() and MultiXactIdExpand() instead? Since those are the ones where it's required to have called SetOldest() before, I don't see why that would be inappropriate? > > I'm thinking we can have a new flag in MyPgXact->vacuumFlags, so > > heap_prepare_freeze_tuple does this: > > > > PG_TRY(); > > { > > /* set flag to let multixact.c know what we're doing */ > > MyPgXact->vacuumFlags |= PROC_FREEZING_MULTI; > > newxmax = FreezeMultiXactId(xid, tuple->t_infomask, > > cutoff_xid, cutoff_multi, &flags); > > } > > Uhm, actually we don't need a PG_TRY block at all for this to work: we > can rely on the flag being reset at transaction abort, if anything wrong > happens and we lose control. So just set the flag, call > FreezeMultiXactId, reset flag. I don't think that'd be correct for a CLUSTER in a subtransaction? A subtransaction's abort afaics doesn't call ProcArrayEndTransaction() and thus don't clear vacuumFlags... Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers