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:
parent
cd3a5055f9
commit
caaeb88ff7
@ -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),
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user