agora inbox for pgsql-committers@postgresql.org  
help / color / mirror / Atom feed
From: Álvaro Herrera <alvherre@kurilemu.de>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Wait for transactions of an initial decoding snapshot to commit
Date: Thu, 24 Sep 2026 10:25:26 +0000
Message-ID: <E1x9gdq-000000012w0-2tQC@gemulon.postgresql.org> (raw)

Wait for transactions of an initial decoding snapshot to commit

SnapBuildInitialSnapshot() converts the snapshot builder's list of
committed transactions into a regular MVCC snapshot, which is then used
with HeapTupleSatisfiesMVCC().  However, a snapshot produced that way
and used as an MVCC snapshot can potentially cause data corruption, if
it captures a transaction after it writes its commit WAL record but
before it has updated its CLOG entry: it will be incorrectly used to set
hint bits as if that transaction had aborted.

Fix by having SnapBuildInitialSnapshot() wait until such transactions
have removed themselves from procarray, which guarantees correct
visibility.

Other uses of SnapBuildBuildSnapshot only use the snapshot as
historical, so they don't need the waits, but add commentary in that
function to alert possible future callers.

While at this, backpatch commit 504fe10d1d26, "Fix misplaced comment in
snapbuild.c."  The comment it moved was nearby the place we modify.

This bug was diagnosed by stress-testing of REPACK (CONCURRENTLY) in
branch 19, so add a test case that tickles it using that feature in that
branch and master.  However, the bug exists in all branches, and in
branch 18 we can add a test with regular logical decoding using
injection points that tickles it.  Unfortunately that test cannot be
backpatched to earlier branches for lack of facilities.

Reported-by: Mihail Nikalayeu <mihailnikalayeu@gmail.com>
Author: Antonin Houska <ah@cybertec.at>
Author: Rui Zhao <zhaorui126@gmail.com>
Backpatch-through: 14
Discussion: https://postgr.es/m/85833.1768840165@localhost
Discussion: https://postgr.es/m/CADzfLwU78as45To9a%3D-Qkr5jEg3tMxc5rUtdKy2MTv4r_SDGng%40mail.gmail.com

Branch
------
REL_19_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/4a4bf490dc50600462979d1e8ba7255a5975dbc1

Modified Files
--------------
src/backend/access/transam/xact.c                  |  10 ++
src/backend/replication/logical/snapbuild.c        |  46 ++++++-
src/test/modules/injection_points/Makefile         |   1 +
.../expected/repack_commit_race.out                |  64 +++++++++
.../modules/injection_points/injection_points.c    |  11 +-
src/test/modules/injection_points/meson.build      |   1 +
.../injection_points/specs/repack_commit_race.spec |  95 +++++++++++++
src/test/recovery/meson.build                      |   1 +
src/test/recovery/t/057_snapshot_commit_race.pl    | 148 +++++++++++++++++++++
9 files changed, 371 insertions(+), 6 deletions(-)



view thread (7+ messages)

Message-ID: <E1x9gdq-000000012w0-2tQC@gemulon.postgresql.org>
Permalink:  ../E1x9gdq-000000012w0-2tQC@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1x9gdq-000000012w0-2tQC@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: alvherre@kurilemu.de, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: Wait for transactions of an initial decoding snapshot to commit
  In-Reply-To: <E1x9gdq-000000012w0-2tQC@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