Re: REINDEX INDEX results in a crash for an index of pg_class since9.6
От | Michael Paquier |
---|---|
Тема | Re: REINDEX INDEX results in a crash for an index of pg_class since9.6 |
Дата | |
Msg-id | 20190423045609.GJ2712@paquier.xyz обсуждение исходный текст |
Ответ на | REINDEX INDEX results in a crash for an index of pg_class since 9.6 (Michael Paquier <michael@paquier.xyz>) |
Список | pgsql-hackers |
On Thu, Apr 18, 2019 at 10:14:30AM +0900, Michael Paquier wrote: > Doing a REINDEX TABLE directly on pg_class proves to work correctly, > and CONCURRENTLY is not supported for catalog tables. > > Bisecting my way through it, the first commit causing the breakage is > that: > commit: 01e386a325549b7755739f31308de4be8eea110d > author: Tom Lane <tgl@sss.pgh.pa.us> > date: Wed, 23 Dec 2015 20:09:01 -0500 > Avoid VACUUM FULL altogether in initdb. This brings down to a first, simple, solution which is to issue a VACUUM FULL on pg_class at the end of make_template0() in initdb.c to avoid any subsequent problems if trying to issue a REINDEX on anything related to pg_class, and it won't fix any existing deployments: --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -2042,6 +2042,11 @@ make_template0(FILE *cmdfd) * Finally vacuum to clean up dead rows in pg_database */ "VACUUM pg_database;\n\n", + + /* + * And rebuild pg_class. + */ + "VACUUM FULL pg_class;\n\n", NULL }; Now... > The reason why this does not work is that CatalogIndexInsert() tries > to do an index_insert directly on the index worked on. And the reason > why this works at table level is that we have tweaks in > reindex_relation() to enforce the list of valid indexes in the > relation cache with RelationSetIndexList(). It seems to me that the > logic in reindex_index() is wrong from the start, and that all the > index list handling done in reindex_relation() should just be in > reindex_index() so as REINDEX INDEX gets the right call. I got to wonder if this dance with the relation cache is actually necessary, because we could directly tell CatalogIndexInsert() to not insert a tuple into an index which is bring rebuilt, and the index rebuild would cause an entry to be added to pg_class anyway thanks to RelationSetNewRelfilenode(). This can obviously only happen for pg_class indexes. Any thoughts about both approaches? -- Michael
Вложения
В списке pgsql-hackers по дате отправления: