diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2022-03-23 18:22:10 +0100 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2022-03-23 18:22:10 +0100 |
commit | c714ebd0e8c1fc8f85cc401b0e9859b6f79900fd (patch) | |
tree | 0c201509732924eecec1393bacd25ab2518684b2 /src | |
parent | bd19ab257ce1b7b945f6c663977665ece99abb65 (diff) | |
download | postgresql-c714ebd0e8c1fc8f85cc401b0e9859b6f79900fd.tar.gz postgresql-c714ebd0e8c1fc8f85cc401b0e9859b6f79900fd.zip |
Fix "missing continuation record" after standby promotion
Invalidate abortedRecPtr and missingContrecPtr after a missing
continuation record is successfully 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.
Backpatch to 10 (all stable versions).
Author: Sami Imseih <simseih@amazon.com>
Reviewed-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Reviewed-by: Álvaro Herrera <alvherre@alvh.no-ip.org>
Discussion: https://postgr.es/m/44D259DE-7542-49C4-8A52-2AB01534DCA9@amazon.com
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/transam/xlog.c | 4 | ||||
-rw-r--r-- | src/test/recovery/t/026_overwrite_contrecord.pl | 5 |
2 files changed, 8 insertions, 1 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index a30314bc830..330aa9ddd04 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -10149,6 +10149,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 867b75937eb..693f7dff877 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->promote; + $node->stop; $node_standby->stop; |