Re: Log query parameters for terminated execute

Lists: pgsql-hackers
From: Sergei Kornilov <sk(at)zsrv(dot)org>
To: PostgreSQL mailing lists <pgsql-hackers(at)postgresql(dot)org>
Subject: Log query parameters for terminated execute
Date: 2018-06-23 19:54:19
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

Hello all
We already have feature to logging query parameters. If we use log_statement = 'all' we write parameters before execution and all is fine here. If we use log_min_duration_statement statement is logged obviously after execution, but currently we have no parameters if query was terminated by statement_timeout, lock_timeout or by pg_terminate_backend.

I would like have parameters in logs at least for such three cases.

Simple way achieve this is just add errdetail_params to such ereport as in attached patch.
Another way is add something like printing global variable debug_query_string in send_message_to_server_log (src/backend/utils/error/elog.c). But i have no good idea how print ParamListInfo correctly. We can not use OidOutputFunctionCall in all cases, right?

Another small question is why errdetail_params uses errdetail instead errdetail_log? We assume that the user wants to get their own parameters back (if he set client_min_messages to LOG)?

Any feedback is strongly appreciated. Thank you!

regards, Sergei

Attachment Content-Type Size
naive_log_execute_parameters.patch text/x-diff 4.1 KB

From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: Sergei Kornilov <sk(at)zsrv(dot)org>
Cc: PostgreSQL mailing lists <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Log query parameters for terminated execute
Date: 2018-06-23 20:08:21
Message-ID: CAFj8pRDfkBt60b9MA6vCiJS3-uxK85GzynW4Ti-VGFuRQUdbRA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

2018-06-23 21:54 GMT+02:00 Sergei Kornilov <sk(at)zsrv(dot)org>:

> Hello all
> We already have feature to logging query parameters. If we use
> log_statement = 'all' we write parameters before execution and all is fine
> here. If we use log_min_duration_statement statement is logged obviously
> after execution, but currently we have no parameters if query was
> terminated by statement_timeout, lock_timeout or by pg_terminate_backend.
>
> I would like have parameters in logs at least for such three cases.
>

It is good idea - more times I would to see these values

Regards

Pavel

> Simple way achieve this is just add errdetail_params to such ereport as in
> attached patch.
> Another way is add something like printing global variable
> debug_query_string in send_message_to_server_log
> (src/backend/utils/error/elog.c). But i have no good idea how print
> ParamListInfo correctly. We can not use OidOutputFunctionCall in all cases,
> right?
>
> Another small question is why errdetail_params uses errdetail instead
> errdetail_log? We assume that the user wants to get their own parameters
> back (if he set client_min_messages to LOG)?
>
> Any feedback is strongly appreciated. Thank you!
>
> regards, Sergei


From: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>
To: sk(at)zsrv(dot)org, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Subject: Re: Log query parameters for terminated execute
Date: 2018-07-23 09:38:23
Message-ID: CALtqXTcKQi8UOudgRty7jpfBdygatJb+3=k+xBNzxGcgWNLYew@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

On Sun, Jun 24, 2018 at 1:08 AM, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
wrote:

>
>
> 2018-06-23 21:54 GMT+02:00 Sergei Kornilov <sk(at)zsrv(dot)org>:
>
>> Hello all
>> We already have feature to logging query parameters. If we use
>> log_statement = 'all' we write parameters before execution and all is fine
>> here. If we use log_min_duration_statement statement is logged obviously
>> after execution, but currently we have no parameters if query was
>> terminated by statement_timeout, lock_timeout or by pg_terminate_backend.
>>
>> I would like have parameters in logs at least for such three cases.
>>
>
> It is good idea - more times I would to see these values
>
> Regards
>
> Pavel
>
>
>> Simple way achieve this is just add errdetail_params to such ereport as
>> in attached patch.
>> Another way is add something like printing global variable
>> debug_query_string in send_message_to_server_log
>> (src/backend/utils/error/elog.c). But i have no good idea how print
>> ParamListInfo correctly. We can not use OidOutputFunctionCall in all cases,
>> right?
>>
>> Another small question is why errdetail_params uses errdetail instead
>> errdetail_log? We assume that the user wants to get their own parameters
>> back (if he set client_min_messages to LOG)?
>>
>> Any feedback is strongly appreciated. Thank you!
>>
>> regards, Sergei
>
>
>
I have reviewed and tested the patch here are my findings about the patch.

Patch applied successfully on master branch
"04269320aed30d3e37c10ae77775954eae234d45". There is no compilation issue
with the patch.

statement_timeout: For this I wrote a simple LibPq program to insert into
table. The results are random, some times it logs the param and some time
does not; with the same program. After digging a bit I found that if you
execute just after starting the server it does not log the param and start
logging after subsequent calls. Here is the log

2018-07-23 14:12:13.530 PKT [29165] ERROR: canceling statement due to
statement timeout

2018-07-23 14:12:13.530 PKT [29165] DETAIL: parameters: $1 = '16777216',
$2 = 'Foobar'

2018-07-23 14:12:13.530 PKT [29165] STATEMENT: INSERT INTO tbl_libpq_test
(id, name) VALUES ($1::integer, $2::varchar)

...

2018-07-23 14:13:38.483 PKT [29169] LOG: shutting down

...

2018-07-23 14:13:38.616 PKT [29901] LOG: database system is ready to
accept connections

2018-07-23 14:13:39.848 PKT [29910] ERROR: canceling statement due to
statement timeout

2018-07-23 14:13:39.848 PKT [29910] STATEMENT: INSERT INTO tbl_libpq_test
(id, name) VALUES ($1::integer, $2::varchar)

lock_timeout: For this I a use the same program to insert into table. I
lock the table in other session and try to execute the program. It does not
log any params at all here is the log.

2018-07-23 14:21:19.165 PKT [30006] ERROR: canceling statement due to lock
timeout at character 13

2018-07-23 14:21:19.165 PKT [30006] STATEMENT: INSERT INTO tbl_libpq_test
(id, name) VALUES ($1::integer, $2::varchar)

--
Ibrar Ahmed


From: Sergei Kornilov <sk(at)zsrv(dot)org>
To: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Subject: Re: Log query parameters for terminated execute
Date: 2018-07-23 10:05:51
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

Hello
Thank you for review!
Well, i can miss some cases. I'm not sure about overall design of this patch. Is acceptable add errdetail_params to statement_timeout ereport in such way?

After shutdown signal we must be in aborted state, so we mustn't call user-defined I/O functions. (quotation from comment to errdetail_params in src/backend/tcop/postgres.c ). It seems i can not fix it with current design.

> ERROR:  canceling statement due to lock timeout at character 13
Hm, "at character"? How can we get this message? I found only "canceling statement due to lock timeout" (without "at character") ereport in src/backend/tcop/postgres.c
Maybe try .. catch in parse state, not in execute?

regards, Sergei


From: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>
To: Sergei Kornilov <sk(at)zsrv(dot)org>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Subject: Re: Log query parameters for terminated execute
Date: 2018-07-23 10:19:24
Message-ID: CALtqXTcAdWCb1OgWSUp48h36jG1o2fTQBmFTF+Thtab9yD50Bw@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

On Mon, Jul 23, 2018 at 3:05 PM, Sergei Kornilov <sk(at)zsrv(dot)org> wrote:

> Hello
> Thank you for review!
> Well, i can miss some cases. I'm not sure about overall design of this
> patch. Is acceptable add errdetail_params to statement_timeout ereport in
> such way?
>
> After shutdown signal we must be in aborted state, so we mustn't call
> user-defined I/O functions. (quotation from comment to errdetail_params in
> src/backend/tcop/postgres.c ). It seems i can not fix it with current
> design.
>

No its not about calling the function after abort/shutdown. Just start the
server and try to run the program, most of the time you will not get
params.

>
> > ERROR: canceling statement due to lock timeout at character 13
> Hm, "at character"? How can we get this message? I found only "canceling
> statement due to lock timeout" (without "at character") ereport in
> src/backend/tcop/postgres.c
> Maybe try .. catch in parse state, not in execute?
>

Its really easy to reproduce, just lock the table form another session and
run a "c" program to insert row in the same table.

>
> regards, Sergei
>

--
Ibrar Ahmed


From: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>
To: pgsql-hackers(at)lists(dot)postgresql(dot)org
Cc: Sergei Kornilov <sk(at)zsrv(dot)org>
Subject: Re: Log query parameters for terminated execute
Date: 2018-07-23 10:34:38
Message-ID: 153234207840.1561.7754147138760279281.pgcf@coridan.postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

The following review has been posted through the commitfest application:
make installcheck-world: not tested
Implements feature: not tested
Spec compliant: not tested
Documentation: not tested

Review submitted

The new status of this patch is: Waiting on Author


From: Sergei Kornilov <sk(at)zsrv(dot)org>
To: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Subject: Re: Log query parameters for terminated execute
Date: 2018-07-23 11:17:26
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

Hello!

>> After shutdown signal we must be in aborted state, so we mustn't call user-defined I/O functions. (quotation from comment to errdetail_params in src/backend/tcop/postgres.c ). It seems i can not fix it with current design.
>
> No its not about calling the function after abort/shutdown. Just start the server and try to run the program, most of the time you will not get params.
>
>>> ERROR:  canceling statement due to lock timeout at character 13
>> Hm, "at character"? How can we get this message? I found only "canceling statement due to lock timeout" (without "at character") ereport in src/backend/tcop/postgres.c
>> Maybe try .. catch in parse state, not in execute?
>
> Its really easy to reproduce, just lock the table form another session and run a "c" program to insert row in the same table.

So, I was right. We can got "canceling statement due to lock timeout at character 13" only in PARSE state. In parse state we have completely no parameters, we receive parameters only later in BIND message. I can not log data from future.
And initially i did change only EXECUTE. Attached patch with similar change in BIND message, if this design is acceptable.

Please test with logging command tag %i in log_line_prefix. Extended protocol has three different messages, each can be canceled by timeout. But here is completely no parameters in PARSE and i did not change BIND in first patch.

regards, Sergei

Attachment Content-Type Size
log_prepared_stmt_parameters_v2.patch text/x-diff 4.5 KB

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Sergei Kornilov <sk(at)zsrv(dot)org>
Cc: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Subject: Re: Log query parameters for terminated execute
Date: 2018-07-23 14:08:08
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

Sergei Kornilov <sk(at)zsrv(dot)org> writes:
> Please test with logging command tag %i in log_line_prefix. Extended protocol has three different messages, each can be canceled by timeout. But here is completely no parameters in PARSE and i did not change BIND in first patch.

This patch scares me to death. It risks calling user-defined I/O
functions in all sorts of weird places, particularly outside transactions,
or in already-failed transactions, or with no ActiveSnapshot.

Separately from that concern: it appears to result in a substantial
degradation of existing functionality in the places where you did
s/errdetail/errdetail_log/. What was the reason for that?

regards, tom lane


From: Sergei Kornilov <sk(at)zsrv(dot)org>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
Subject: Re: Log query parameters for terminated execute
Date: 2018-07-23 14:37:54
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

Hello

23.07.2018, 17:08, "Tom Lane" <tgl(at)sss(dot)pgh(dot)pa(dot)us>:
> Sergei Kornilov <sk(at)zsrv(dot)org> writes:
>>  Please test with logging command tag %i in log_line_prefix. Extended protocol has three different messages, each can be canceled by timeout. But here is completely no parameters in PARSE and i did not change BIND in first patch.
>
> This patch scares me to death. It risks calling user-defined I/O
> functions in all sorts of weird places, particularly outside transactions,
> or in already-failed transactions, or with no ActiveSnapshot.
This is reason why i start thread with question how do it right way
As i wrote in beginning:
> i have no good idea how print ParamListInfo correctly. We can not use OidOutputFunctionCall in all cases, right?
Attached patch is just simple enough to illustrate one possible way.
I can further work with proper design, but i need idea how it should look.

> Separately from that concern: it appears to result in a substantial
> degradation of existing functionality in the places where you did
> s/errdetail/errdetail_log/. What was the reason for that?
This is my second question at thread beginning. Why used errdetail? We assume that the user wants to get their own parameters back (if he set client_min_messages to LOG)?

regards, Sergei


From: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>
To: pgsql-hackers(at)lists(dot)postgresql(dot)org
Cc: Sergei Kornilov <sk(at)zsrv(dot)org>
Subject: Re: Log query parameters for terminated execute
Date: 2018-07-26 08:23:37
Message-ID: 153259341714.1561.10951897973783831876.pgcf@coridan.postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

Changed the status as per last email of Tom Lane.


From: Sergei Kornilov <sk(at)zsrv(dot)org>
To: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com>, "pgsql-hackers(at)lists(dot)postgresql(dot)org" <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Log query parameters for terminated execute
Date: 2018-07-26 08:35:57
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-hackers

Hello

> Changed the status as per last email of Tom Lane.
I have no idea what can i change.
I received no feedback how i can print parameters in other cases. Should i mark CF as rejected?

regards, Sergei