Re: CREATE INDEX CONCURRENTLY does not index prepared xact's data
Noah Misch <noah@leadboat.com>
From: Noah Misch <noah@leadboat.com>
To: Andrey Borodin <x4mmm@yandex-team.ru>
Cc: Michael Paquier <michael@paquier.xyz>, Tom Lane <tgl@sss.pgh.pa.us>, pgsql-bugs@lists.postgresql.org
Date: 2021-07-21T17:55:30Z
Lists: pgsql-bugs
On Wed, Jul 21, 2021 at 01:13:08PM +0500, Andrey Borodin wrote: > > 21 июля 2021 г., в 02:49, Noah Misch <noah@leadboat.com> написал(а): > > On Wed, Jul 21, 2021 at 12:38:25AM +0500, Andrey Borodin wrote: > >>> 19 июля 2021 г., в 23:41, Andrey Borodin <x4mmm@yandex-team.ru> написал(а): > >>>> 19 июля 2021 г., в 23:10, Noah Misch <noah@leadboat.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.
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Improve contrib/amcheck's tests for CREATE INDEX CONCURRENTLY.
- b1f943d2aa7e 14.1 landed
- 7f580aa5d88a 15.0 landed
- 5a4b8a8a720c 13.5 landed
- 141cd0ef0b0b 12.9 landed
-
Fix minor memory leaks in pg_dump.
- 70bef494000e 15.0 cited
-
Avoid race in RelationBuildDesc() affecting CREATE INDEX CONCURRENTLY.
- e428699cb3be 9.6.24 landed
- db86746fd11e 10.19 landed
- 5141e471b36a 11.14 landed
- dde966efb286 14.1 landed
- 2e33b43599ad 13.5 landed
- 0869e53d3a07 12.9 landed
- fdd965d074d4 15.0 landed
-
Fix CREATE INDEX CONCURRENTLY for the newest prepared transactions.
- df6158139f64 11.14 landed
- 560124a37c2f 10.19 landed
- 5184932432b4 9.6.24 landed
- fe5d44a1d38f 12.9 landed
- a9d0a5409415 13.5 landed
- a5b9a0000e14 14.1 landed
- 3cd9c3b92197 15.0 landed
-
Add -w back to the flags for pg_ctl (re)start in PostgresNode
- b33259e261ae 15.0 cited
-
Fix CREATE INDEX CONCURRENTLY for simultaneous prepared transactions.
- 77a0e14f0b21 9.5.25 landed
- d683d6528dba 9.6.21 landed
- 179775135b41 10.16 landed
- d1ab4bf6ed2d 11.11 landed
- be843ce29737 12.6 landed
- 86a5b309c933 13.2 landed
- 8a54e12a38d1 14.0 landed