Hi,
I find our implementation:
(1) discards the HEAP_XMAX_COMMITTED on purposes when it converts a
HEAP_XMAX_COMMITTED xmax into a mutlixid. See the branch of "else if
(old_infomask & HEAP_XMAX_COMMITTED)" in compute_new_xmax_infomask
(new_infomask is computed in GetMultiXactIdHintBits where the
HEAP_XMAX_COMMITTED is totally ignored).
(2) Again in compute_new_xmax_infomask, we have:
else if (old_infomask & HEAP_XMAX_IS_MULTI)
{
MultiXactStatus new_status;
/*
* Currently we don't allow XMAX_COMMITTED to be set for
multis, so
* cross-check.
*/
Assert(!(old_infomask & HEAP_XMAX_COMMITTED));
My question is why we couldn't let HEAP_XMAX_COMMITTED with mutlixid?
IIUC there are only one "deleter xmax" in mutlixid's members, so could
we define the HEAP_XMAX_COMMITTED as the status of the "deleter xmax" in
the multixacts? With this way, it can reduce some calls of
TransactionIdDidCommit in HeapTupleSatisfiesMVCC case.
--
Best Regards
Andy Fan