Don't process multi xmax in FreezeMultiXactId() if it is already marked as invalid.
От | Anton A. Melnikov |
---|---|
Тема | Don't process multi xmax in FreezeMultiXactId() if it is already marked as invalid. |
Дата | |
Msg-id | 21ece835-b671-4656-9f35-008b9f355034@postgrespro.ru обсуждение исходный текст |
Ответы |
Maybe don't process multi xmax in FreezeMultiXactId() if it is already marked as invalid?
Re: Don't process multi xmax in FreezeMultiXactId() if it is already marked as invalid. |
Список | pgsql-hackers |
Hello! The src/backend/access/heap/README.tuplock says about HEAP_XMAX_INVALID bit that "Any tuple with this bit set does not have a valid value stored in XMAX." Found that FreezeMultiXactId() tries to process such an invalid multi xmax and may looks for an update xid in the pg_multixact for it. Maybe not do this work in FreezeMultiXactId() and exit immediately if the bit HEAP_XMAX_INVALID was already set? For instance, like that: master @@ -6215,6 +6215,15 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, /* We should only be called in Multis */ Assert(t_infomask & HEAP_XMAX_IS_MULTI); + /* Xmax is already marked as invalid */ + if (MultiXactIdIsValid(multi) && + (t_infomask & HEAP_XMAX_INVALID)) + { + *flags |= FRM_INVALIDATE_XMAX; + pagefrz->freeze_required = true; + return InvalidTransactionId; + } + if (!MultiXactIdIsValid(multi) || HEAP_LOCKED_UPGRADED(t_infomask)) With the best regards, -- Anton A. Melnikov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company
В списке pgsql-hackers по дате отправления: