Possible missing segments in archiving on standby
Kyotaro Horiguchi <horikyota.ntt@gmail.com>
From: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
To: pgsql-hackers@lists.postgresql.org
Date: 2020-06-30T07:55:03Z
Lists: pgsql-hackers
Attachments
- v1-0001-Make-sure-standby-archives-all-segments.patch (text/x-patch)
Hello. While looking a patch, I found that a standby with archive_mode=always fails to archive segments under certain conditions. A. Walreceiver is gracefully terminated just after a segment is finished. B. Walreceiver is gracefully terminated while receiving filling chunks for a segment switch. The two above are reprodusible (without distinction between the two) using a helper patch. See below. There's one more issue here. C. Standby doesn't archive a segment until walreceiver receives any data for the next segment. I'm not sure wehther we assume C as an issue. The first attached patch fixes A and B. A side-effect of that is that standby archives the previous segment of the streaming start location. Concretely 00..0100..2 gets to be archived in the above case (recovery starts at 0/3000000). That behavior doesn't seem to be a proble since the segment is a part of the standby's data anyway. The second attached patch fixes all of A to C, but seems somewhat redundant. Any opnions and/or suggestions are welcome. The attached files are: 1. v1-0001-Make-sure-standby-archives-all-segments.patch: Fix for A and B. 2. v1-0001-Make-sure-standby-archives-all-segments-immediate.patch: Fix for A, B and C. 3. repro.sh The reproducer shell script used below. 4. repro_helper.patch Helper patch for repro.sh for master and patch 1 above. 5. repro_helper2.patch Helper patch for repro.sh for patch 2 above. ===== ** REPRODUCER The failure is reproducible with some code tweak. 1. Create a primary server with archive_mode=always then start it. 2. Create and start a standby. 3. touch /tmp/hoge 4. psql -c "create table t(); drop table t; select pg_switch_wal(); select pg_sleep(1); create table t(); drop table t; select pg_switch_wal();" 5. look into the archive directory of the standby. If no missing segments found in archive, repeat from 3. The third attached shell script is a reproducer for the problem, needing the aid of the fourth patch attached. $ mkdir testdir $ cd testdir $ bash ..../repro.sh .... After test 2: Primary location: 0/8000310 Standby location: 0/8000310 # primary archive 000000010000000000000003 000000010000000000000004 000000010000000000000005 000000010000000000000006 000000010000000000000007 000000010000000000000008 # standby archive 000000010000000000000003 000000010000000000000005 000000010000000000000006 000000010000000000000008 The segment 4 is skipped by the issue A and 7 is skipped by the issue B. regards. -- Kyotaro Horiguchi NTT Open Source Software Center
Commits
-
Fix issue with WAL archiving in standby.
- 61e2aa2dbe55 9.6.24 landed
- f77489046d17 10.19 landed
- aacb3cfaf5e8 11.14 landed
- 4665352543d7 12.9 landed
- dd9b3fced83e 13.5 landed
- b5ec22bf5e8f 14.0 landed
- 596ba75cb111 15.0 landed