Re: Issues with ON CONFLICT UPDATE and REINDEX CONCURRENTLY
Mihail Nikalayeu <michail.nikolaev@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Replace flaky CIC/RI isolation tests with a TAP test
- e1c971945d62 19 (unreleased) landed
-
Disable recently added CIC/RI isolation tests
- 77038d6d0b49 19 (unreleased) landed
-
Fix infer_arbiter_index for partitioned tables
- 81f72115cf18 19 (unreleased) landed
-
Stabilize tests some more
- a4a0fa0c7587 19 (unreleased) landed
-
Put back alternative-output expected files
- be25c7767728 19 (unreleased) landed
-
Remove doc and code comments about ON CONFLICT deficiencies
- 758479213d57 19 (unreleased) landed
-
Avoid use of NOTICE to wait for snapshot invalidation
- 5dee7a603f66 19 (unreleased) landed
-
Fix ON CONFLICT with REINDEX CONCURRENTLY and partitions
- 90eae926abbb 19 (unreleased) landed
-
Fix ON CONFLICT ON CONSTRAINT during REINDEX CONCURRENTLY
- 2bc7e886fc1b 19 (unreleased) landed
-
Fix new test for CATCACHE_FORCE_RELEASE builds
- 9e8fa05d3412 19 (unreleased) landed
-
Improve test case stability
- 417ac9c1eeeb 19 (unreleased) landed
-
Fix infer_arbiter_index during concurrent index operations
- bc32a12e0db2 19 (unreleased) landed
-
Doc: cover index CONCURRENTLY causing errors in INSERT ... ON CONFLICT.
- 438ccd33a37a 13.23 landed
- faba2595d619 14.20 landed
- e1dd1f924e19 15.15 landed
- 4c2895629f6f 16.11 landed
- 46524d519a2d 18.1 landed
- 27f714b5dad7 17.7 landed
- 8b18ed6dfbb8 19 (unreleased) landed
-
Fix infer_arbiter_indexes() to not assume resultRelation is 1.
- 915de706d28c 17.0 cited
-
Revert temporal primary keys and foreign keys
- 8aee330af55d 17.0 cited
Attachments
- v3-0002-Modify-the-infer_arbiter_indexes-function-to-cons.patch (text/x-patch) patch v3-0002
- v3-0001-Specs-top-reproduce-the-issues-with-CREATE-INDEX-.patch (text/x-patch) patch v3-0001
- v3-0003-Modify-the-infer_arbiter_indexes-function-to-also.patch (text/x-patch) patch v3-0003
- v3-0004-Modify-the-ExecInitPartitionInfo-function-to-cons.patch (text/x-patch) patch v3-0004
- stress_test.__patch__ (application/octet-stream)
Hello, everyone! This patch set addresses the issues discussed in this thread. The main idea behind this fix is that it is safe to consider indisready indexes alongside indisvalid indexes as arbiter indexes. However, it's crucial that at least one fully valid index is present. Why is it necessary to consider indisready during the planning phase? The reason is that these indexes are required for correct processing during the execution phase. If "ready" indexes are skipped as arbiters by one transaction, they may already have become "valid" for another concurrent transaction during its planning phase. As a result, both transactions could concurrently process the UPSERT command with different sets of arbiters (while using the same set of indexes for tuple insertion later). This can lead to unexpected "duplicate key value violates unique constraint" errors and deadlocks. Is it safe to use a "ready" but not yet "valid" index as an arbiter? Yes, as long as at least one "valid" index is also used as an arbiter. The valid index ensures the correctness of the UPSERT logic, while the "ready" index contains an equal or lesser number of tuples, making it safe for speculative insertion. In any case, the insert to that index will be processed during ExecInsertIndexTuples one way or another (with applyNoDupErr or without). Fix is divided into a few patches, each following this logic: 1) The first patch provides specs (and injection points) for the various scenarios related to the issue. 2) The second patch introduces a straightforward change—adding indisready indexes to arbiters alongside indisvalid. However, at least one indisvalid is still required. This resolves simple cases involving REINDEX CONCURRENTLY and CREATE INDEX CONCURRENTLY. 3) The third patch deals with named constraints. Instead of relying solely on the index with the specified name, we attempt to find other indexes that are equivalent in terms of being used as an arbiter. 4) This patch fixes a scenario involving partitioned tables. Special checks are required for partitioned indexes, which may be processed by REINDEX CONCURRENTLY. Additionally, a patch with three extra TAP specifications for stress testing is attached. This patch is not intended for commitment, so I renamed the extension to prevent accidental application in some CI/DI jobs. > Also, it is possible to look at the patches on GitHub: https://github.com/postgres/postgres/compare/master...michail-nikolaev:postgres:reindex_concurrently_with_upsert Best regards, Mikhail.