Correct logical decoding status at end of recovery with minimal WAL level. Crash recovery running with wal_level='minimal' can replay an XLOG_LOGICAL_DECODING_STATUS_CHANGE record that activates logical decoding, if the server previously ran with a higher wal_level and crashed after the last logical slot was dropped but before the checkpointer deactivated logical decoding. Replaying such a record is correct since it reflects the status at the time it was written. However, UpdateLogicalDecodingStatusEndOfRecovery() asserted that logical decoding is never active with wal_level='minimal', causing an assertion failure at the end of recovery. In production builds, logical decoding would remain active while running with wal_level='minimal'.
Instead of special-casing wal_level='minimal', recompute the status at the end of recovery as usual: no logical slot can exist with wal_level='minimal' as RestoreSlotFromDisk() would have rejected it, so the recomputation always deactivates logical decoding in this case, also writing the corresponding status change record. Oversight in 67c20979ce7. Reviewed-by: Guoqing Yang <[email protected]> Reviewed-by: Hayato Kuroda <[email protected]> Discussion: https://postgr.es/m/cad21aoanpaugundic+esvrfxjxhk2bss9ehad7zp0-chy2u...@mail.gmail.com Backpatch-through: 19 Branch ------ REL_19_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/baf0ec4652c2c42c76cf108bb95860b61c1eff16 Modified Files -------------- src/backend/replication/logical/logicalctl.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
