pgsql: Avoid update conflict out serialization anomalies.

From: Peter Geoghegan <pg(at)bowt(dot)ie>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Avoid update conflict out serialization anomalies.
Date: 2020-06-11 17:11:07
Message-ID: E1jjQjL-00011Y-2K@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Avoid update conflict out serialization anomalies.

SSI's HeapCheckForSerializableConflictOut() test failed to correctly
handle conditions involving a concurrently inserted tuple which is later
concurrently updated by a separate transaction . A SELECT statement
that called HeapCheckForSerializableConflictOut() could end up using the
same XID (updater's XID) for both the original tuple, and the successor
tuple, missing the XID of the xact that created the original tuple
entirely. This only happened when neither tuple from the chain was
visible to the transaction's MVCC snapshot.

The observable symptoms of this bug were subtle. A pair of transactions
could commit, with the later transaction failing to observe the effects
of the earlier transaction (because of the confusion created by the
update to the non-visible row). This bug dates all the way back to
commit dafaa3ef, which added SSI.

To fix, make sure that we check the xmin of concurrently inserted tuples
that happen to also have been updated concurrently.

Author: Peter Geoghegan
Reported-By: Kyle Kingsbury
Reviewed-By: Thomas Munro
Discussion: https://postgr.es/m/db7b729d-0226-d162-a126-8a8ab2dc4443@jepsen.io
Backpatch: All supported versions

Branch
------
REL_12_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/e620a38c23b9f7338d93ffd4c51bacc31973ac35

Modified Files
--------------
src/backend/storage/lmgr/predicate.c | 21 +++++++--
.../isolation/expected/update-conflict-out.out | 27 +++++++++++
src/test/isolation/isolation_schedule | 1 +
src/test/isolation/specs/update-conflict-out.spec | 54 ++++++++++++++++++++++
4 files changed, 98 insertions(+), 5 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Jeff Davis 2020-06-11 20:05:17 pgsql: Rework HashAgg GUCs.
Previous Message Peter Eisentraut 2020-06-11 12:19:47 pgsql: pg_dump: Remove dead code