Don't process multi xmax in FreezeMultiXactId() if it is already marked as invalid. - Mailing list pgsql-hackers

From Anton A. Melnikov
Subject Don't process multi xmax in FreezeMultiXactId() if it is already marked as invalid.
Date
Msg-id 21ece835-b671-4656-9f35-008b9f355034@postgrespro.ru
Whole thread Raw
Responses 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.
List 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 by date:

Previous
From: "Winter Loo"
Date:
Subject: may be a buffer overflow problem
Next
From: Bertrand Drouvot
Date:
Subject: Re: Avoid orphaned objects dependencies, take 3