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 <
[email protected]>
Reviewed-by: Kyotaro Horiguchi <[email protected]>
Reviewed-by: Álvaro Herrera <[email protected]>
Discussion: https://postgr.es/m/
44D259DE-7542-49C4-8A52-
2AB01534DCA9@amazon.com
(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),
# 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);
qr[successfully skipped missing contrecord at],
"found log line in standby");
+# Verify promotion is successful
+$node_standby->promote;
+
$node->stop;
$node_standby->stop;