]> git.ipfire.org Git - thirdparty/postgresql.git/commit
Correct logical decoding status at end of recovery with minimal WAL level.
authorMasahiko Sawada <msawada@postgresql.org>
Thu, 16 Jul 2026 19:13:16 +0000 (12:13 -0700)
committerMasahiko Sawada <msawada@postgresql.org>
Thu, 16 Jul 2026 19:13:16 +0000 (12:13 -0700)
commitbaf0ec4652c2c42c76cf108bb95860b61c1eff16
tree315f41e23b5fa51133166ed2facb411bb4ff4f76
parent2a933deaa23bff4245c327bc8e9f4676095d0f6c
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 <yanggq1988@126.com>
Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com>
Discussion: https://postgr.es/m/CAD21AoAnPAugUnDic+ESvrfXjXHk2bss9eHAD7zP0-Chy2UabA@mail.gmail.com
Backpatch-through: 19
src/backend/replication/logical/logicalctl.c