0001-Force-crash-recovery-with-backup_label-and-no-.signa.patch
text/x-diff
Filename: 0001-Force-crash-recovery-with-backup_label-and-no-.signa.patch
Type: text/x-diff
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: Force crash recovery with backup_label and no .signal files
| File | + | − |
|---|---|---|
| doc/src/sgml/backup.sgml | 3 | 1 |
| src/backend/access/transam/xlogrecovery.c | 23 | 6 |
| src/bin/pg_basebackup/t/010_pg_basebackup.pl | 2 | 1 |
From fbd9fa407c04799ad4401d3ba5c6b67a0d922631 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Tue, 31 Oct 2023 10:14:01 +0900
Subject: [PATCH] Force crash recovery with backup_label and no .signal files
---
src/backend/access/transam/xlogrecovery.c | 29 ++++++++++++++++----
src/bin/pg_basebackup/t/010_pg_basebackup.pl | 3 +-
doc/src/sgml/backup.sgml | 4 ++-
3 files changed, 28 insertions(+), 8 deletions(-)
diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c
index c61566666a..de5787d7e8 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -133,6 +133,8 @@ static TimeLineID curFileTLI;
* currently performing crash recovery using only XLOG files in pg_wal, but
* will switch to using offline XLOG archives as soon as we reach the end of
* WAL in pg_wal.
+ *
+ * InArchiveRecovery should never be set without ArchiveRecoveryRequested.
*/
bool ArchiveRecoveryRequested = false;
bool InArchiveRecovery = false;
@@ -595,13 +597,22 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
List *tablespaces = NIL;
/*
- * Archive recovery was requested, and thanks to the backup label
- * file, we know how far we need to replay to reach consistency. Enter
- * archive recovery directly.
+ * If archive recovery was requested, and we know how far we need to
+ * replay to reach consistency thanks to the backup label file, then
+ * enter archive recovery directly in this case.
+ *
+ * If archive recovery was not requested, then do crash recovery and
+ * replay all the local WAL. This still checks that all the WAL up
+ * to backupEndRequired has been replayed. This case is useful when
+ * restoring from a standalone base backup, taken with pg_basebackup
+ * --wal-method=stream, for example.
*/
- InArchiveRecovery = true;
- if (StandbyModeRequested)
- EnableStandbyMode();
+ if (ArchiveRecoveryRequested)
+ {
+ InArchiveRecovery = true;
+ if (StandbyModeRequested)
+ EnableStandbyMode();
+ }
/*
* When a backup_label file is present, we want to roll forward from
@@ -1591,6 +1602,12 @@ ShutdownWalRecovery(void)
*/
if (ArchiveRecoveryRequested)
DisownLatch(&XLogRecoveryCtl->recoveryWakeupLatch);
+
+ /*
+ * InArchiveRecovery should never have been set without
+ * ArchiveRecoveryRequested.
+ */
+ Assert(ArchiveRecoveryRequested || !InArchiveRecovery);
}
/*
diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
index b9f5e1266b..b9e54f4562 100644
--- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl
+++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
@@ -392,7 +392,8 @@ SKIP:
my $node2 = PostgreSQL::Test::Cluster->new('replica');
# Recover main data directory
- $node2->init_from_backup($node, 'tarbackup2', tar_program => $tar);
+ $node2->init_from_backup($node, 'tarbackup2', tar_program => $tar,
+ has_restoring => 1);
# Recover tablespace into a new directory (not where it was!)
my $repTsDir = "$tempdir/tblspc1replica";
diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml
index 8cb24d6ae5..5ba7a284cf 100644
--- a/doc/src/sgml/backup.sgml
+++ b/doc/src/sgml/backup.sgml
@@ -1380,7 +1380,9 @@ restore_command = 'cp /mnt/server/archivedir/%f %p'
tool. If you include the <literal>-X</literal> parameter when calling
it, all the write-ahead log required to use the backup will be
included in the backup automatically, and no special action is
- required to restore the backup.
+ required to restore the backup. Restoring a standalone backup is
+ equivalent to crash recovery, replaying all the WAL stored in
+ <filename>pg_wal</filename> up to its end.
</para>
</sect3>
--
2.42.0