diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index f890e2bc66336aa7c9238ed2ec7d91fef1e0d200..edad1401e452d8f4821b1ab2a6213ddf567d310c 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2520,7 +2520,7 @@ pgstat_beshutdown_hook(int code, Datum arg) * pgstat_report_activity() - * * Called from tcop/postgres.c to report what the backend is actually doing - * (usually "<IDLE>" or the start of the query to be executed). + * (but note cmd_str can be NULL for certain cases). * * All updates of the status entry follow the protocol of bumping * st_changecount before and after. We use a volatile pointer here to @@ -2540,29 +2540,32 @@ pgstat_report_activity(BackendState state, const char *cmd_str) if (!beentry) return; - /* - * To minimize the time spent modifying the entry, fetch all the needed - * data first. - */ - current_timestamp = GetCurrentTimestamp(); - - if (!pgstat_track_activities && beentry->st_state != STATE_DISABLED) + if (!pgstat_track_activities) { - /* - * Track activities is disabled, but we have a non-disabled state set. - * That means the status changed - so as our last update, tell the - * collector that we disabled it and will no longer update. - */ - beentry->st_changecount++; - beentry->st_state = STATE_DISABLED; - beentry->st_state_start_timestamp = current_timestamp; - beentry->st_changecount++; - Assert((beentry->st_changecount & 1) == 0); + if (beentry->st_state != STATE_DISABLED) + { + /* + * track_activities is disabled, but we last reported a + * non-disabled state. As our final update, change the state and + * clear fields we will not be updating anymore. + */ + beentry->st_changecount++; + beentry->st_state = STATE_DISABLED; + beentry->st_state_start_timestamp = 0; + beentry->st_activity[0] = '\0'; + beentry->st_activity_start_timestamp = 0; + /* st_xact_start_timestamp and st_waiting are also disabled */ + beentry->st_xact_start_timestamp = 0; + beentry->st_waiting = false; + beentry->st_changecount++; + Assert((beentry->st_changecount & 1) == 0); + } return; } /* - * Fetch more data before we start modifying the entry + * To minimize the time spent modifying the entry, fetch all the needed + * data first. */ start_timestamp = GetCurrentStatementStartTimestamp(); if (cmd_str != NULL) @@ -2570,6 +2573,7 @@ pgstat_report_activity(BackendState state, const char *cmd_str) len = pg_mbcliplen(cmd_str, strlen(cmd_str), pgstat_track_activity_query_size - 1); } + current_timestamp = GetCurrentTimestamp(); /* * Now update the status entry diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 7c0705abcc9eb355e2df71b5ec9e11e81ce9f7ec..6f2514748572c8bfd91d56d33964078136a8e8ad 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -665,15 +665,8 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) nulls[4] = true; break; } - if (beentry->st_state == STATE_UNDEFINED || - beentry->st_state == STATE_DISABLED) - { - values[5] = CStringGetTextDatum(""); - } - else - { - values[5] = CStringGetTextDatum(beentry->st_activity); - } + + values[5] = CStringGetTextDatum(beentry->st_activity); values[6] = BoolGetDatum(beentry->st_waiting); if (beentry->st_xact_start_timestamp != 0)