Re: XLogReadRecord() error in XlogReadTwoPhaseData()
Noah Misch <noah@leadboat.com>
From: Noah Misch <noah@leadboat.com>
To: pgbf@twiska.com
Cc: Tom Lane <tgl@sss.pgh.pa.us>, Michael Paquier <michael@paquier.xyz>, pgsql-hackers@postgresql.org
Date: 2021-11-20T05:18:23Z
Lists: pgsql-hackers
On Wed, Nov 17, 2021 at 11:05:06PM -0800, Noah Misch wrote: > On Wed, Nov 17, 2021 at 05:47:10PM -0500, Tom Lane wrote: > > Noah Misch <noah@leadboat.com> writes: > > > Each of the three failures happened on a sparc64 Debian+gcc machine. I had > > > tried ~8000 iterations on thorntail, another sparc64 Debian+gcc animal, > > > without reproducing this. > > > # 'pgbench: error: client 0 script 1 aborted in command 4 query 0: ERROR: could not read two-phase state from WAL at 0/159EF88: unexpected pageaddr 0/0 in log segment 000000010000000000000001, offset 5890048 > > [1] https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=tadarida&dt=2021-11-17%2013%3A01%3A24 > > Two others: > ERROR: could not read two-phase state from WAL at 0/16F1850: invalid record length at 0/16F1850: wanted 24, got 0 > -- https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=tadarida&dt=2021-11-12%2013%3A01%3A15 > ERROR: could not read two-phase state from WAL at 0/1668020: incorrect resource manager data checksum in record at 0/1668020 > -- https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=kittiwake&dt=2021-11-16%2015%3A00%3A52 > > > I suppose "unexpected pageaddr 0/0" is most easily explained by supposing > > that XlogReadTwoPhaseData tried to read a WAL page that hadn't been > > written out yet. Have we got any synchronization around that? > > If the WAL address isn't on disk, that error doesn't happen. Instead, > read_local_xlog_page() blocks waiting for the WAL to become available. It's > still possible that we make the WAL region exist, but it somehow doesn't > contain the right data until shortly later. FinishPreparedTransaction() takes > TwoPhaseStateLock and looks for an entry having gxact->valid. EndPrepare() > fills gxact->prepare_end_lsn, then calls MarkAsPrepared() to set gxact->valid > under TwoPhaseStateLock. All freelist (freeGXacts) interaction holds > TwoPhaseStateLock. I'm not seeing a gap in that synchronization. > > I don't have a great theory, but here are candidates to examine next: > > - Run with wal_debug=on to confirm logged write location matches read location. > - Run "PGDATA=contrib/amcheck/tmp_check/t_003_cic_2pc_CIC_2PC_test_data/pgdata > pg_waldump -s 0/01000000" at the end of the test. > - Dump WAL page binary image at the point of failure. > - Log which branches in XLogReadRecord() are taken. Tom Turelinckx, are you able to provide remote access to kittiwake or tadarida? I'd use it to attempt the above things. All else being equal, kittiwake is more relevant since it's still supported upstream. The setup of your buildfarm animals provides a clue. I understand kittiwake is the same as ibisbill except for build options, and tadarida is the same as mussurana except for build options. ibisbill and mussurana haven't failed, so one of these is likely needed to reproduce: absence of --enable-cassert CFLAGS='-g -O2 -fstack-protector -Wformat -Werror=format-security ' CPPFLAGS='-Wdate-time -D_FORTIFY_SOURCE=2' LDFLAGS='-Wl,-z,relro -Wl,-z,now' However, I can't reproduce this on thorntail, even if I use tadarida's ./configure options, CFLAGS, CPPFLAGS, and LDFLAGS.
Commits
-
Under has_wal_read_bug, skip recovery/t/032_relfilenode_reuse.pl.
- 3395cc1dbae5 15.1 landed
- a9f8ca6005f1 16.0 landed
-
Under has_wal_read_bug, skip contrib/bloom/t/001_wal.pl.
- c027e51d0fa3 10.21 landed
- 8fa3386431a7 11.16 landed
- 49d63b2e361c 12.11 landed
- 23213f53ba20 13.7 landed
- aca4d561cb9f 14.3 landed
- ad76c9708bd1 15.0 landed
-
Use Test::Builder::todo_start(), replacing $::TODO.
- b3558cc96cd9 13.7 landed
- 6da62ff14c57 10.21 landed
- 3a32e53e1f38 12.11 landed
- 2373429975ac 11.16 landed
- 1a83297d2224 14.3 landed
- adbd00f7a59b 15.0 landed
-
On sparc64+ext4, suppress test failures from known WAL read failure.
- e092f00d061e 11.15 landed
- d94a95cce9eb 14.2 landed
- a2a4992215c5 10.20 landed
- 785a28e422ea 13.6 landed
- 279956817ff4 12.10 landed
- ce6d79368efa 15.0 landed
-
Report any XLogReadRecord() error in XlogReadTwoPhaseData().
- 2f60fd647d81 10.20 landed
- cae393f0f9fc 11.15 landed
- 2d60ce3e1a46 12.10 landed
- d4e9d6946995 13.6 landed
- 675cd765c2a5 14.2 landed
- 335474691054 15.0 landed