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() - * pgstat_report_activity() -
* *
* Called from tcop/postgres.c to report what the backend is actually doing * 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 * All updates of the status entry follow the protocol of bumping
* st_changecount before and after. We use a volatile pointer here to * 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) if (!beentry)
return; return;
/* if (!pgstat_track_activities)
* To minimize the time spent modifying the entry, fetch all the needed {
* data first. if (beentry->st_state != STATE_DISABLED)
*/
current_timestamp = GetCurrentTimestamp();
if (!pgstat_track_activities && beentry->st_state != STATE_DISABLED)
{ {
/* /*
* Track activities is disabled, but we have a non-disabled state set. * track_activities is disabled, but we last reported a
* That means the status changed - so as our last update, tell the * non-disabled state. As our final update, change the state and
* collector that we disabled it and will no longer update. * clear fields we will not be updating anymore.
*/ */
beentry->st_changecount++; beentry->st_changecount++;
beentry->st_state = STATE_DISABLED; beentry->st_state = STATE_DISABLED;
beentry->st_state_start_timestamp = current_timestamp; 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++; beentry->st_changecount++;
Assert((beentry->st_changecount & 1) == 0); Assert((beentry->st_changecount & 1) == 0);
}
return; 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(); start_timestamp = GetCurrentStatementStartTimestamp();
if (cmd_str != NULL) 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), len = pg_mbcliplen(cmd_str, strlen(cmd_str),
pgstat_track_activity_query_size - 1); pgstat_track_activity_query_size - 1);
} }
current_timestamp = GetCurrentTimestamp();
/* /*
* Now update the status entry * Now update the status entry

View File

@ -666,15 +666,8 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
nulls[4] = true; nulls[4] = true;
break; 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); values[6] = BoolGetDatum(beentry->st_waiting);
if (beentry->st_xact_start_timestamp != 0) if (beentry->st_xact_start_timestamp != 0)