diff options
author | Michael Paquier <michael@paquier.xyz> | 2020-04-24 08:48:28 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2020-04-24 08:48:28 +0900 |
commit | 4e87c4836ab9059cdec17b0a288db3622a42ac18 (patch) | |
tree | e11fc75c0384b5487be7e5e1a02533f47eb41365 /src/include | |
parent | 3436c5e28374d4e0587634fda09faf4a38a9d848 (diff) | |
download | postgresql-4e87c4836ab9059cdec17b0a288db3622a42ac18.tar.gz postgresql-4e87c4836ab9059cdec17b0a288db3622a42ac18.zip |
Fix handling of WAL segments ready to be archived during crash recovery
78ea8b5 has fixed an issue related to the recycling of WAL segments on
standbys depending on archive_mode. However, it has introduced a
regression with the handling of WAL segments ready to be archived during
crash recovery, causing those files to be recycled without getting
archived.
This commit fixes the regression by tracking in shared memory if a live
cluster is either in crash recovery or archive recovery as the handling
of WAL segments ready to be archived is different in both cases (those
WAL segments should not be removed during crash recovery), and by using
this new shared memory state to decide if a segment can be recycled or
not. Previously, it was not possible to know if a cluster was in crash
recovery or archive recovery as the shared state was able to track only
if recovery was happening or not, leading to the problem.
A set of TAP tests is added to close the gap here, making sure that WAL
segments ready to be archived are correctly handled when a cluster is in
archive or crash recovery with archive_mode set to "on" or "always", for
both standby and primary.
Reported-by: Benoît Lobréau
Author: Jehan-Guillaume de Rorthais
Reviewed-by: Kyotaro Horiguchi, Fujii Masao, Michael Paquier
Discussion: https://postgr.es/m/20200331172229.40ee00dc@firost
Backpatch-through: 9.5
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/access/xlog.h | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index f60ed2d36cb..0a12afb59e6 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -166,6 +166,14 @@ typedef enum WalLevel WAL_LEVEL_LOGICAL } WalLevel; +/* Recovery states */ +typedef enum RecoveryState +{ + RECOVERY_STATE_CRASH = 0, /* crash recovery */ + RECOVERY_STATE_ARCHIVE, /* archive recovery */ + RECOVERY_STATE_DONE /* currently in production */ +} RecoveryState; + extern PGDLLIMPORT int wal_level; /* Is WAL archiving enabled (always or only while server is running normally)? */ @@ -291,6 +299,7 @@ extern const char *xlog_identify(uint8 info); extern void issue_xlog_fsync(int fd, XLogSegNo segno); extern bool RecoveryInProgress(void); +extern RecoveryState GetRecoveryState(void); extern bool HotStandbyActive(void); extern bool HotStandbyActiveInReplay(void); extern bool XLogInsertAllowed(void); |