Re: On-demand running query plans using auto_explain and signals

From: "Shulgin, Oleksandr" <oleksandr(dot)shulgin(at)zalando(dot)de>
To: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Cc: Tomas Vondra <tomas(dot)vondra(at)2ndquadrant(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: On-demand running query plans using auto_explain and signals
Date: 2015-09-17 09:55:57
Message-ID: CACACo5Q3o924fHm8msgyKO51e4Cezpcru7zd=JBZwWhYLbCSvQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Sep 16, 2015 at 8:07 PM, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
wrote:

>
> 2015-09-16 16:31 GMT+02:00 Shulgin, Oleksandr <
> oleksandr(dot)shulgin(at)zalando(dot)de>:
>
>>
>> I've added the timeout parameter to the pg_cmdstatus call, and more
>> importantly to the sending side of the queue, so that one can limit the
>> potential effect of handling the interrupt in case something goes really
>> wrong.
>>
>
> I don't think so introduction new user visible timer is good idea. This
> timer should be invisible
>
> My idea - send a signal and wait 1sec, then check if target process is
> living still. Stop if not. Wait next 5 sec, then check target process. Stop
> if this process doesn't live or raise warning "requested process doesn't
> communicate, waiting.." The final cancel should be done by
> statement_timeout.
>
> what do you think about it?
>

That won't work really well with something like I use to do when testing
this patch, namely:

postgres=# select pid, array(select pg_cmdstatus(pid, 1, 10)) from
pg_stat_activity where pid<>pg_backend_pid() \watch 1

while also running pgbench with -C option (to create new connection for
every transaction). When a targeted backend exits before it can handle the
signal, the receiving process keeps waiting forever.

The statement_timeout in this case will stop the whole select, not just
individual function call. Unless you wrap it to set statement_timeout and
catch QUERY_CANCELED in plpgsql, but then you won't be able to ^C the whole
select. The ability to set a (short) timeout for the function itself
proves to be a really useful feature to me.

We can still communicate some warnings to the client when no timeout is
specified (and make 0 the default value actually).

What I'm now thinking about is probably we can extend this backend
>> communication mechanism in order to query GUC values effective in a
>> different backend or even setting the values. The obvious candidate to
>> check when you see some query misbehaving would be work_mem, for example.
>> Or we could provide a report of all settings that were overridden in the
>> backend's session, to the effect of running something like this:
>>
>> select * from pg_settings where context = 'user' and setting != reset_val;
>>
>
> this is a good idea. More times I interested what is current setting of
> query. We cannot to use simple query - because it is not possible to push
> PID to function simply, but you can to write function pg_settings_pid() so
> usage can look like
>
> select * from pg_settings_pid(xxxx, possible other params) where ...
>

I would rather have a more general way to run *readonly* queries in the
other backend than invent a new function for every occurrence.

The obvious candidates to be set externally are the
>> cmdstatus_analyze/instrument_*: when you decided you want to turn them on,
>> you'd rather do that carefully for a single backend than globally
>> per-cluster. One can still modify the postgresql.conf and then send SIGHUP
>> to just a single backend, but I think a more direct way to alter the
>> settings would be better.
>>
>
> I am 100% for possibility to read the setting. But reconfiguration from
> other process is too hot coffee - it can be available via extension, but
> not via usually used tools.
>

It can be reserved to superuser, and nobody is forcing one to use it
anyway. :-)

In this light should we rename the API to something like "backend control"
>> instead of "command status"? The SHOW/SET syntax could be extended to
>> support the remote setting retrieval/update.
>>
>
> prepare API, and this functionality can be part of referential
> implementation in contrib.
>
> This patch should not to have too range be finished in this release cycle.
>

These are just the thoughts on what could be achieved using this
cross-backend communication mechanism and ideas for generalization of the
API.

--
Alex

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Pavel Stehule 2015-09-17 10:06:09 Re: On-demand running query plans using auto_explain and signals
Previous Message Amit Kapila 2015-09-17 09:23:34 Re: a funnel by any other name