Re: CREATE INDEX CONCURRENTLY does not index prepared xact's data
Andrey Borodin <x4mmm@yandex-team.ru>
From: Andrey Borodin <x4mmm@yandex-team.ru>
To: Michael Paquier <michael@paquier.xyz>
Cc: Tom Lane <tgl@sss.pgh.pa.us>,
pgsql-bugs@lists.postgresql.org
Date: 2020-12-21T07:24:55Z
Lists: pgsql-bugs
Attachments
- v3-0001-Wait-for-prepared-xacts-in-CREATE-INDEX-CONCURREN.patch (application/octet-stream) patch v3-0001
- v3-0002-Add-test-for-CIC-with-prepared-xacts.patch (application/octet-stream) patch v3-0002
> 21 дек. 2020 г., в 10:40, Michael Paquier <michael@paquier.xyz> написал(а): > >> In general, I wonder whether WaitForLockersMultiple and GetLockConflicts >> need to gain an additional parameter indicating whether to consider >> prepared xacts. It's not clear to me that their current behavior is wrong >> for all possible uses. > > WaitForLockers is used only by REINDEX and CREATE/DROP CONCURRENTLY, > where it seems to me we need to care about all the cases related to > concurrent build, validation and index drop. The other caller of > GetLockConflicts() is for conflict resolution in standbys where it is > fine to ignore 2PC transactions as these cannot be cancelled. I don't think that fact that we cannot cancel transaction is sufficient here to ignore prepared transaction. I think there should not exist any prepared transaction that we need to cancel in standby conflict resolution. And if it exists - it's a sign of corruption, we could emit warning or something like that. But I'm really not an expert here, just a common sense that prepared transaction is just like regular transaction that survives crash. If we wait for any transaction - probably we should wait for prepared too. I'm not insisting on anything though. > So I > agree that we are going to need more control with a new option > argument to be able to control if 2PC transactions are ignored or > not. > > Hmm. The approach taken by the patch looks to be back-patchable. > Based on the lack of complaints on the matter, we could consider > instead putting an error in WaitForLockersMultiple() if there is at > least one numPrepXact which would at least avoid inconsistent data. > But I don't think what's proposed here is bad either. > > VirtualTransactionIdIsValidOrPreparedXact() is confusing IMO, knowing > that VirtualTransactionIdIsPreparedXact() combined with > LocalTransactionIdIsValid() would be enough to do the job. > > - Assert(VirtualTransactionIdIsValid(vxid)); > + Assert(VirtualTransactionIdIsValidOrPreparedXact(vxid)); > + > + if (VirtualTransactionIdIsPreparedXact(vxid)) > [...] > #define VirtualTransactionIdIsPreparedXact(vxid) \ > ((vxid).backendId == InvalidBackendId) > This would allow the case where backendId and localTransactionId are > both invalid. So it would be better to also check in > VirtualTransactionIdIsPreparedXact() that the XID is not invalid, no? Seems valid. Removed VirtualTransactionIdIsValidOrPreparedXact() from patch. Thanks! Best regards, Andrey Borodin.
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