Avoid updating our PgBackendStatus entry when track_activities is off.

The point of turning off track_activities is to avoid this reporting
overhead, but a thinko in commit 4f42b546fd
caused pgstat_report_activity() to perform half of its updates anyway.
Fix that, and also make sure that we clear all the now-disabled fields
when transitioning to the non-reporting state.
This commit is contained in:
Tom Lane 2013-04-03 14:13:28 -04:00
parent 0f1345d38b
commit f7b0006f42
2 changed files with 25 additions and 28 deletions

View File

@ -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 "<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
@ -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

View File

@ -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)