mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-06 15:24:56 +08:00
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:
parent
0f1345d38b
commit
f7b0006f42
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user