1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-16 06:01:02 +03:00

Expand assertion check for query ID reporting in executor

As formulated, the assertion added in the executor by 24f5205948 to
check that a query ID is set had two problems:
- track_activities may be disabled while compute_query_id is enabled,
causing the query ID to not be reported to pg_stat_activity.
- debug_query_string may not be set in some context.  The only path
where this would matter is visibly autovacuum, should parallel workers
be enabled there at some point.  This is not the case currently.

There was no test showing the interactions between the query ID and
track_activities, so let's add one based on a scan of pg_stat_activity.
This assertion is still an experimentation at this stage, but let's see
if this shows more paths where query IDs are not properly set while they
should.

Discussion: https://postgr.es/m/Zvn5616oYXmpXyHI@paquier.xyz
This commit is contained in:
Michael Paquier
2024-10-01 08:56:21 +09:00
parent 102de3be73
commit 5deb56387e
3 changed files with 48 additions and 3 deletions

View File

@ -71,6 +71,18 @@ ExecutorEnd_hook_type ExecutorEnd_hook = NULL;
/* Hook for plugin to get control in ExecCheckPermissions() */
ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook = NULL;
/*
* Check that the query ID is set, which is something that happens only
* if compute_query_id is enabled (or a module forced it), if track_activities
* is enabled, and if a client provided a query string to map with the query
* ID computed from it.
*/
#define EXEC_CHECK_QUERY_ID \
do { \
Assert(!IsQueryIdEnabled() || !pgstat_track_activities || \
!debug_query_string || pgstat_get_my_query_id() != 0); \
} while(0)
/* decls for local routines only used within this module */
static void InitPlan(QueryDesc *queryDesc, int eflags);
static void CheckValidRowMarkRel(Relation rel, RowMarkType markType);
@ -297,7 +309,7 @@ ExecutorRun(QueryDesc *queryDesc,
bool execute_once)
{
/* If enabled, the query ID should be set. */
Assert(!IsQueryIdEnabled() || pgstat_get_my_query_id() != 0);
EXEC_CHECK_QUERY_ID;
if (ExecutorRun_hook)
(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);
@ -408,7 +420,7 @@ void
ExecutorFinish(QueryDesc *queryDesc)
{
/* If enabled, the query ID should be set. */
Assert(!IsQueryIdEnabled() || pgstat_get_my_query_id() != 0);
EXEC_CHECK_QUERY_ID;
if (ExecutorFinish_hook)
(*ExecutorFinish_hook) (queryDesc);
@ -471,7 +483,7 @@ void
ExecutorEnd(QueryDesc *queryDesc)
{
/* If enabled, the query ID should be set. */
Assert(!IsQueryIdEnabled() || pgstat_get_my_query_id() != 0);
EXEC_CHECK_QUERY_ID;
if (ExecutorEnd_hook)
(*ExecutorEnd_hook) (queryDesc);

View File

@ -824,6 +824,27 @@ set default_with_oids to f;
-- Should not allow to set it to true.
set default_with_oids to t;
ERROR: tables declared WITH OIDS are not supported
-- Test that disabling track_activities disables query ID reporting in
-- pg_stat_activity.
SET compute_query_id = on;
SET track_activities = on;
SELECT query_id IS NOT NULL AS qid_set FROM pg_stat_activity
WHERE pid = pg_backend_pid();
qid_set
---------
t
(1 row)
SET track_activities = off;
SELECT query_id IS NOT NULL AS qid_set FROM pg_stat_activity
WHERE pid = pg_backend_pid();
qid_set
---------
f
(1 row)
RESET track_activities;
RESET compute_query_id;
-- Test GUC categories and flag patterns
SELECT pg_settings_get_flags(NULL);
pg_settings_get_flags

View File

@ -319,6 +319,18 @@ set default_with_oids to f;
-- Should not allow to set it to true.
set default_with_oids to t;
-- Test that disabling track_activities disables query ID reporting in
-- pg_stat_activity.
SET compute_query_id = on;
SET track_activities = on;
SELECT query_id IS NOT NULL AS qid_set FROM pg_stat_activity
WHERE pid = pg_backend_pid();
SET track_activities = off;
SELECT query_id IS NOT NULL AS qid_set FROM pg_stat_activity
WHERE pid = pg_backend_pid();
RESET track_activities;
RESET compute_query_id;
-- Test GUC categories and flag patterns
SELECT pg_settings_get_flags(NULL);
SELECT pg_settings_get_flags('does_not_exist');