Re: pg_stat_statements issue with parallel maintenance (Was Re: WAL usage calculation patch)

From: Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>
To: Dilip Kumar <dilipbalaut(at)gmail(dot)com>
Cc: Masahiko Sawada <masahiko(dot)sawada(at)2ndquadrant(dot)com>, Julien Rouhaud <rjuju123(at)gmail(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: pg_stat_statements issue with parallel maintenance (Was Re: WAL usage calculation patch)
Date: 2020-04-01 02:46:26
Message-ID: CAA4eK1+SWYhkjLb9QUim5h20WvvjLL8s25mcCFGp265o3Q_19Q@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, Mar 31, 2020 at 7:32 PM Dilip Kumar <dilipbalaut(at)gmail(dot)com> wrote:
>
> While testing I have found one issue. Basically, during a parallel
> vacuum, it was showing more number of
> shared_blk_hits+shared_blks_read. After, some investigation, I found
> that during the cleanup phase nworkers are -1, and because of this we
> didn't try to launch worker but "lps->pcxt->nworkers_launched" had the
> old launched worker count and shared memory also had old buffer read
> data which was never updated as we did not try to launch the worker.
>
> diff --git a/src/backend/access/heap/vacuumlazy.c
> b/src/backend/access/heap/vacuumlazy.c
> index b97b678..5dfaf4d 100644
> --- a/src/backend/access/heap/vacuumlazy.c
> +++ b/src/backend/access/heap/vacuumlazy.c
> @@ -2150,7 +2150,8 @@ lazy_parallel_vacuum_indexes(Relation *Irel,
> IndexBulkDeleteResult **stats,
> * Next, accumulate buffer usage. (This must wait for the workers to
> * finish, or we might get incomplete data.)
> */
> - for (i = 0; i < lps->pcxt->nworkers_launched; i++)
> + nworkers = Min(nworkers, lps->pcxt->nworkers_launched);
> + for (i = 0; i < nworkers; i++)
> InstrAccumParallelQuery(&lps->buffer_usage[i]);
>
> It worked after the above fix.
>

Good catch. I think we should not even call
WaitForParallelWorkersToFinish for such a case. So, I guess the fix
could be,

if (workers > 0)
{
WaitForParallelWorkersToFinish();
for (i = 0; i < lps->pcxt->nworkers_launched; i++)
InstrAccumParallelQuery(&lps->buffer_usage[i]);
}

or something along those lines.

--
With Regards,
Amit Kapila.
EnterpriseDB: http://www.enterprisedb.com

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Dilip Kumar 2020-04-01 02:50:16 Re: pg_stat_statements issue with parallel maintenance (Was Re: WAL usage calculation patch)
Previous Message Tomas Vondra 2020-04-01 02:44:24 Re: [PATCH] Incremental sort (was: PoC: Partial sort)