Don't assert MultiXactIdIsRunning if the multi came from a tuple that
had been share-locked and later copied over to the new cluster by
pg_upgrade. Doing that causes an error to be raised unnecessarily:
MultiXactIdIsRunning is not open to the possibility that its argument
came from a pg_upgraded tuple, and all its other callers are already
checking; but such multis cannot, obviously, have transactions still
running, so the assert is pointless.
Noticed while investigating the bogus pg_multixact/offsets/0000 file
left over by pg_upgrade, as reported by Andres Freund in
http://www.postgresql.org/message-id/
20140530121631.GE25431@alap3.anarazel.de
Backpatch to 9.3, as the commit that introduced the buglet.
* was a locker only, it can be removed without any further
* consideration; but if it contained an update, we might need to
* preserve it.
+ *
+ * Don't assert MultiXactIdIsRunning if the multi came from a
+ * pg_upgrade'd share-locked tuple, though, as doing that causes an
+ * error to be raised unnecessarily.
*/
- Assert(!MultiXactIdIsRunning(multi));
+ Assert((!(t_infomask & HEAP_LOCK_MASK) &&
+ HEAP_XMAX_IS_LOCKED_ONLY(t_infomask)) ||
+ !MultiXactIdIsRunning(multi));
if (HEAP_XMAX_IS_LOCKED_ONLY(t_infomask))
{
*flags |= FRM_INVALIDATE_XMAX;