diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/activity/pgstat_backend.c | 53 | ||||
-rw-r--r-- | src/backend/utils/adt/pgstatfuncs.c | 30 | ||||
-rw-r--r-- | src/include/pgstat.h | 2 |
3 files changed, 56 insertions, 29 deletions
diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c index 338da73a9a9..3c9ebbcd69c 100644 --- a/src/backend/utils/activity/pgstat_backend.c +++ b/src/backend/utils/activity/pgstat_backend.c @@ -26,6 +26,8 @@ #include "access/xlog.h" #include "storage/bufmgr.h" +#include "storage/proc.h" +#include "storage/procarray.h" #include "utils/memutils.h" #include "utils/pgstat_internal.h" @@ -83,6 +85,57 @@ pgstat_fetch_stat_backend(ProcNumber procNumber) } /* + * Returns statistics of a backend by pid. + * + * This routine includes sanity checks to ensire that the backend exists and + * is running. "bktype" can be optionally defined to return the BackendType + * of the backend whose statistics are returned. + */ +PgStat_Backend * +pgstat_fetch_stat_backend_by_pid(int pid, BackendType *bktype) +{ + PGPROC *proc; + PgBackendStatus *beentry; + ProcNumber procNumber; + PgStat_Backend *backend_stats; + + proc = BackendPidGetProc(pid); + if (bktype) + *bktype = B_INVALID; + + /* + * This could be an auxiliary process but these do not report backend + * statistics due to pgstat_tracks_backend_bktype(), so there is no need + * for an extra call to AuxiliaryPidGetProc(). + */ + if (!proc) + return NULL; + + procNumber = GetNumberFromPGProc(proc); + + beentry = pgstat_get_beentry_by_proc_number(procNumber); + if (!beentry) + return NULL; + + backend_stats = pgstat_fetch_stat_backend(procNumber); + if (!backend_stats) + return NULL; + + /* if PID does not match, leave */ + if (beentry->st_procpid != pid) + return NULL; + + /* backend may be gone, so recheck in case */ + if (beentry->st_backendType == B_INVALID) + return NULL; + + if (bktype) + *bktype = beentry->st_backendType; + + return backend_stats; +} + +/* * Flush out locally pending backend IO statistics. Locking is managed * by the caller. */ diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index efb6d0032af..68830db8633 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -1576,46 +1576,18 @@ pg_stat_get_backend_io(PG_FUNCTION_ARGS) ReturnSetInfo *rsinfo; BackendType bktype; int pid; - PGPROC *proc; - ProcNumber procNumber; PgStat_Backend *backend_stats; PgStat_BktypeIO *bktype_stats; - PgBackendStatus *beentry; InitMaterializedSRF(fcinfo, 0); rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; pid = PG_GETARG_INT32(0); - proc = BackendPidGetProc(pid); - - /* - * This could be an auxiliary process but these do not report backend - * statistics due to pgstat_tracks_backend_bktype(), so there is no need - * for an extra call to AuxiliaryPidGetProc(). - */ - if (!proc) - return (Datum) 0; - - procNumber = GetNumberFromPGProc(proc); + backend_stats = pgstat_fetch_stat_backend_by_pid(pid, &bktype); - beentry = pgstat_get_beentry_by_proc_number(procNumber); - if (!beentry) - return (Datum) 0; - - backend_stats = pgstat_fetch_stat_backend(procNumber); if (!backend_stats) return (Datum) 0; - bktype = beentry->st_backendType; - - /* if PID does not match, leave */ - if (beentry->st_procpid != pid) - return (Datum) 0; - - /* backend may be gone, so recheck in case */ - if (bktype == B_INVALID) - return (Datum) 0; - bktype_stats = &backend_stats->io_stats; /* diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 67656264b62..4aad10b0b6d 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -554,6 +554,8 @@ extern void pgstat_count_backend_io_op(IOObject io_object, IOOp io_op, uint32 cnt, uint64 bytes); extern PgStat_Backend *pgstat_fetch_stat_backend(ProcNumber procNumber); +extern PgStat_Backend *pgstat_fetch_stat_backend_by_pid(int pid, + BackendType *bktype); extern bool pgstat_tracks_backend_bktype(BackendType bktype); extern void pgstat_create_backend(ProcNumber procnum); |