Re: Issues with ON CONFLICT UPDATE and REINDEX CONCURRENTLY

Mihail Nikalayeu <michail.nikolaev@gmail.com>

From: Michail Nikolaev <michail.nikolaev@gmail.com>
To: Michael Paquier <michael@paquier.xyz>
Cc: PostgreSQL Hackers <pgsql-hackers@postgresql.org>
Date: 2024-06-14T13:30:55Z
Lists: pgsql-hackers

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Replace flaky CIC/RI isolation tests with a TAP test

  2. Disable recently added CIC/RI isolation tests

  3. Fix infer_arbiter_index for partitioned tables

  4. Stabilize tests some more

  5. Put back alternative-output expected files

  6. Remove doc and code comments about ON CONFLICT deficiencies

  7. Avoid use of NOTICE to wait for snapshot invalidation

  8. Fix ON CONFLICT with REINDEX CONCURRENTLY and partitions

  9. Fix ON CONFLICT ON CONSTRAINT during REINDEX CONCURRENTLY

  10. Fix new test for CATCACHE_FORCE_RELEASE builds

  11. Improve test case stability

  12. Fix infer_arbiter_index during concurrent index operations

  13. Doc: cover index CONCURRENTLY causing errors in INSERT ... ON CONFLICT.

  14. Fix infer_arbiter_indexes() to not assume resultRelation is 1.

  15. Revert temporal primary keys and foreign keys

Attachments

Hello.

> But I was unable to reproduce that using some random usleep(), however -
maybe it is a wrong assumption.
It seems like the assumption is correct - we may use an invalid index as
arbiter due to race condition.

The attached patch adds a check for that case, and now the test fails like
this:

    # pgbench: error: client 16 script 1 aborted in command 1 query 0:
ERROR:  duplicate key value violates unique constraint "tbl_pkey_ccold"
    # DETAIL:  Key (i)=(42) already exists.
    # pgbench: error: client 9 script 1 aborted in command 1 query 0:
ERROR:  ON CONFLICT does not support invalid indexes as arbiters
    # pgbench: error: client 0 script 2 aborted in command 1 query 0:
ERROR:  duplicate key value violates unique constraint "tbl_pkey"
    # DETAIL:  Key (i)=(69) already exists.
    # pgbench: error: client 7 script 0 aborted in command 1 query 0:
ERROR:  ON CONFLICT does not support invalid indexes as arbiters
    # pgbench: error: client 10 script 0 aborted in command 1 query 0:
ERROR:  ON CONFLICT does not support invalid indexes as arbiters
    # pgbench: error: client 11 script 0 aborted in command 1 query 0:
ERROR:  ON CONFLICT does not support invalid indexes as arbiters

I think It is even possible to see !alive index in the same situation (it
is worse case), but I was unable to reproduce it so far.

Best regards,
Mikhail.