1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-29 13:56:47 +03:00

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
This commit is contained in:
Alvaro Herrera 2022-03-23 18:22:10 +01:00
parent cd3a5055f9
commit caaeb88ff7
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE
2 changed files with 8 additions and 1 deletions

View File

@ -10592,6 +10592,10 @@ VerifyOverwriteContrecord(xl_overwrite_contrecord *xlrec, XLogReaderState *state
LSN_FORMAT_ARGS(xlrec->overwritten_lsn), LSN_FORMAT_ARGS(xlrec->overwritten_lsn),
LSN_FORMAT_ARGS(state->overwrittenRecPtr)); LSN_FORMAT_ARGS(state->overwrittenRecPtr));
/* We have safely skipped the aborted record */
abortedRecPtr = InvalidXLogRecPtr;
missingContrecPtr = InvalidXLogRecPtr;
ereport(LOG, ereport(LOG,
(errmsg("successfully skipped missing contrecord at %X/%X, overwritten at %s", (errmsg("successfully skipped missing contrecord at %X/%X, overwritten at %s",
LSN_FORMAT_ARGS(xlrec->overwritten_lsn), LSN_FORMAT_ARGS(xlrec->overwritten_lsn),

View File

@ -15,7 +15,7 @@ plan tests => 3;
# Test: Create a physical replica that's missing the last WAL file, # Test: Create a physical replica that's missing the last WAL file,
# then restart the primary to create a divergent WAL file and observe # then restart the primary to create a divergent WAL file and observe
# that the replica replays the "overwrite contrecord" from that new # that the replica replays the "overwrite contrecord" from that new
# file. # file and the standby promotes successfully.
my $node = PostgresNode->get_new_node('primary'); my $node = PostgresNode->get_new_node('primary');
$node->init(allows_streaming => 1); $node->init(allows_streaming => 1);
@ -102,5 +102,8 @@ like(
qr[successfully skipped missing contrecord at], qr[successfully skipped missing contrecord at],
"found log line in standby"); "found log line in standby");
# Verify promotion is successful
$node_standby->promote;
$node->stop; $node->stop;
$node_standby->stop; $node_standby->stop;