Use actual backend IDs in pg_stat_get_backend_subxact().
Unlike the other pg_stat_get_backend* functions, pg_stat_get_backend_subxact() looks up the backend entry by using its integer argument as a 1-based index in an internal array. The other functions look for the entry with the matching session backend ID. These numbers often match, but that isn't reliably true. This commit resolves this discrepancy by introducing pgstat_get_local_beentry_by_backend_id() and using it in pg_stat_get_backend_subxact(). We cannot use pgstat_get_beentry_by_backend_id() because it returns a PgBackendStatus, which lacks the locally computed additions available in LocalPgBackendStatus that are required by pg_stat_get_backend_subxact(). Author: Ian Barwick Reviewed-by: Sami Imseih, Michael Paquier, Robert Haas Discussion: https://postgr.es/m/CAB8KJ%3Dj-ACb3H4L9a_b3ZG3iCYDW5aEu3WsPAzkm2S7JzS1Few%40mail.gmail.com Backpatch-through: 16
This commit is contained in:
parent
3d51cb5197
commit
d0fe3046ee
@ -1088,9 +1088,33 @@ cmp_lbestatus(const void *a, const void *b)
|
||||
*/
|
||||
PgBackendStatus *
|
||||
pgstat_get_beentry_by_backend_id(BackendId beid)
|
||||
{
|
||||
LocalPgBackendStatus *ret = pgstat_get_local_beentry_by_backend_id(beid);
|
||||
|
||||
if (ret)
|
||||
return &ret->backendStatus;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* ----------
|
||||
* pgstat_get_local_beentry_by_backend_id() -
|
||||
*
|
||||
* Like pgstat_get_beentry_by_backend_id() but with locally computed additions
|
||||
* (like xid and xmin values of the backend)
|
||||
*
|
||||
* The beid argument is the BackendId of the desired session
|
||||
* (note that this is unlike pgstat_get_local_beentry_by_index()).
|
||||
*
|
||||
* NB: caller is responsible for checking if the user is permitted to see this
|
||||
* info (especially the querystring).
|
||||
* ----------
|
||||
*/
|
||||
LocalPgBackendStatus *
|
||||
pgstat_get_local_beentry_by_backend_id(BackendId beid)
|
||||
{
|
||||
LocalPgBackendStatus key;
|
||||
LocalPgBackendStatus *ret;
|
||||
|
||||
pgstat_read_current_status();
|
||||
|
||||
@ -1099,14 +1123,8 @@ pgstat_get_beentry_by_backend_id(BackendId beid)
|
||||
* bsearch() to search it efficiently.
|
||||
*/
|
||||
key.backend_id = beid;
|
||||
ret = (LocalPgBackendStatus *) bsearch(&key, localBackendStatusTable,
|
||||
localNumBackends,
|
||||
sizeof(LocalPgBackendStatus),
|
||||
cmp_lbestatus);
|
||||
if (ret)
|
||||
return &ret->backendStatus;
|
||||
|
||||
return NULL;
|
||||
return bsearch(&key, localBackendStatusTable, localNumBackends,
|
||||
sizeof(LocalPgBackendStatus), cmp_lbestatus);
|
||||
}
|
||||
|
||||
|
||||
|
@ -727,7 +727,7 @@ pg_stat_get_backend_subxact(PG_FUNCTION_ARGS)
|
||||
|
||||
BlessTupleDesc(tupdesc);
|
||||
|
||||
if ((local_beentry = pgstat_get_local_beentry_by_index(beid)) != NULL)
|
||||
if ((local_beentry = pgstat_get_local_beentry_by_backend_id(beid)) != NULL)
|
||||
{
|
||||
/* Fill values and NULLs */
|
||||
values[0] = Int32GetDatum(local_beentry->backend_subxact_count);
|
||||
|
@ -334,6 +334,7 @@ extern uint64 pgstat_get_my_query_id(void);
|
||||
*/
|
||||
extern int pgstat_fetch_stat_numbackends(void);
|
||||
extern PgBackendStatus *pgstat_get_beentry_by_backend_id(BackendId beid);
|
||||
extern LocalPgBackendStatus *pgstat_get_local_beentry_by_backend_id(BackendId beid);
|
||||
extern LocalPgBackendStatus *pgstat_get_local_beentry_by_index(int idx);
|
||||
extern char *pgstat_clip_activity(const char *raw_activity);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user