Re: Fix bug in multixact Oldest*MXactId initialization and access

Yura Sokolov <y.sokolov@postgrespro.ru>

From: Yura Sokolov <y.sokolov@postgrespro.ru>
To: "pgsql-hackers@lists.postgresql.org" <pgsql-hackers@lists.postgresql.org>
Cc: Heikki Linnakangas <hlinnaka@iki.fi>, Andres Freund <andres@anarazel.de>, Sami Imseih <samimseih@gmail.com>, Chao Li <li.evan.chao@gmail.com>
Date: 2026-02-26T16:22:06Z
Lists: pgsql-hackers

Attachments

Good day.

Sami Imseih, I've introduced new precalculated variables:

    MaxChildren = MaxBackends + NUM_AUXILIARY_PROCS;
    TotalProcs = MaxChildren + max_prepared_xacts;
    TotalXactProcs = MaxBackends + max_prepared_xacts;

and spread their usage through the sources.
I don't know how committers will accept this change. But they will
certainly make their own version of patch, so I don't bother much.

But I still use inline procs for access to the arrays. Asserts cost nothing
in release build. And new version of functions doesn't branch.

And you're right: looks like there were mistake in previous version so
GetOldestVisibleMXactId became unused. New version has no this mistake.

Chao Li, new access functions doen't branch because I've made separate
functions to store at slots for prepared transactions.

--

regards
Yura Sokolov aka funny-falcon

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Add test for row-locking and multixids with prepared transactions

  2. Skip prepared_xacts test if max_prepared_transactions < 2

  3. Fix OldestMemberMXactId and OldestVisibleMXactId array usage

  4. Redefine backend ID to be an index into the proc array

  5. Fix an old bug in multixact and two-phase commit. Prepared transactions can