Re: CREATE INDEX CONCURRENTLY does not index prepared xact's data

From: Noah Misch <noah(at)leadboat(dot)com>
To: Andrey Borodin <x4mmm(at)yandex-team(dot)ru>
Cc: Michael Paquier <michael(at)paquier(dot)xyz>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-bugs(at)lists(dot)postgresql(dot)org
Subject: Re: CREATE INDEX CONCURRENTLY does not index prepared xact's data
Date: 2021-07-21 17:55:30
Message-ID: 20210721175530.GA1090577@gust.leadboat.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On Wed, Jul 21, 2021 at 01:13:08PM +0500, Andrey Borodin wrote:
> > 21 июля 2021 г., в 02:49, Noah Misch <noah(at)leadboat(dot)com> написал(а):
> > On Wed, Jul 21, 2021 at 12:38:25AM +0500, Andrey Borodin wrote:
> >>> 19 июля 2021 г., в 23:41, Andrey Borodin <x4mmm(at)yandex-team(dot)ru> написал(а):
> >>>> 19 июля 2021 г., в 23:10, Noah Misch <noah(at)leadboat(dot)com> написал(а):
> >>>> Suppose we
> >>>> have three PGPROC entries with the same VXID, two prepared transactions and
> >>>> one regular transaction. Waiting for all three could be tolerable, though
> >>>> avoiding that would be nice. Should we follow transactions differently to
> >>>> avoid that?
> >>>
> >>> We don’t have to wait for regular Xid in this case at all. Because it would be finished with VXID.
> >
> > I don't understand those two sentences. Could you write more?
> Suppose we have a VXID conflicting with reindexed relation lock, and have a PGPROC with regular Xid (not 2PC) for this VXID.
> We do not need to return this xid from TwoPhaseGetXidByVXid() for extra wait. This situation is covered by normal vxid handling in VirtualXactLock().
> + /* Save the xid to test if transaction coverted to 2pc later */
> + xid = proc->xid;

Got it.

> > Would it work to do the following sequence in WaitForLockers()?
> >
> > 1. In GetLockConflicts(), record a list of conflicting XIDs. Also record a
> > list of conflicting LXIDs having no XID.
> > 2. Wait on all LXIDs recorded in (1). They have either ended or converted to
> > prepared transactions.
> > 3. Inner-join the present list of prepared transactions with the list of
> > LXIDs from (1). Record the XIDs of matched entries.
> > 4. Wait on all XIDs recorded in (1) and (3).
> >
> > While that may wait on some prepared XIDs needlessly, it can't degrade into
> > persistent starvation. We could reduce the chance of a needless XID wait by
> > remembering the list of old prepared XIDs before (1) and not adding any of
> > those remembered, old XIDs in (3). That last bit probably would be
> > unjustified complexity, but maybe not.
> I think this protocol is equivalent to waiting on all Xids with VXid.
> I consider this protocol safe. FPA implementation.
> Patch 0001 is intact version of previous patch.
> There are two additions:
> 1. Prefer xids to vxids in GetLockConflicts()
> 2. Wait on all 2PCs with given VXid.

These drafts use reasonable concepts. Would you develop them into a
ready-to-commit patch? You may be able to translate your probabilistic test
procedures from https://gist.github.com/x4m/8b6025995eedf29bf588727375014dfc
into something like the src/bin/pgbench/t/001_pgbench_with_server.pl test of
pg_enum_oid_index.

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message PG Bug reporting form 2021-07-21 19:38:02 BUG #17118: ALTER TABLE doesn't discard redundant UNIQUE constraints as CREATE TABLE will
Previous Message Andres Freund 2021-07-21 16:59:27 Re: BUG #16696: Backend crash in llvmjit