agora inbox for pgsql-committers@postgresql.org
help / color / mirror / Atom feedFrom: Fujii Masao <fujii@postgresql.org>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Fix unlogged sequence corruption after standby promotion
Date: Mon, 29 Jun 2026 23:54:29 +0000
Message-ID: <E1weLo5-000iGT-2R@gemulon.postgresql.org> (raw)
Fix unlogged sequence corruption after standby promotion
Previously, if an unlogged sequence was created on the primary and
replicated to a standby, reading the sequence after promoting the
standby (for example, with nextval()) could trigger the following
assertion failure:
TRAP: failed Assert("((const PageHeaderData *) page)->pd_special >= SizeOfPageHeaderData")
In non-assert builds, the same operation could instead fail with an
error such as:
ERROR: bad magic number in sequence
The problem was that seq_redo() updated the init fork page in shared
buffers but did not flush it to disk. During promotion,
ResetUnloggedRelations() recreates the main fork of unlogged
relations by copying the init fork from disk, bypassing shared
buffers. As a result, the main fork could be recreated from a stale
init fork instead of the WAL-replayed page.
Fix this by introducing a helper to flush init fork buffers
immediately, and make seq_redo() use it. As a result, the main fork
of an unlogged sequence is recreated from the up-to-date init fork on
disk, allowing the unlogged sequence to be read successfully after
standby promotion.
Backpatch to v15, where unlogged sequences were introduced.
Author: Fujii Masao <masao.fujii@gmail.com>
Reviewed-by: vignesh C <vignesh21@gmail.com>
Discussion: https://postgr.es/m/CAHGQGwH1Ssze3XM6wjoTjSLVOR041c6xP+vsdLP951=w8oG8bA@mail.gmail.com
Backpatch-through: 15
Branch
------
REL_16_STABLE
Details
-------
https://git.postgresql.org/pg/commitdiff/913d3b610ccdebe16178300327d0ba63d27d88a4
Modified Files
--------------
src/backend/access/hash/hash_xlog.c | 29 ++----------------
src/backend/access/transam/xlogutils.c | 26 ++++++++++++++++-
src/backend/commands/sequence.c | 1 +
src/include/access/xlogutils.h | 2 ++
src/test/recovery/meson.build | 1 +
.../recovery/t/054_unlogged_sequence_promotion.pl | 34 ++++++++++++++++++++++
6 files changed, 66 insertions(+), 27 deletions(-)
view thread (6+ messages) latest in thread
Message-ID: <E1weLo5-000iGT-2R@gemulon.postgresql.org>
Permalink: ../E1weLo5-000iGT-2R@gemulon.postgresql.org/
Also on: postgresql.org/message-id/E1weLo5-000iGT-2R@gemulon.postgresql.org
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-committers@postgresql.org
Cc: fujii@postgresql.org, pgsql-committers@lists.postgresql.org
Subject: Re: pgsql: Fix unlogged sequence corruption after standby promotion
In-Reply-To: <E1weLo5-000iGT-2R@gemulon.postgresql.org>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox