Re: Log a sample of transactions - Mailing list pgsql-hackers

From Adrien NAYRAT
Subject Re: Log a sample of transactions
Date
Msg-id e91430fb-6543-e956-00e0-6bad9f60b1af@anayrat.info
Whole thread Raw
In response to Re: Log a sample of transactions  (Adrien NAYRAT <adrien.nayrat@anayrat.info>)
Responses Re: Re: Log a sample of transactions
List pgsql-hackers
Hello,

On 2/15/19 3:24 PM, Adrien NAYRAT wrote:
> On 2/14/19 9:14 PM, Andres Freund wrote:
>> I wonder if this doesn't need a warning, explaining that using this when
>> there are large transactions could lead to slowdowns.
> 
> Yes, I will add some wording

Warning added.

>> It seems pretty weird to have this in postgres.c, given you declared it
>> in xact.h?
> 
> Yes, I have to revise my C. I will move it to 
> src/backend/access/transam/xact.c

Fixed

>> Why are both of these checked? ISTM once xact_is_sampled is set, we
>> ought not to respect a different value of log_xact_sample_rate for the
>> rest of that transaction.
> 
> I added theses checks to allow to disable logging during a sampled 
> transaction, per suggestion of Masahiko Sawada:
> https://www.postgresql.org/message-id/CAD21AoD4t%2BhTV6XfK5Yz%3DEocB8oMyJSYFfjAryCDYtqfib2GrA%40mail.gmail.com 

I added a comment to explain why transaction logging is rechecked.

>>
>> As far as I can tell xact_is_sampled is not properly reset in case of
>> errors?
>>
> 

I am not sure if I should disable logging in case of errors. Actually we 
have:

postgres=# set log_transaction_sample_rate to 1;
SET
postgres=# set client_min_messages to 'LOG';
LOG:  duration: 0.392 ms  statement: set client_min_messages to 'LOG';
SET
postgres=# begin;
LOG:  duration: 0.345 ms  statement: begin;
BEGIN
postgres=# select 1;
LOG:  duration: 0.479 ms  statement: select 1;
  ?column?
----------
         1
(1 row)

postgres=# select * from missingtable;
ERROR:  relation "missingtable" does not exist
LINE 1: select * from missingtable;
                       ^
postgres=# select 1;
ERROR:  current transaction is aborted, commands ignored until end of 
transaction block
postgres=# rollback;
LOG:  duration: 11390.295 ms  statement: rollback;
ROLLBACK

If I reset xact_is_sampled (after the first error inside 
AbortTransaction if I am right), "rollback" statement will not be 
logged. I wonder if this "statement" should be logged?

If the answer is no, I will reset xact_is_sampled in AbortTransaction.



Patch attached with fix mentioned above, but without xact_is_sampled reset.

Cheers,



Attachment

pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: Refactoring the checkpointer's fsync request queue
Next
From: Chapman Flack
Date:
Subject: Re: Infinity vs Error for division by zero