mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Take the statistics collector out of the loop for monitoring backends'
current commands; instead, store current-status information in shared memory. This substantially reduces the overhead of stats_command_string and also ensures that pg_stat_activity is fully up to date at all times. Per my recent proposal.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@ -37,7 +37,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.486 2006/06/18 15:38:37 petere Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.487 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
*
|
||||
@ -2109,9 +2109,6 @@ reaper(SIGNAL_ARGS)
|
||||
{
|
||||
AutoVacPID = 0;
|
||||
autovac_stopped();
|
||||
/* Tell the collector about process termination */
|
||||
pgstat_beterm(pid);
|
||||
|
||||
if (exitstatus != 0)
|
||||
HandleChildCrash(pid, exitstatus,
|
||||
_("autovacuum process"));
|
||||
@ -2252,8 +2249,6 @@ CleanupBackend(int pid,
|
||||
#ifdef EXEC_BACKEND
|
||||
ShmemBackendArrayRemove(pid);
|
||||
#endif
|
||||
/* Tell the collector about backend termination */
|
||||
pgstat_beterm(pid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2299,8 +2294,6 @@ HandleChildCrash(int pid, int exitstatus, const char *procname)
|
||||
#ifdef EXEC_BACKEND
|
||||
ShmemBackendArrayRemove(pid);
|
||||
#endif
|
||||
/* Tell the collector about backend termination */
|
||||
pgstat_beterm(pid);
|
||||
/* Keep looping so we can signal remaining backends */
|
||||
}
|
||||
else
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/ipci.c,v 1.83 2006/05/08 00:00:10 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/ipci.c,v 1.84 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -21,6 +21,7 @@
|
||||
#include "access/twophase.h"
|
||||
#include "access/xlog.h"
|
||||
#include "miscadmin.h"
|
||||
#include "pgstat.h"
|
||||
#include "postmaster/bgwriter.h"
|
||||
#include "postmaster/postmaster.h"
|
||||
#include "storage/bufmgr.h"
|
||||
@ -86,6 +87,7 @@ CreateSharedMemoryAndSemaphores(bool makePrivate, int port)
|
||||
size = add_size(size, MultiXactShmemSize());
|
||||
size = add_size(size, LWLockShmemSize());
|
||||
size = add_size(size, ProcArrayShmemSize());
|
||||
size = add_size(size, BackendStatusShmemSize());
|
||||
size = add_size(size, SInvalShmemSize());
|
||||
size = add_size(size, FreeSpaceShmemSize());
|
||||
size = add_size(size, BgWriterShmemSize());
|
||||
@ -167,6 +169,7 @@ CreateSharedMemoryAndSemaphores(bool makePrivate, int port)
|
||||
if (!IsUnderPostmaster)
|
||||
InitProcGlobal();
|
||||
CreateSharedProcArray();
|
||||
CreateSharedBackendStatus();
|
||||
|
||||
/*
|
||||
* Set up shared-inval messaging
|
||||
|
@ -23,7 +23,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.11 2006/03/05 15:58:37 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.12 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -732,42 +732,6 @@ IsBackendPid(int pid)
|
||||
return (BackendPidGetProc(pid) != NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* GetAllBackendPids -- get an array of all current backends' PIDs
|
||||
*
|
||||
* The result is a palloc'd array with the number of active backends in
|
||||
* entry [0], their PIDs in entries [1] .. [n]. The caller must bear in
|
||||
* mind that the result may already be obsolete when returned.
|
||||
*/
|
||||
int *
|
||||
GetAllBackendPids(void)
|
||||
{
|
||||
int *result;
|
||||
int npids;
|
||||
ProcArrayStruct *arrayP = procArray;
|
||||
int index;
|
||||
|
||||
result = (int *) palloc((MaxBackends + 1) * sizeof(int));
|
||||
npids = 0;
|
||||
|
||||
LWLockAcquire(ProcArrayLock, LW_SHARED);
|
||||
|
||||
for (index = 0; index < arrayP->numProcs; index++)
|
||||
{
|
||||
PGPROC *proc = arrayP->procs[index];
|
||||
|
||||
if (proc->pid != 0) /* ignore dummy procs */
|
||||
result[++npids] = proc->pid;
|
||||
}
|
||||
|
||||
LWLockRelease(ProcArrayLock);
|
||||
|
||||
Assert(npids <= MaxBackends);
|
||||
|
||||
result[0] = npids;
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* CountActiveBackends --- count backends (other than myself) that are in
|
||||
* active transactions. This is used as a heuristic to decide if
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.29 2006/05/19 19:08:26 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.30 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -61,11 +61,9 @@ extern Datum pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS);
|
||||
Datum
|
||||
pg_stat_get_numscans(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -79,11 +77,9 @@ pg_stat_get_numscans(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_returned(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -97,11 +93,9 @@ pg_stat_get_tuples_returned(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -115,11 +109,9 @@ pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -133,11 +125,9 @@ pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_updated(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -151,11 +141,9 @@ pg_stat_get_tuples_updated(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -169,11 +157,9 @@ pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -187,11 +173,9 @@ pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_blocks_hit(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -204,11 +188,9 @@ pg_stat_get_blocks_hit(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
TimestampTz result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -224,11 +206,9 @@ pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
TimestampTz result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -244,11 +224,9 @@ pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
TimestampTz result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -264,11 +242,9 @@ pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
Oid relid;
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
TimestampTz result;
|
||||
|
||||
relid = PG_GETARG_OID(0);
|
||||
PgStat_StatTabEntry *tabentry;
|
||||
|
||||
if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
|
||||
result = 0;
|
||||
@ -342,75 +318,59 @@ pg_stat_reset(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_backend_pid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
PG_RETURN_INT32(beentry->procpid);
|
||||
PG_RETURN_INT32(beentry->st_procpid);
|
||||
}
|
||||
|
||||
|
||||
Datum
|
||||
pg_stat_get_backend_dbid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* Not initialized yet? */
|
||||
if (!OidIsValid(beentry->databaseid))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
PG_RETURN_OID(beentry->databaseid);
|
||||
PG_RETURN_OID(beentry->st_databaseid);
|
||||
}
|
||||
|
||||
|
||||
Datum
|
||||
pg_stat_get_backend_userid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* Not initialized yet? */
|
||||
if (!OidIsValid(beentry->userid))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
PG_RETURN_OID(beentry->userid);
|
||||
PG_RETURN_OID(beentry->st_userid);
|
||||
}
|
||||
|
||||
|
||||
Datum
|
||||
pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid;
|
||||
int len;
|
||||
char *activity;
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
text *result;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
int len;
|
||||
const char *activity;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
activity = "<backend information not available>";
|
||||
else if (!superuser() && beentry->userid != GetUserId())
|
||||
else if (!superuser() && beentry->st_userid != GetUserId())
|
||||
activity = "<insufficient privilege>";
|
||||
else if (*(beentry->activity) == '\0')
|
||||
else if (*(beentry->st_activity) == '\0')
|
||||
activity = "<command string not enabled>";
|
||||
else
|
||||
activity = beentry->activity;
|
||||
activity = beentry->st_activity;
|
||||
|
||||
len = strlen(activity);
|
||||
result = palloc(VARHDRSZ + len);
|
||||
@ -426,15 +386,15 @@ pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
TimestampTz result;
|
||||
PgStat_StatBeEntry *beentry;
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
if (!superuser() && beentry->userid != GetUserId())
|
||||
if (!superuser() && beentry->st_userid != GetUserId())
|
||||
PG_RETURN_NULL();
|
||||
|
||||
result = beentry->activity_start_timestamp;
|
||||
result = beentry->st_activity_start_timestamp;
|
||||
|
||||
/*
|
||||
* No time recorded for start of current query -- this is the case if the
|
||||
@ -451,15 +411,15 @@ pg_stat_get_backend_start(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
TimestampTz result;
|
||||
PgStat_StatBeEntry *beentry;
|
||||
PgBackendStatus *beentry;
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
if (!superuser() && beentry->userid != GetUserId())
|
||||
if (!superuser() && beentry->st_userid != GetUserId())
|
||||
PG_RETURN_NULL();
|
||||
|
||||
result = beentry->start_timestamp;
|
||||
result = beentry->st_proc_start_timestamp;
|
||||
|
||||
if (result == 0) /* probably can't happen? */
|
||||
PG_RETURN_NULL();
|
||||
@ -471,31 +431,25 @@ pg_stat_get_backend_start(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
SockAddr zero_clientaddr;
|
||||
int32 beid;
|
||||
char remote_host[NI_MAXHOST];
|
||||
int ret;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* Not initialized yet? */
|
||||
if (!OidIsValid(beentry->userid))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
if (!superuser() && beentry->userid != GetUserId())
|
||||
if (!superuser() && beentry->st_userid != GetUserId())
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* A zeroed client addr means we don't know */
|
||||
memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
|
||||
if (memcmp(&(beentry->clientaddr), &zero_clientaddr,
|
||||
if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
|
||||
sizeof(zero_clientaddr) == 0))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
switch (beentry->clientaddr.addr.ss_family)
|
||||
switch (beentry->st_clientaddr.addr.ss_family)
|
||||
{
|
||||
case AF_INET:
|
||||
#ifdef HAVE_IPV6
|
||||
@ -507,7 +461,8 @@ pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
|
||||
}
|
||||
|
||||
remote_host[0] = '\0';
|
||||
ret = pg_getnameinfo_all(&beentry->clientaddr.addr, beentry->clientaddr.salen,
|
||||
ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
|
||||
beentry->st_clientaddr.salen,
|
||||
remote_host, sizeof(remote_host),
|
||||
NULL, 0,
|
||||
NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
@ -521,31 +476,25 @@ pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatBeEntry *beentry;
|
||||
int32 beid = PG_GETARG_INT32(0);
|
||||
PgBackendStatus *beentry;
|
||||
SockAddr zero_clientaddr;
|
||||
int32 beid;
|
||||
char remote_port[NI_MAXSERV];
|
||||
int ret;
|
||||
|
||||
beid = PG_GETARG_INT32(0);
|
||||
|
||||
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* Not initialized yet? */
|
||||
if (!OidIsValid(beentry->userid))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
if (!superuser() && beentry->userid != GetUserId())
|
||||
if (!superuser() && beentry->st_userid != GetUserId())
|
||||
PG_RETURN_NULL();
|
||||
|
||||
/* A zeroed client addr means we don't know */
|
||||
memset(&zero_clientaddr, 0, sizeof(zero_clientaddr));
|
||||
if (memcmp(&(beentry->clientaddr), &zero_clientaddr,
|
||||
if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr,
|
||||
sizeof(zero_clientaddr) == 0))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
switch (beentry->clientaddr.addr.ss_family)
|
||||
switch (beentry->st_clientaddr.addr.ss_family)
|
||||
{
|
||||
case AF_INET:
|
||||
#ifdef HAVE_IPV6
|
||||
@ -559,31 +508,35 @@ pg_stat_get_backend_client_port(PG_FUNCTION_ARGS)
|
||||
}
|
||||
|
||||
remote_port[0] = '\0';
|
||||
ret = pg_getnameinfo_all(&beentry->clientaddr.addr,
|
||||
beentry->clientaddr.salen,
|
||||
ret = pg_getnameinfo_all(&beentry->st_clientaddr.addr,
|
||||
beentry->st_clientaddr.salen,
|
||||
NULL, 0,
|
||||
remote_port, sizeof(remote_port),
|
||||
NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
if (ret)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
PG_RETURN_DATUM(DirectFunctionCall1(int4in, CStringGetDatum(remote_port)));
|
||||
PG_RETURN_DATUM(DirectFunctionCall1(int4in,
|
||||
CStringGetDatum(remote_port)));
|
||||
}
|
||||
|
||||
|
||||
Datum
|
||||
pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int32 result;
|
||||
int tot_backends = pgstat_fetch_stat_numbackends();
|
||||
int beid;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
result = 0;
|
||||
for (beid = 1; beid <= tot_backends; beid++)
|
||||
{
|
||||
PgBackendStatus *beentry = pgstat_fetch_stat_beentry(beid);
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
else
|
||||
result = (int32) (dbentry->n_backends);
|
||||
if (beentry && beentry->st_databaseid == dbid)
|
||||
result++;
|
||||
}
|
||||
|
||||
PG_RETURN_INT32(result);
|
||||
}
|
||||
@ -592,11 +545,9 @@ pg_stat_get_db_numbackends(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
@ -610,11 +561,9 @@ pg_stat_get_db_xact_commit(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
@ -628,11 +577,9 @@ pg_stat_get_db_xact_rollback(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
@ -646,11 +593,9 @@ pg_stat_get_db_blocks_fetched(PG_FUNCTION_ARGS)
|
||||
Datum
|
||||
pg_stat_get_db_blocks_hit(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
Oid dbid;
|
||||
Oid dbid = PG_GETARG_OID(0);
|
||||
int64 result;
|
||||
|
||||
dbid = PG_GETARG_OID(0);
|
||||
PgStat_StatDBEntry *dbentry;
|
||||
|
||||
if ((dbentry = pgstat_fetch_stat_dbentry(dbid)) == NULL)
|
||||
result = 0;
|
||||
|
@ -10,7 +10,7 @@
|
||||
* Written by Peter Eisentraut <peter_e@gmx.net>.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.321 2006/06/05 02:49:58 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.322 2006/06/19 01:51:21 tgl Exp $
|
||||
*
|
||||
*--------------------------------------------------------------------
|
||||
*/
|
||||
@ -700,16 +700,6 @@ static struct config_bool ConfigureNamesBool[] =
|
||||
&pgstat_collect_resetonpmstart,
|
||||
false, NULL, NULL
|
||||
},
|
||||
{
|
||||
{"stats_command_string", PGC_SUSET, STATS_COLLECTOR,
|
||||
gettext_noop("Collects statistics about executing commands."),
|
||||
gettext_noop("Enables the collection of statistics on the currently "
|
||||
"executing command of each session, along with the time "
|
||||
"at which that command began execution.")
|
||||
},
|
||||
&pgstat_collect_querystring,
|
||||
false, NULL, NULL
|
||||
},
|
||||
{
|
||||
{"stats_row_level", PGC_SUSET, STATS_COLLECTOR,
|
||||
gettext_noop("Collects row-level statistics on database activity."),
|
||||
@ -727,6 +717,17 @@ static struct config_bool ConfigureNamesBool[] =
|
||||
false, NULL, NULL
|
||||
},
|
||||
|
||||
{
|
||||
{"stats_command_string", PGC_SUSET, STATS_COLLECTOR,
|
||||
gettext_noop("Collects information about executing commands."),
|
||||
gettext_noop("Enables the collection of information on the currently "
|
||||
"executing command of each session, along with the time "
|
||||
"at which that command began execution.")
|
||||
},
|
||||
&pgstat_collect_querystring,
|
||||
false, NULL, NULL
|
||||
},
|
||||
|
||||
{
|
||||
{"autovacuum", PGC_SIGHUP, AUTOVACUUM,
|
||||
gettext_noop("Starts the autovacuum subprocess."),
|
||||
|
@ -320,6 +320,14 @@
|
||||
# RUNTIME STATISTICS
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# - Query/Index Statistics Collector -
|
||||
|
||||
#stats_command_string = off
|
||||
#stats_start_collector = on # needed for block or row stats
|
||||
#stats_block_level = off
|
||||
#stats_row_level = off
|
||||
#stats_reset_on_server_start = off
|
||||
|
||||
# - Statistics Monitoring -
|
||||
|
||||
#log_parser_stats = off
|
||||
@ -327,14 +335,6 @@
|
||||
#log_executor_stats = off
|
||||
#log_statement_stats = off
|
||||
|
||||
# - Query/Index Statistics Collector -
|
||||
|
||||
#stats_start_collector = on
|
||||
#stats_command_string = off
|
||||
#stats_block_level = off
|
||||
#stats_row_level = off
|
||||
#stats_reset_on_server_start = off
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# AUTOVACUUM PARAMETERS
|
||||
|
@ -5,7 +5,7 @@
|
||||
*
|
||||
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/pgstat.h,v 1.46 2006/05/30 02:35:39 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/include/pgstat.h,v 1.47 2006/06/19 01:51:21 tgl Exp $
|
||||
* ----------
|
||||
*/
|
||||
#ifndef PGSTAT_H
|
||||
@ -16,16 +16,14 @@
|
||||
#include "utils/rel.h"
|
||||
#include "utils/timestamp.h"
|
||||
|
||||
|
||||
/* ----------
|
||||
* The types of backend/postmaster -> collector messages
|
||||
* The types of backend -> collector messages
|
||||
* ----------
|
||||
*/
|
||||
typedef enum StatMsgType
|
||||
{
|
||||
PGSTAT_MTYPE_DUMMY,
|
||||
PGSTAT_MTYPE_BESTART,
|
||||
PGSTAT_MTYPE_BETERM,
|
||||
PGSTAT_MTYPE_ACTIVITY,
|
||||
PGSTAT_MTYPE_TABSTAT,
|
||||
PGSTAT_MTYPE_TABPURGE,
|
||||
PGSTAT_MTYPE_DROPDB,
|
||||
@ -56,8 +54,6 @@ typedef struct PgStat_MsgHdr
|
||||
{
|
||||
StatMsgType m_type;
|
||||
int m_size;
|
||||
int m_backendid;
|
||||
int m_procpid;
|
||||
} PgStat_MsgHdr;
|
||||
|
||||
/* ----------
|
||||
@ -68,6 +64,17 @@ typedef struct PgStat_MsgHdr
|
||||
*/
|
||||
#define PGSTAT_MSG_PAYLOAD (1000 - sizeof(PgStat_MsgHdr))
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgDummy A dummy message, ignored by the collector
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgDummy
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
} PgStat_MsgDummy;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_TableEntry Per-table info in a MsgTabstat
|
||||
*
|
||||
@ -96,96 +103,6 @@ typedef struct PgStat_TableEntry
|
||||
PgStat_Counter t_blocks_hit;
|
||||
} PgStat_TableEntry;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgDummy A dummy message, ignored by the collector
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgDummy
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
char m_dummy[512];
|
||||
} PgStat_MsgDummy;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgBestart Sent by the backend on startup
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgBestart
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_userid;
|
||||
SockAddr m_clientaddr;
|
||||
} PgStat_MsgBestart;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgBeterm Sent by the postmaster after backend exit
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgBeterm
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
} PgStat_MsgBeterm;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgAutovacStart Sent by the autovacuum daemon to signal
|
||||
* that a database is going to be processed
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgAutovacStart
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
TimestampTz m_start_time;
|
||||
} PgStat_MsgAutovacStart;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgVacuum Sent by the backend or autovacuum daemon
|
||||
* after VACUUM or VACUUM ANALYZE
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgVacuum
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_tableoid;
|
||||
bool m_analyze;
|
||||
bool m_autovacuum;
|
||||
TimestampTz m_vacuumtime;
|
||||
PgStat_Counter m_tuples;
|
||||
} PgStat_MsgVacuum;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgAnalyze Sent by the backend or autovacuum daemon
|
||||
* after ANALYZE
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgAnalyze
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_tableoid;
|
||||
bool m_autovacuum;
|
||||
TimestampTz m_analyzetime;
|
||||
PgStat_Counter m_live_tuples;
|
||||
PgStat_Counter m_dead_tuples;
|
||||
} PgStat_MsgAnalyze;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgActivity Sent by the backends when they start
|
||||
* to parse a query.
|
||||
* ----------
|
||||
*/
|
||||
#define PGSTAT_ACTIVITY_SIZE PGSTAT_MSG_PAYLOAD
|
||||
|
||||
typedef struct PgStat_MsgActivity
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
char m_cmd_str[PGSTAT_ACTIVITY_SIZE];
|
||||
} PgStat_MsgActivity;
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgTabstat Sent by the backend to report table
|
||||
* and buffer access statistics.
|
||||
@ -205,6 +122,7 @@ typedef struct PgStat_MsgTabstat
|
||||
PgStat_TableEntry m_entry[PGSTAT_NUM_TABENTRIES];
|
||||
} PgStat_MsgTabstat;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgTabpurge Sent by the backend to tell the collector
|
||||
* about dead tables.
|
||||
@ -247,6 +165,53 @@ typedef struct PgStat_MsgResetcounter
|
||||
} PgStat_MsgResetcounter;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgAutovacStart Sent by the autovacuum daemon to signal
|
||||
* that a database is going to be processed
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgAutovacStart
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
TimestampTz m_start_time;
|
||||
} PgStat_MsgAutovacStart;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgVacuum Sent by the backend or autovacuum daemon
|
||||
* after VACUUM or VACUUM ANALYZE
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgVacuum
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_tableoid;
|
||||
bool m_analyze;
|
||||
bool m_autovacuum;
|
||||
TimestampTz m_vacuumtime;
|
||||
PgStat_Counter m_tuples;
|
||||
} PgStat_MsgVacuum;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_MsgAnalyze Sent by the backend or autovacuum daemon
|
||||
* after ANALYZE
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_MsgAnalyze
|
||||
{
|
||||
PgStat_MsgHdr m_hdr;
|
||||
Oid m_databaseid;
|
||||
Oid m_tableoid;
|
||||
bool m_autovacuum;
|
||||
TimestampTz m_analyzetime;
|
||||
PgStat_Counter m_live_tuples;
|
||||
PgStat_Counter m_dead_tuples;
|
||||
} PgStat_MsgAnalyze;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_Msg Union over all possible messages.
|
||||
* ----------
|
||||
@ -255,8 +220,6 @@ typedef union PgStat_Msg
|
||||
{
|
||||
PgStat_MsgHdr msg_hdr;
|
||||
PgStat_MsgDummy msg_dummy;
|
||||
PgStat_MsgBestart msg_bestart;
|
||||
PgStat_MsgActivity msg_activity;
|
||||
PgStat_MsgTabstat msg_tabstat;
|
||||
PgStat_MsgTabpurge msg_tabpurge;
|
||||
PgStat_MsgDropdb msg_dropdb;
|
||||
@ -275,19 +238,15 @@ typedef union PgStat_Msg
|
||||
* ------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define PGSTAT_FILE_FORMAT_ID 0x01A5BC95
|
||||
#define PGSTAT_FILE_FORMAT_ID 0x01A5BC96
|
||||
|
||||
/* ----------
|
||||
* PgStat_StatDBEntry The collector's data per database
|
||||
*
|
||||
* Note: n_backends is not maintained within the collector. It's computed
|
||||
* when a backend reads the stats file for use.
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_StatDBEntry
|
||||
{
|
||||
Oid databaseid;
|
||||
int n_backends;
|
||||
PgStat_Counter n_xact_commit;
|
||||
PgStat_Counter n_xact_rollback;
|
||||
PgStat_Counter n_blocks_fetched;
|
||||
@ -302,35 +261,6 @@ typedef struct PgStat_StatDBEntry
|
||||
} PgStat_StatDBEntry;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_StatBeEntry The collector's data per backend
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgStat_StatBeEntry
|
||||
{
|
||||
/* An entry is non-empty iff procpid > 0 */
|
||||
int procpid;
|
||||
TimestampTz start_timestamp;
|
||||
TimestampTz activity_start_timestamp;
|
||||
|
||||
/*
|
||||
* These fields are initialized by the BESTART message. If we have
|
||||
* received messages from a backend before we have received its BESTART,
|
||||
* these fields will be uninitialized: userid and databaseid will be
|
||||
* InvalidOid, and clientaddr will be undefined.
|
||||
*/
|
||||
Oid userid;
|
||||
Oid databaseid;
|
||||
SockAddr clientaddr;
|
||||
|
||||
/*
|
||||
* activity[] must be last in the struct, because we only write as much
|
||||
* of it as needed to the stats file.
|
||||
*/
|
||||
char activity[PGSTAT_ACTIVITY_SIZE];
|
||||
} PgStat_StatBeEntry;
|
||||
|
||||
|
||||
/* ----------
|
||||
* PgStat_StatTabEntry The collector's data per table (or index)
|
||||
* ----------
|
||||
@ -338,10 +268,6 @@ typedef struct PgStat_StatBeEntry
|
||||
typedef struct PgStat_StatTabEntry
|
||||
{
|
||||
Oid tableid;
|
||||
TimestampTz vacuum_timestamp; /* user initiated vacuum */
|
||||
TimestampTz autovac_vacuum_timestamp; /* autovacuum initiated */
|
||||
TimestampTz analyze_timestamp; /* user initiated */
|
||||
TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */
|
||||
|
||||
PgStat_Counter numscans;
|
||||
|
||||
@ -358,27 +284,81 @@ typedef struct PgStat_StatTabEntry
|
||||
|
||||
PgStat_Counter blocks_fetched;
|
||||
PgStat_Counter blocks_hit;
|
||||
|
||||
TimestampTz vacuum_timestamp; /* user initiated vacuum */
|
||||
TimestampTz autovac_vacuum_timestamp; /* autovacuum initiated */
|
||||
TimestampTz analyze_timestamp; /* user initiated */
|
||||
TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */
|
||||
} PgStat_StatTabEntry;
|
||||
|
||||
|
||||
/* ----------
|
||||
* Shared-memory data structures
|
||||
* ----------
|
||||
*/
|
||||
|
||||
/* Max length of st_activity string ... perhaps replace with a GUC var? */
|
||||
#define PGBE_ACTIVITY_SIZE 1024
|
||||
|
||||
/* ----------
|
||||
* PgBackendStatus
|
||||
*
|
||||
* Each live backend maintains a PgBackendStatus struct in shared memory
|
||||
* showing its current activity. (The structs are allocated according to
|
||||
* BackendId, but that is not critical.) Note that the collector process
|
||||
* has no involvement in, or even access to, these structs.
|
||||
* ----------
|
||||
*/
|
||||
typedef struct PgBackendStatus
|
||||
{
|
||||
/*
|
||||
* To avoid locking overhead, we use the following protocol: a backend
|
||||
* increments st_changecount before modifying its entry, and again after
|
||||
* finishing a modification. A would-be reader should note the value
|
||||
* of st_changecount, copy the entry into private memory, then check
|
||||
* st_changecount again. If the value hasn't changed, and if it's even,
|
||||
* the copy is valid; otherwise start over. This makes updates cheap
|
||||
* while reads are potentially expensive, but that's the tradeoff we want.
|
||||
*/
|
||||
int st_changecount;
|
||||
|
||||
/* The entry is valid iff st_procpid > 0, unused if st_procpid == 0 */
|
||||
int st_procpid;
|
||||
|
||||
/* Times of backend process start and current activity start */
|
||||
TimestampTz st_proc_start_timestamp;
|
||||
TimestampTz st_activity_start_timestamp;
|
||||
|
||||
/* Database OID, owning user's OID, connection client address */
|
||||
Oid st_databaseid;
|
||||
Oid st_userid;
|
||||
SockAddr st_clientaddr;
|
||||
|
||||
/* current command string; MUST be null-terminated */
|
||||
char st_activity[PGBE_ACTIVITY_SIZE];
|
||||
} PgBackendStatus;
|
||||
|
||||
|
||||
/* ----------
|
||||
* GUC parameters
|
||||
* ----------
|
||||
*/
|
||||
extern bool pgstat_collect_startcollector;
|
||||
extern bool pgstat_collect_resetonpmstart;
|
||||
extern bool pgstat_collect_querystring;
|
||||
extern bool pgstat_collect_tuplelevel;
|
||||
extern bool pgstat_collect_blocklevel;
|
||||
extern bool pgstat_collect_querystring;
|
||||
|
||||
|
||||
/* ----------
|
||||
* Functions called from postmaster
|
||||
* ----------
|
||||
*/
|
||||
extern Size BackendStatusShmemSize(void);
|
||||
extern void CreateSharedBackendStatus(void);
|
||||
|
||||
extern void pgstat_init(void);
|
||||
extern int pgstat_start(void);
|
||||
extern void pgstat_beterm(int pid);
|
||||
extern void pgstat_reset_all(void);
|
||||
|
||||
#ifdef EXEC_BACKEND
|
||||
@ -391,21 +371,23 @@ extern void PgstatCollectorMain(int argc, char *argv[]);
|
||||
* Functions called from backends
|
||||
* ----------
|
||||
*/
|
||||
extern void pgstat_bestart(void);
|
||||
|
||||
extern void pgstat_ping(void);
|
||||
extern void pgstat_report_activity(const char *what);
|
||||
|
||||
extern void pgstat_report_tabstat(void);
|
||||
extern void pgstat_vacuum_tabstat(void);
|
||||
extern void pgstat_drop_relation(Oid relid);
|
||||
|
||||
extern void pgstat_reset_counters(void);
|
||||
|
||||
extern void pgstat_report_autovac(Oid dboid);
|
||||
extern void pgstat_report_vacuum(Oid tableoid, bool shared,
|
||||
bool analyze, PgStat_Counter tuples);
|
||||
extern void pgstat_report_analyze(Oid tableoid, bool shared,
|
||||
PgStat_Counter livetuples,
|
||||
PgStat_Counter deadtuples);
|
||||
extern void pgstat_vacuum_tabstat(void);
|
||||
extern void pgstat_drop_relation(Oid relid);
|
||||
|
||||
extern void pgstat_reset_counters(void);
|
||||
extern void pgstat_bestart(void);
|
||||
extern void pgstat_report_activity(const char *what);
|
||||
|
||||
extern void pgstat_initstats(PgStat_Info *stats, Relation rel);
|
||||
|
||||
@ -492,7 +474,7 @@ extern void pgstat_count_xact_rollback(void);
|
||||
*/
|
||||
extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid);
|
||||
extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid);
|
||||
extern PgStat_StatBeEntry *pgstat_fetch_stat_beentry(int beid);
|
||||
extern PgBackendStatus *pgstat_fetch_stat_beentry(int beid);
|
||||
extern int pgstat_fetch_stat_numbackends(void);
|
||||
|
||||
#endif /* PGSTAT_H */
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/storage/procarray.h,v 1.8 2006/03/05 15:59:00 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/include/storage/procarray.h,v 1.9 2006/06/19 01:51:22 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -29,7 +29,6 @@ extern TransactionId GetOldestXmin(bool allDbs);
|
||||
extern PGPROC *BackendPidGetProc(int pid);
|
||||
extern int BackendXidGetPid(TransactionId xid);
|
||||
extern bool IsBackendPid(int pid);
|
||||
extern int *GetAllBackendPids(void);
|
||||
extern bool DatabaseHasActiveBackends(Oid databaseId, bool ignoreMyself);
|
||||
|
||||
extern int CountActiveBackends(void);
|
||||
|
Reference in New Issue
Block a user