Re: REINDEX SCHEMA/DATABASE/SYSTEM weak with dropped relations - Mailing list pgsql-hackers

From Anastasia Lubennikova
Subject Re: REINDEX SCHEMA/DATABASE/SYSTEM weak with dropped relations
Date
Msg-id c7887cb7-8a51-ce31-aac7-40f0e21935fd@postgrespro.ru
Whole thread Raw
In response to REINDEX SCHEMA/DATABASE/SYSTEM weak with dropped relations  (Michael Paquier <michael@paquier.xyz>)
Responses Re: REINDEX SCHEMA/DATABASE/SYSTEM weak with dropped relations
List pgsql-hackers
On 13.08.2020 07:38, Michael Paquier wrote:
> Hi all,
>
> While working on support for REINDEX for partitioned relations, I have
> noticed an old bug in the logic of ReindexMultipleTables(): the list
> of relations to process is built in a first transaction, and then each
> table is done in an independent transaction, but we don't actually
> check that the relation still exists when doing the real work.  I
> think that a complete fix involves two things:
> 1) Addition of one SearchSysCacheExists1() at the beginning of the
> loop processing each item in the list in ReindexMultipleTables().
> This would protect from a relation dropped, but that would not be
> enough if ReindexMultipleTables() is looking at a relation dropped
> before we lock it in reindex_table() or ReindexRelationConcurrently().
> Still that's simple, cheaper, and would protect from most problems.
> 2) Be completely water-proof and adopt a logic close to what we do for
> VACUUM where we try to open a relation, but leave if it does not
> exist.  This can be achieved with just some try_relation_open() calls
> with the correct lock used, and we also need to have a new
> REINDEXOPT_* flag to control this behavior conditionally.
>
> 2) and 1) are complementary, but 2) is invasive, so based on the lack
> of complaints we have seen that does not seem really worth
> backpatching to me, and I think that we could also just have 1) on
> stable branches as a minimal fix, to take care of most of the
> problems that could show up to users.
>
> Attached is a patch to fix all that, with a cheap isolation test that
> fails on HEAD with a cache lookup failure.  I am adding that to the
> next CF for now, and I would rather fix this issue before moving on
> with REINDEX for partitioned relations as fixing this issue reduces
> the use of session locks for partition trees.
>
> Any thoughts?
> --
> Michael

Hi,
I reviewed the patch. It does work and the code is clean and sane. It 
implements a logic that we already had in CLUSTER, so I think it was 
simply an oversight. Thank you for fixing this.

I noticed that REINDEXOPT_MISSING_OK can be passed to the TOAST table 
reindex. I think it would be better to reset the flag in this 
reindex_relation() call, as we don't expect a concurrent DROP here.

     /*
      * If the relation has a secondary toast rel, reindex that too while we
      * still hold the lock on the main table.
      */
     if ((flags & REINDEX_REL_PROCESS_TOAST) && OidIsValid(toast_relid))
         result |= reindex_relation(toast_relid, flags, options);


-- 
Anastasia Lubennikova
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company




pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: file_fdw vs relative paths
Next
From: Tomas Vondra
Date:
Subject: Re: list of extended statistics on psql