diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 12ca295422..29d986a65a 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2560,7 +2560,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 "" 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 @@ -2580,29 +2580,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) @@ -2610,6 +2613,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 e6ec37296e..8c1a76728d 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -666,15 +666,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)