Re: [HACKERS] [PATCH] Vacuum: Update FSM more frequently - Mailing list pgsql-hackers

From Claudio Freire
Subject Re: [HACKERS] [PATCH] Vacuum: Update FSM more frequently
Date
Msg-id CAGTBQpZrr+rHKXsCFv9K=SKt0qjvK3v8+7evpvaY_hDpdanebA@mail.gmail.com
Whole thread Raw
In response to Re: [HACKERS] [PATCH] Vacuum: Update FSM more frequently  (Masahiko Sawada <sawada.mshk@gmail.com>)
Responses Re: [HACKERS] [PATCH] Vacuum: Update FSM more frequently
Re: [HACKERS] [PATCH] Vacuum: Update FSM more frequently
List pgsql-hackers
On Mon, Feb 26, 2018 at 6:00 AM, Masahiko Sawada <sawada.mshk@gmail.com> wrote:
> Here is review comment for v4 patch.
>
> @@ -1922,6 +1988,8 @@ count_nondeletable_pages(Relation onerel,
> LVRelStats *vacrelstats)
>                  * We don't insert a vacuum delay point here, because we have an
>                  * exclusive lock on the table which we want to hold
> for as short a
>                  * time as possible.  We still need to check for
> interrupts however.
> +                * We might have to acquire the autovacuum lock,
> however, but that
> +                * shouldn't pose a deadlock risk.
>                  */
>                 CHECK_FOR_INTERRUPTS();
>
> Is this change necessary?

I don't recall doing that change. Maybe a rebase gone wrong.

> ----
> +               /*
> +                * If there are no indexes then we should periodically
> vacuum the FSM
> +                * on huge relations to make free space visible early.
> +                */
> +               if (nindexes == 0 &&
> +                       (vacuumed_pages - vacuumed_pages_at_fsm_vac) >
> vacuum_fsm_every_pages)
> +               {
> +                       /* Vacuum the Free Space Map */
> +                       FreeSpaceMapVacuum(onerel, max_freespace);
> +                       vacuumed_pages_at_fsm_vac = vacuumed_pages;
> +                       max_freespace = 0;
> +               }
>
> I think this code block should be executed before we check if the page
> is whether new or empty and then do 'continue'. Otherwise we cannot
> reach this code if the table has a lot of new or empty pages.

In order for the counter (vacuumed_pages) to increase, there have to
be plenty of opportunities for this code to run, and I specifically
wanted to avoid vacuuming the FSM too often for those cases
particularly (when Vacuum scans lots of pages but does no writes).

> ----
> @@ -663,6 +663,8 @@ fsm_extend(Relation rel, BlockNumber fsm_nblocks)
>   * If minValue > 0, the updated page is also searched for a page with at
>   * least minValue of free space. If one is found, its slot number is
>   * returned, -1 otherwise.
> + *
> + * If minValue == 0, the value at the root node is returned.
>   */
>  static int
>  fsm_set_and_search(Relation rel, FSMAddress addr, uint16 slot,
> @@ -687,6 +689,8 @@ fsm_set_and_search(Relation rel, FSMAddress addr,
> uint16 slot,
>
> addr.level == FSM_BOTTOM_LEVEL,
>                                                                    true);
>         }
> +       else
> +               newslot = fsm_get_avail(page, 0);
>
> I think it's not good idea to make fsm_set_and_search return either a
> slot number or a category value according to the argument. Category
> values is actually uint8 but this function returns it as int.

Should be fine, uint8 can be contained inside an int in all platforms.

> Also we
> can call fsm_set_and_search with minValue = 0 at
> RecordAndGetPageWithFreeSpace() when search_cat is 0. With you patch,
> fsm_set_and_search() then returns the root value but it's not correct.

I guess I can add another function to do that.

> Also, is this change necessary for this patch? ISTM this change is
> used for the change in fsm_update_recursive() as follows but I guess
> this change can be a separate patch.
>
> +       new_cat = fsm_set_and_search(rel, parent, parentslot, new_cat, 0);
> +
> +       /*
> +        * Bubble up, not the value we just set, but the one now in the root
> +        * node of the just-updated page, which is the page's highest value.
> +        */

I can try to separate them I guess.


pgsql-hackers by date:

Previous
From: Amit Kapila
Date:
Subject: Re: Contention preventing locking
Next
From: Robert Haas
Date:
Subject: Re: [HACKERS] Partition-wise aggregation/grouping