v4-0001-Fix-missing-continuation-record-after-standby-promot-v12.patch
application/octet-stream
Filename: v4-0001-Fix-missing-continuation-record-after-standby-promot-v12.patch
Type: application/octet-stream
Part: 2
Patch
Format: format-patch
Series: patch v4-0001
Subject: Fix "missing continuation record" after standby promotion
| File | + | − |
|---|---|---|
| src/backend/access/transam/xlog.c | 4 | 0 |
| src/test/recovery/t/026_overwrite_contrecord.pl | 4 | 1 |
From 4daed94b2c32c1eb11cf37e87d11ea2c5ae803cd Mon Sep 17 00:00:00 2001
From: "Sami Imseih (AWS)" <simseih@amazon.com>
Date: Fri, 4 Mar 2022 19:51:15 +0000
Subject: [PATCH 1/1] Fix "missing continuation record" after standby promotion
Invalidate abortedRecPtr and missingContrecPtr after a missing
continuation record is skipped on a standby. This fixes a PANIC
caused when a recently promoted standby attempts to write an
OVERWRITE_RECORD with an LSN of the previously read aborted record.
Author: Sami Imseih
Reviewed-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com>, Alvaro Herrera <alvherre@alvh.no-ip.org>
Discussion: https://postgr.es/m/44D259DE-7542-49C4-8A52-2AB01534DCA9@amazon.co
Backpatch to 10
---
src/backend/access/transam/xlog.c | 4 ++++
src/test/recovery/t/026_overwrite_contrecord.pl | 5 ++++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 885558f291..8c7bb1dc6f 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -10148,6 +10148,10 @@ VerifyOverwriteContrecord(xl_overwrite_contrecord *xlrec, XLogReaderState *state
(uint32) (state->overwrittenRecPtr >> 32),
(uint32) state->overwrittenRecPtr);
+ /* We have safely skipped the aborted record */
+ abortedRecPtr = InvalidXLogRecPtr;
+ missingContrecPtr = InvalidXLogRecPtr;
+
ereport(LOG,
(errmsg("successfully skipped missing contrecord at %X/%X, overwritten at %s",
(uint32) (xlrec->overwritten_lsn >> 32),
diff --git a/src/test/recovery/t/026_overwrite_contrecord.pl b/src/test/recovery/t/026_overwrite_contrecord.pl
index 867b75937e..9115b5ffc9 100644
--- a/src/test/recovery/t/026_overwrite_contrecord.pl
+++ b/src/test/recovery/t/026_overwrite_contrecord.pl
@@ -15,7 +15,7 @@ plan tests => 3;
# Test: Create a physical replica that's missing the last WAL file,
# then restart the primary to create a divergent WAL file and observe
# that the replica replays the "overwrite contrecord" from that new
-# file.
+# file and the standby promotes successfully.
my $node = PostgresNode->get_new_node('primary');
$node->init(allows_streaming => 1);
@@ -102,5 +102,8 @@ like(
qr[successfully skipped missing contrecord at],
"found log line in standby");
+# Verify promotion is successful
+$node_standby->safe_psql('postgres', "select pg_promote()");
+
$node->stop;
$node_standby->stop;
--
2.32.0