Re: add PROCESS_MAIN to VACUUM - Mailing list pgsql-hackers

From Michael Paquier
Subject Re: add PROCESS_MAIN to VACUUM
Date
Msg-id ZAA5vt7jUTRpPDmL@paquier.xyz
Whole thread Raw
In response to Re: add PROCESS_MAIN to VACUUM  (Nathan Bossart <nathandbossart@gmail.com>)
Responses Re: add PROCESS_MAIN to VACUUM  (Nathan Bossart <nathandbossart@gmail.com>)
List pgsql-hackers
On Wed, Mar 01, 2023 at 09:26:37AM -0800, Nathan Bossart wrote:
> Thanks for taking a look.
>
> On Wed, Mar 01, 2023 at 03:31:48PM +0900, Michael Paquier wrote:
> > PROCESS_TOAST has that:
> >     /* sanity check for PROCESS_TOAST */
> >     if ((params->options & VACOPT_FULL) != 0 &&
> >         (params->options & VACOPT_PROCESS_TOAST) == 0)
> >         ereport(ERROR,
> >                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
> >                  errmsg("PROCESS_TOAST required with VACUUM FULL")));
> > [...]
> > -   if (params->options & VACOPT_FULL)
> > +   if (params->options & VACOPT_FULL &&
> > +       params->options & VACOPT_PROCESS_MAIN)
> >     {
> >
> > Shouldn't we apply the same rule for PROCESS_MAIN?  One of the
> > regression tests added means that FULL takes priority over
> > PROCESS_MAIN=FALSE, which is a bit confusing IMO.
>
> I don't think so.  We disallow FULL without PROCESS_TOAST because there
> presently isn't a way to VACUUM FULL the main relation without rebuilding
> its TOAST table.  However, FULL without PROCESS_MAIN can be used to run
> VACUUM FULL on only the TOAST table.

-   if (params->options & VACOPT_FULL)
+   if (params->options & VACOPT_FULL &&
+       params->options & VACOPT_PROCESS_MAIN)
Perhaps this is a bit under-parenthesized, while reading through it
once again..

+   {
+       /* we force VACOPT_PROCESS_MAIN so vacuum_rel() processes it */
+       bool force_opt = ((params->options & VACOPT_PROCESS_MAIN) == 0);
+
+       params->options |= VACOPT_PROCESS_MAIN;
        vacuum_rel(toast_relid, NULL, params, true);
+       if (force_opt)
+           params->options &= ~VACOPT_PROCESS_MAIN;
Zigzagging with the centralized VacuumParams is a bit inelegant.
Perhaps it would be neater to copy VacuumParams and append
VACOPT_PROCESS_MAIN on the copy?

An extra question: should we check the behavior of the commands when
applying a list of relations to VACUUM?
--
Michael

Attachment

pgsql-hackers by date:

Previous
From: Masahiko Sawada
Date:
Subject: Re: add PROCESS_MAIN to VACUUM
Next
From: Amit Kapila
Date:
Subject: Re: Should vacuum process config file reload more often