]> git.ipfire.org Git - thirdparty/postgresql.git/commit
Fix duplicate arbiter detection during REINDEX CONCURRENTLY on partitions
authorÁlvaro Herrera <alvherre@kurilemu.de>
Wed, 28 Jan 2026 13:38:53 +0000 (14:38 +0100)
committerÁlvaro Herrera <alvherre@kurilemu.de>
Wed, 28 Jan 2026 13:38:53 +0000 (14:38 +0100)
commite6d6e32f4240bb967460aabdd2db51181cff242f
treeb23f9ac342880e6348231f3da4c030ce34c2b67d
parente3094679b9835fed2ea5c7d7877e8ac8e7554d33
Fix duplicate arbiter detection during REINDEX CONCURRENTLY on partitions

Commit 90eae926a fixed ON CONFLICT handling during REINDEX CONCURRENTLY
on partitioned tables by treating unparented indexes as potential
arbiters.  However, there's a remaining race condition: when pg_inherits
records are swapped between consecutive calls to get_partition_ancestors(),
two different child indexes can appear to have the same parent, causing
duplicate entries in the arbiter list and triggering "invalid arbiter
index list" errors.

Note that this is not a new problem introduced by 90eae926a.  The same
error could occur before that commit in a slightly different scenario:
an index is selected during planning, then index_concurrently_swap()
commits, and a subsequent call to get_partition_ancestors() uses a new
catalog snapshot that sees zero ancestors for that index.

Fix by tracking which parent indexes have already been processed.  If a
subsequent call to get_partition_ancestors() returns a parent we've
already seen, treat that index as unparented instead, allowing it to be
matched via IsIndexCompatibleAsArbiter() like other concurrent reindex
scenarios.

Author: Mihail Nikalayeu <mihailnikalayeu@gmail.com>
Reported-by: Alexander Lakhin <exclusion@gmail.com>
Reviewed-by: Álvaro Herrera <alvherre@kurilemu.de>
Discussion: https://postgr.es/m/e5a8c1df-04e5-4343-85ef-5df2a7e3d90c@gmail.com
src/backend/executor/execPartition.c
src/test/modules/test_misc/t/010_index_concurrently_upsert.pl