#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"
return backend_entry;
}
+/*
+ * 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.
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;
/*
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);