On Mon, Mar 29, 2021 at 1:45 PM Mark Dilger
<mark.dil...@enterprisedb.com> wrote:
> Thanks!  The attached patch addresses your comments here and in your prior 
> email.  In particular, this patch changes the tuple visibility logic to not 
> check tuples for which the inserting transaction aborted or is still in 
> progress, and to not check toast for tuples deleted in transactions older 
> than our transaction snapshot's xmin.  A list of toasted attributes which are 
> safe to check is compiled per main table page during the scan of the page, 
> then checked after the buffer lock on the main page is released.
>
> In the perhaps unusual case where verify_heapam() is called in a transaction 
> which has also added tuples to the table being checked, this patch's 
> visibility logic chooses not to check such tuples.  I'm on the fence about 
> this choice, and am mostly following your lead.  I like that this decision 
> maintains the invariant that we never check tuples which have not yet been 
> committed.
>
> The patch includes a bit of refactoring.  In the old code, heap_check() 
> performed clog bounds checking on xmin and xmax prior to calling 
> check_tuple_header_and_visibilty(), but I think that's not such a great 
> choice.  If the tuple header is garbled to have random bytes in the xmin and 
> xmax fields, and we can detect that situation because other tuple header 
> fields are garbled in detectable ways, I'd rather get a report about the 
> header being garbled than a report about the xmin or xmax being out of 
> bounds.  In the new code, the tuple header is checked first, then the 
> visibility is checked, then the tuple is checked against the current relation 
> description, then the tuple attributes are checked.  I think the layout is 
> easier to follow, too.

Hmm, so this got ~10x bigger from my version. Could you perhaps
separate it out into a series of patches for easier review? Say, one
that just fixes the visibility logic, and then a second to avoid doing
the TOAST check with a buffer lock held, and then more than that if
there are other pieces that make sense to separate out?

-- 
Robert Haas
EDB: http://www.enterprisedb.com


Reply via email to