Re: Duplicate history file?
Kyotaro Horiguchi <horikyota.ntt@gmail.com>
From: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
To: tatsuro.yamada.tf@nttcom.co.jp
Cc: pgsql-hackers@lists.postgresql.org
Date: 2021-06-03T12:52:08Z
Lists: pgsql-hackers
Attachments
At Tue, 01 Jun 2021 13:03:22 +0900, Tatsuro Yamada <tatsuro.yamada.tf@nttcom.co.jp> wrote in > Hi Horiguchi-san, > > On 2021/05/31 16:58, Kyotaro Horiguchi wrote: > > So, I started a thread for this topic diverged from the following > > thread. > > https://www.postgresql.org/message-id/4698027d-5c0d-098f-9a8e-8cf09e36a555@nttcom.co.jp_1 > > > >> So, what should we do for the user? I think we should put some notes > >> in postgresql.conf or in the documentation. For example, something > >> like this: > > I'm not sure about the exact configuration you have in mind, but that > > would happen on the cascaded standby in the case where the upstream > > promotes. In this case, the history file for the new timeline is > > archived twice. walreceiver triggers archiving of the new history > > file at the time of the promotion, then startup does the same when it > > restores the file from archive. Is it what you complained about? > > > Thank you for creating a new thread and explaining this. > We are not using cascade replication in our environment, but I think > the situation is similar. As an overview, when I do a promote, > the archive_command fails due to the history file. Ah, I remembered that PG-REX starts a primary as a standby then promotes it. > I've created a reproduction script that includes building replication, > and I'll share it with you. (I used Robert's test.sh as a reference > for creating the reproduction script. Thanks) > > The scenario (sr_test_historyfile.sh) is as follows. > > #1 Start pgprimary as a main > #2 Create standby > #3 Start pgstandby as a standby > #4 Execute archive command > #5 Shutdown pgprimary > #6 Start pgprimary as a standby > #7 Promote pgprimary > #8 Execute archive_command again, but failed since duplicate history > file exists (see pgstandby.log) Ok, I clearly understood what you meant. (However, it is not the legit state where a standby is running without the primary is running..) Anyway the "test ! -f" can be problematic in the case. > Note that this may not be appropriate if you consider it as a recovery > procedure for replication configuration. However, I'm sharing it as it > is > because this seems to be the procedure used in the customer's > environment (PG-REX). Understood. > Regarding "test ! -f", > I am wondering how many people are using the test command for > archive_command. If I remember correctly, the guide provided by > NTT OSS Center that we are using does not recommend using the test > command. I think, as the PG-REX documentation says, the simple cp works well as far as the assumption of PG-REX - no double failure happenes, and following the instruction - holds. On the other hand, I found that the behavior happens more generally. If a standby with archive_mode=always craches, it starts recovery from the last checkpoint. If the checkpoint were in a archived segment, the restarted standby will fetch the already-archived segment from archive then fails to archive it. (The attached). So, your fear stated upthread is applicable for wider situations. The following suggestion is rather harmful for the archive_mode=always setting. https://www.postgresql.org/docs/14/continuous-archiving.html > The archive command should generally be designed to refuse to > overwrite any pre-existing archive file. This is an important safety > feature to preserve the integrity of your archive in case of > administrator error (such as sending the output of two different > servers to the same archive directory). I'm not sure how we should treat this.. Since archive must store files actually applied to the server data, just being already archived cannot be the reason for omitting archiving. We need to make sure the new file is byte-identical to the already-archived version. We could compare just *restored* file to the same file in pg_wal but it might be too much of penalty for for the benefit. (Attached second file.) Otherwise the documentation would need someting like the following if we assume the current behavior. > The archive command should generally be designed to refuse to > overwrite any pre-existing archive file. This is an important safety > feature to preserve the integrity of your archive in case of > administrator error (such as sending the output of two different > servers to the same archive directory). + For standby with the setting archive_mode=always, there's a case where + the same file is archived more than once. For safety, it is + recommended that when the destination file exists, the archive_command + returns zero if it is byte-identical to the source file. regards. -- Kyotaro Horiguchi NTT Open Source Software Center
Commits
-
Further refinement of stuck_on_old_timeline recovery test
- e46f6a078c1a 9.6.23 landed
- 1dc53c914fe8 10.18 landed
- c0a7587807dd 11.13 landed
- fb3d6b0e1aa4 12.8 landed
- d906d106f854 13.4 landed
- 54a5ed220169 14.0 landed
-
Adjust new test case to set wal_keep_segments.
- 6cd0e55f9ffb 9.6.23 landed
- 1c2c6a9a299c 10.18 landed
- 534b9be805b4 11.13 landed
- 2208d71a0099 12.8 landed
-
Adjust new test case to set wal_keep_size.
- 3465328aa19e 13.4 landed
- 4dcb1d087aeb 14.0 landed
-
Fix corner case failure of new standby to follow new primary.
- 6eb5b9ae3917 9.6.23 landed
- 31bda6a22ad1 10.18 landed
- ca158c168ea3 11.13 landed
- 5d950c721d38 12.8 landed
- 082656429215 13.4 landed
- caba8f0d43fb 14.0 landed
-
Back-port a few PostgresNode.pm methods.
- 75212a854f99 9.6.23 landed
-
Allow PostgresNode.pm's backup method to accept backup_options.
- 9778a191a4c0 10.18 landed
- 38982b8b7bd9 11.13 landed
- 6fc2febc28ae 12.8 landed
- 99a0a2ada8c5 13.4 landed
-
Add end-to-end testing of pg_basebackup's tar-format output.
- 081876d75ea1 14.0 cited
-
Allow PostgresNode.pm tests to wait for catchup
- fb093e4cb36f 10.0 cited
-
Delay reading timeline history file until it's fetched from master.
- ee994272ca50 9.3.0 cited