Re: HOT chain validation in verify_heapam()
Andres Freund <andres@anarazel.de>
From: Andres Freund <andres@anarazel.de>
To: Himanshu Upadhyaya <upadhyaya.himanshu@gmail.com>
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-23T17:36:31Z
Lists: pgsql-hackers
Hi, On 2023-03-23 11:20:04 +0530, Himanshu Upadhyaya wrote: > 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; The problem is that that doesn't help if the tuple points to past maxoff, because we can't even fetch the tuple and thus won't even reach these checks. But Robert now put in defenses against that. Greetings, Andres Freund
Commits
-
amcheck: Generalize one of the recently-added update chain checks.
- c87aff065c33 16.0 landed
-
amcheck: Tighten up validation of redirect line pointers.
- 80d5e3a61551 16.0 landed
-
amcheck: Fix verify_heapam for tuples where xmin or xmax is 0.
- 8fd5aa76c367 14.8 landed
- 701ec5557968 15.3 landed
- e88754a1965c 16.0 landed
-
amcheck: Fix a few bugs in new update chain validation.
- 949e2e7c4f68 16.0 landed
-
Fix new test case to work on (some?) big-endian architectures.
- c75a623304bc 16.0 landed
-
Don't test HEAP_XMAX_INVALID when freezing xmax.
- 02d647bbf057 16.0 landed