Re: 'ERROR: attempted to update invisible tuple' from 'ALTER INDEX ... ATTACH PARTITION' on parent index
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Dilip Kumar <dilipbalaut@gmail.com>
Cc: Shruthi Gowda <gowdashru@gmail.com>, PostgreSQL Development <pgsql-hackers@postgresql.org>
Date: 2023-07-12T08:26:31Z
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 →
-
Add indisreplident to fields refreshed by RelationReloadIndexInfo()
- db9813819fe8 11.21 landed
- 7d27493b74c5 12.16 landed
- bdaaf1bf1d90 13.12 landed
- 7af65523ab8b 14.9 landed
- eb3abec4b67d 15.4 landed
- 27da47122075 16.0 landed
- a5ea825f958c 17.0 landed
-
Fix updates of indisvalid for partitioned indexes
- ed2b58c153bc 11.21 landed
- f1d6bcdd8fb5 12.16 landed
- c89d74c18b50 13.12 landed
- 954cc2139c03 14.9 landed
- c0dc97c7bfd1 15.4 landed
- 31f9d41d625d 16.0 landed
- 38ea6aa90e61 17.0 landed
On Wed, Jul 12, 2023 at 11:38:05AM +0530, Dilip Kumar wrote: > On Wed, Jul 12, 2023 at 11:12 AM Michael Paquier <michael@paquier.xyz> wrote: >> >> On Wed, Jul 12, 2023 at 09:38:41AM +0900, Michael Paquier wrote: >> > While working recently on what has led to cfc43ae and fc55c7f, I >> > really got the feeling that there could be some command sequences that >> > lacked some CCIs (or CommandCounterIncrement calls) to make sure that >> > the catalog updates are visible in any follow-up steps in the same >> > transaction. >> >> Wait a minute. The validation of a partitioned index uses a copy of >> the pg_index tuple from the relcache, which be out of date: >> newtup = heap_copytuple(partedIdx->rd_indextuple); >> ((Form_pg_index) GETSTRUCT(newtup))->indisvalid = true; > > But why the recache entry is outdated, does that mean that in the > previous command, we missed registering the invalidation for the > recache entry? Yes, something's still a bit off here, even if switching a partitioned index to become valid should use a fresh tuple copy from the syscache. Taking the test case of upthread, from what I can see, the ALTER TABLE .. REPLICA IDENTITY registers two relcache invalidations for pk_foo (via RegisterRelcacheInvalidation), which is the relcache entry whose stuff is messed up. I would have expected a refresh of the cache of pk_foo to happen when doing the ALTER INDEX .. ATTACH PARTITION, but for some reason it does not happen when running the whole in a transaction block. I cannot put my finger on what's wrong for the moment, but based on my current impressions the inval requests are correctly registered when switching the replica identity, but nothing about pk_foo is updated when attaching a partition to it in the last step where the invisible update happens :/ -- Michael