On 27/03/2024 17:18, Melanie Plageman wrote:
I need some way to modify the control flow or accounting such that I
know which HEAPTUPLE_RECENTLY_DEAD tuples will not be marked LP_DEAD.
And a way to consider freezing and do live tuple accounting for these
and HEAPTUPLE_LIVE tuples exactly once.

Just a quick update: I've been massaging this some more today, and I think I'm onto got something palatable. I'll send an updated patch later today, but the key is to note that for each item on the page, there is one point where we determine the fate of the item, whether it's pruned or not. That can happen in different points in in heap_page_prune(). That's also when we set marked[offnum] = true. Whenever that happens, we all call one of the a heap_page_prune_record_*() subroutines. We already have those subroutines for when a tuple is marked as dead or unused, but let's add similar subroutines for the case that we're leaving the tuple unchanged. If we move all the bookkeeping logic to those subroutines, we can ensure that it gets done exactly once for each tuple, and at that point we know what we are going to do to the tuple, so we can count it correctly. So heap_prune_chain() decides what to do with each tuple, and ensures that each tuple is marked only once, and the subroutines update all the variables, add the item to the correct arrays etc. depending on what we're doing with it.

--
Heikki Linnakangas
Neon (https://neon.tech)



Reply via email to