Re: HOT chain validation in verify_heapam()

Himanshu Upadhyaya <upadhyaya.himanshu@gmail.com>

From: Himanshu Upadhyaya <upadhyaya.himanshu@gmail.com>
To: Andres Freund <andres@anarazel.de>
Cc: Robert Haas <robertmhaas@gmail.com>, Aleksander Alekseev <aleksander@timescale.com>, PostgreSQL Hackers <pgsql-hackers@postgresql.org>, Mark Dilger <mark.dilger@enterprisedb.com>
Date: 2023-03-23T05:50:04Z
Lists: pgsql-hackers
On Thu, Mar 23, 2023 at 2:15 AM Andres Freund <andres@anarazel.de> wrote:

>
> Currently the new verify_heapam() follows ctid chains when XMAX_INVALID is
> set
> and expects to find an item it can dereference - but I don't think that's
> something we can rely on: Afaics HOT pruning can break chains, but doesn't
> reset xmax.
>
> We have below code which I think takes care of xmin and xmax matching and
if they match then only we add them to the predecessor array.
                        /*
                         * If the next line pointer is a redirect, or if
it's a tuple
                         * but the XMAX of this tuple doesn't match the
XMIN of the next
                         * tuple, then the two aren't part of the same
update chain and
                         * there is nothing more to do.
                         */
                        if (ItemIdIsRedirected(next_lp))
                                continue;
                        curr_htup = (HeapTupleHeader) PageGetItem(ctx.page,
curr_lp);
                        curr_xmax = HeapTupleHeaderGetUpdateXid(curr_htup);
                        next_htup = (HeapTupleHeader) PageGetItem(ctx.page,
next_lp);
                        next_xmin = HeapTupleHeaderGetXmin(next_htup);
                        if (!TransactionIdIsValid(curr_xmax) ||
                                !TransactionIdEquals(curr_xmax, next_xmin))
                                continue;

-- 
Regards,
Himanshu Upadhyaya
EnterpriseDB: http://www.enterprisedb.com

Commits

  1. amcheck: Generalize one of the recently-added update chain checks.

  2. amcheck: Tighten up validation of redirect line pointers.

  3. amcheck: Fix verify_heapam for tuples where xmin or xmax is 0.

  4. amcheck: Fix a few bugs in new update chain validation.

  5. Fix new test case to work on (some?) big-endian architectures.

  6. Don't test HEAP_XMAX_INVALID when freezing xmax.