2015-09-17 16:06 GMT+02:00 Shulgin, Oleksandr <oleksandr.shul...@zalando.de>
:

> On Thu, Sep 17, 2015 at 12:06 PM, Pavel Stehule <pavel.steh...@gmail.com>
> wrote:
>
>>
>>> 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.
>>>
>>
>> no - every timeout you have to check, if targeted backend is living
>> still, if not you will do cancel. It is 100% safe.
>>
>
> But then you need to make this internal timeout rather short, not 1s as
> originally suggested.
>

can be - 1 sec is max, maybe 100ms is optimum.

>
> 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.
>>>
>>
>> you cannot to handle QUERY_CANCELED in plpgsql.
>>
>
> Well, you can but its not that useful of course:
>

hmm, some is wrong - I remember from some older plpgsql, so CANCEL message
is not catchable. Maybe I have bad memory. I have to recheck it.


>
> =# create or replace function test_query_cancel() returns void language
> plpgsql as $$ begin
>  perform pg_sleep(1);
>  exception when query_canceled then raise notice 'cancel';
> end; $$;
> CREATE FUNCTION
> =# set statement_timeout to '100ms';
> SET
> =# select test_query_cancel();
> NOTICE:  cancel
>  test_query_cancel
> -------------------
>
> (1 row)
> =# select test_query_cancel() from generate_series(1, 100) x;
> NOTICE:  cancel
> ^CCancel request sent
> NOTICE:  cancel
> ^CCancel request sent
>
> Now you cannot cancel this query unless you do pg_terminate_backend() or
> equivalent.
>
> There is need some internal timeout - but this timeout should not be
>> visible - any new GUC increase PostgreSQL complexity - and there is not a
>> reason why do it.
>>
>
> But the GUC was added for the timeout on the sending side, not the
> receiving one.  There is no "one value fits all" for this, but you would
> still want to make the effects of this as limited as possible.
>

I still believe so any new GUC is not necessary. If you don't like
statement_timeout, we can copy the behave of CREATE DATABASE - there are
few 5sec cycles (when template1 is occupated) and break.

Regards

Pavel


>
> --
> Alex
>
>

Reply via email to