Hi,

Thanks, looks saner than my version ;)

On 2013-11-29 01:00:35 -0300, Alvaro Herrera wrote:
> !                             /*
> !                              * FIXME this calls TransactionIdDidAbort() 
> internally,
> !                              * falsifying the claim in the comment at the 
> top ...
> !                              */
> !                             update_xid = HeapTupleGetUpdateXid(tuple);

Yea. I think we should remove that behaviour from
HeapTupleGetUpdateXid() - we don't need to rely on it here.

> !                             /*
> !                              * XXX we rely here on HeapTupleGetUpdateXid 
> returning
> !                              * Invalid for aborted updates.
> !                              */
> !                             if (!TransactionIdIsValid(update_xid))
> !                                     freeze_xmax = true;

I've just added this case because HeapTupleGetUpdateXid() currently can
return InvalidTransactionId - I'd be perfectly fine to just place the
aborted xid in there.

> !                              * FIXME -- what if it's a committed update 
> which has recent
> !                              * new locker transaction?  The tuple wouldn't 
> have been
> !                              * removed in that case 
> (HeapTupleSatisfiesVacuum returns
> !                              * RECENTLY_DEAD).
> !                              */

Afaics we should be protected against that by virtue of GetOldestMultiXactId().

> ***************
> *** 5645,5668 **** heap_tuple_needs_freeze(HeapTupleHeader tuple, 
> TransactionId cutoff_xid,
> !                             /* we don't care about lockers */
> !                             if (members[i].status != 
> MultiXactStatusNoKeyUpdate ||
> !                                     members[i].status == 
> MultiXactStatusUpdate)
> !                                     continue;

Dangerous typo alert. Should also be replaced by
ISUPDATE_from_mxstatus(). Alternatively, if we decide to make
HeapTupleGetUpdateXid() not make that DidAbort() check, we can simply
get rid of doing the loop ourselves alltogethers.

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

Reply via email to