Re: HOT chain validation in verify_heapam()

Andres Freund <andres@anarazel.de>

From: Andres Freund <andres@anarazel.de>
To: Robert Haas <robertmhaas@gmail.com>
Cc: Aleksander Alekseev <aleksander@timescale.com>, PostgreSQL Hackers <pgsql-hackers@postgresql.org>, Himanshu Upadhyaya <upadhyaya.himanshu@gmail.com>, Mark Dilger <mark.dilger@enterprisedb.com>
Date: 2023-03-23T00:38:38Z
Lists: pgsql-hackers
Hi,

On 2023-03-22 13:45:52 -0700, Andres Freund wrote:
> On 2023-03-22 09:19:18 -0400, Robert Haas wrote:
> > On Fri, Mar 17, 2023 at 8:31 AM Aleksander Alekseev
> > <aleksander@timescale.com> wrote:
> > > The patch needed a rebase due to a4f23f9b. PFA v12.
> >
> > I have committed this after tidying up a bunch of things in the test
> > case file that I found too difficult to understand -- or in some cases
> > just incorrect, like:
> 
> As noticed by Andrew
> https://postgr.es/m/bfa5bd2b-c0e6-9d65-62ce-97f4766b1c42%40dunslane.net and
> then reproduced on HEAD by me, there's something not right here.

skink / valgrind reported in a while back and found another issue:

https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=skink&dt=2023-03-22%2021%3A53%3A41

==2490364== VALGRINDERROR-BEGIN
==2490364== Conditional jump or move depends on uninitialised value(s)
==2490364==    at 0x11D459F2: check_tuple_visibility (verify_heapam.c:1379)
==2490364==    by 0x11D46262: check_tuple (verify_heapam.c:1812)
==2490364==    by 0x11D46FDF: verify_heapam (verify_heapam.c:535)
==2490364==    by 0x3D5B2C: ExecMakeTableFunctionResult (execSRF.c:235)
==2490364==    by 0x3E8225: FunctionNext (nodeFunctionscan.c:95)
==2490364==    by 0x3D6685: ExecScanFetch (execScan.c:133)
==2490364==    by 0x3D6709: ExecScan (execScan.c:182)
==2490364==    by 0x3E813A: ExecFunctionScan (nodeFunctionscan.c:270)
==2490364==    by 0x3D31C4: ExecProcNodeFirst (execProcnode.c:464)
==2490364==    by 0x3FF7E7: ExecProcNode (executor.h:262)
==2490364==    by 0x3FFB15: ExecNestLoop (nodeNestloop.c:160)
==2490364==    by 0x3D31C4: ExecProcNodeFirst (execProcnode.c:464)
==2490364==  Uninitialised value was created by a stack allocation
==2490364==    at 0x11D45325: check_tuple_visibility (verify_heapam.c:994)
==2490364== 
==2490364== VALGRINDERROR-END
==2490364== VALGRINDERROR-BEGIN
==2490364== Conditional jump or move depends on uninitialised value(s)
==2490364==    at 0x11D45AC6: check_tuple_visibility (verify_heapam.c:1379)
==2490364==    by 0x11D46262: check_tuple (verify_heapam.c:1812)
==2490364==    by 0x11D46FDF: verify_heapam (verify_heapam.c:535)
==2490364==    by 0x3D5B2C: ExecMakeTableFunctionResult (execSRF.c:235)
==2490364==    by 0x3E8225: FunctionNext (nodeFunctionscan.c:95)
==2490364==    by 0x3D6685: ExecScanFetch (execScan.c:133)
==2490364==    by 0x3D6709: ExecScan (execScan.c:182)
==2490364==    by 0x3E813A: ExecFunctionScan (nodeFunctionscan.c:270)
==2490364==    by 0x3D31C4: ExecProcNodeFirst (execProcnode.c:464)
==2490364==    by 0x3FF7E7: ExecProcNode (executor.h:262)
==2490364==    by 0x3FFB15: ExecNestLoop (nodeNestloop.c:160)
==2490364==    by 0x3D31C4: ExecProcNodeFirst (execProcnode.c:464)
==2490364==  Uninitialised value was created by a stack allocation
==2490364==    at 0x11D45325: check_tuple_visibility (verify_heapam.c:994)
==2490364==

Greetings,

Andres Freund



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.