On Mon, Apr 12, 2021 at 02:56:59PM +0800, Julien Rouhaud wrote:
> I think we should simply document that %Q is not compatible with
> log_statements.

Hearing no objection I documented that limitation.

> 
> > While making the feature run on some test server, I have noticed that
> > %Q would log some garbage query ID for autovacuum workers that's kept
> > around.  That looks wrong.
> 
> I've not been able to reproduce it, do you have some hint on how to do it?
> 
> Maybe setting a zero queryid at the beginning of AutoVacWorkerMain() could fix
> the problem?

It turns out that the problem was simply that some process can inherit a
PgBackendStatus for which a previous backend reported a queryid.  For processes
like autovacuum process, they will never report a new identifier so they
reported the previous one.  Resetting the field like the other ones in
pgstat_bestart() fixes the problem for autovacuum and any similar process.
>From eb8a90b88d8572b110535c6350830cf58632fecd Mon Sep 17 00:00:00 2001
From: Julien Rouhaud <julien.rouh...@free.fr>
Date: Thu, 15 Apr 2021 15:28:03 +0800
Subject: [PATCH v1] Additional fixes for compute_query_id.

Statements logged by log_statement parameter always get a zero queryid.  This
is a limitation due to how log_statement is implemented, as it logs all wanted
synctatically valid statements before an indentifier can be calculated,
including invalid statements such as

SELECT not_a_column;

for which an identifier can't be calculated, so document that limitation.

It was also possible that a new process ends up emitting logs with an incorrect
query identifier if the previous PgBackendStatus user reported an identifier as
the pgstat field wasn't correctly reset.

Author: Julien Rouhaud
Reported-by: Fuji Masao
Reported-by: Michael Paquier
Discussion: https://postgr.es/m/yhpku8hfi4no4...@paquier.xyz
---
 doc/src/sgml/config.sgml                    | 10 ++++++++++
 src/backend/utils/activity/backend_status.c |  1 +
 2 files changed, 11 insertions(+)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 776ab1a8c8..d5735b72c8 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -7139,6 +7139,16 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
 </programlisting>
         </para>
        </tip>
+
+       <note>
+        <para>
+         The <literal>%Q</literal> escape will always report a zero identifier
+         when used together with <xref linkend="guc-log-statement"/> as this
+         parameter logs statements before an identifier can be calculated,
+         including invalid statements for which an identifier cannot be
+         calculated.
+        </para>
+       </note>
       </listitem>
      </varlistentry>
 
diff --git a/src/backend/utils/activity/backend_status.c b/src/backend/utils/activity/backend_status.c
index 6110113e56..80ffcdf6de 100644
--- a/src/backend/utils/activity/backend_status.c
+++ b/src/backend/utils/activity/backend_status.c
@@ -398,6 +398,7 @@ pgstat_bestart(void)
 	lbeentry.st_state = STATE_UNDEFINED;
 	lbeentry.st_progress_command = PROGRESS_COMMAND_INVALID;
 	lbeentry.st_progress_command_target = InvalidOid;
+	lbeentry.st_queryid = UINT64CONST(0);
 
 	/*
 	 * we don't zero st_progress_param here to save cycles; nobody should
-- 
2.30.1

Reply via email to