mirror of
https://github.com/postgres/postgres.git
synced 2025-12-06 00:02:13 +03:00
Show xid and xmin in pg_stat_activity and pg_stat_replication.
Christian Kruse, reviewed by Andres Freund and myself, with further minor adjustments by me.
This commit is contained in:
@@ -48,12 +48,14 @@
|
||||
#include "postmaster/autovacuum.h"
|
||||
#include "postmaster/fork_process.h"
|
||||
#include "postmaster/postmaster.h"
|
||||
#include "storage/proc.h"
|
||||
#include "storage/backendid.h"
|
||||
#include "storage/fd.h"
|
||||
#include "storage/ipc.h"
|
||||
#include "storage/latch.h"
|
||||
#include "storage/pg_shmem.h"
|
||||
#include "storage/procsignal.h"
|
||||
#include "storage/sinvaladt.h"
|
||||
#include "utils/ascii.h"
|
||||
#include "utils/guc.h"
|
||||
#include "utils/memutils.h"
|
||||
@@ -213,7 +215,7 @@ typedef struct TwoPhasePgStatRecord
|
||||
*/
|
||||
static MemoryContext pgStatLocalContext = NULL;
|
||||
static HTAB *pgStatDBHash = NULL;
|
||||
static PgBackendStatus *localBackendStatusTable = NULL;
|
||||
static LocalPgBackendStatus *localBackendStatusTable = NULL;
|
||||
static int localNumBackends = 0;
|
||||
|
||||
/*
|
||||
@@ -2303,6 +2305,28 @@ pgstat_fetch_stat_beentry(int beid)
|
||||
{
|
||||
pgstat_read_current_status();
|
||||
|
||||
if (beid < 1 || beid > localNumBackends)
|
||||
return NULL;
|
||||
|
||||
return &localBackendStatusTable[beid - 1].backendStatus;
|
||||
}
|
||||
|
||||
|
||||
/* ----------
|
||||
* pgstat_fetch_stat_local_beentry() -
|
||||
*
|
||||
* Like pgstat_fetch_stat_beentry() but with locally computed addtions (like
|
||||
* xid and xmin values of the backend)
|
||||
*
|
||||
* NB: caller is responsible for a check if the user is permitted to see
|
||||
* this info (especially the querystring).
|
||||
* ----------
|
||||
*/
|
||||
LocalPgBackendStatus *
|
||||
pgstat_fetch_stat_local_beentry(int beid)
|
||||
{
|
||||
pgstat_read_current_status();
|
||||
|
||||
if (beid < 1 || beid > localNumBackends)
|
||||
return NULL;
|
||||
|
||||
@@ -2783,8 +2807,8 @@ static void
|
||||
pgstat_read_current_status(void)
|
||||
{
|
||||
volatile PgBackendStatus *beentry;
|
||||
PgBackendStatus *localtable;
|
||||
PgBackendStatus *localentry;
|
||||
LocalPgBackendStatus *localtable;
|
||||
LocalPgBackendStatus *localentry;
|
||||
char *localappname,
|
||||
*localactivity;
|
||||
int i;
|
||||
@@ -2795,9 +2819,9 @@ pgstat_read_current_status(void)
|
||||
|
||||
pgstat_setup_memcxt();
|
||||
|
||||
localtable = (PgBackendStatus *)
|
||||
localtable = (LocalPgBackendStatus *)
|
||||
MemoryContextAlloc(pgStatLocalContext,
|
||||
sizeof(PgBackendStatus) * MaxBackends);
|
||||
sizeof(LocalPgBackendStatus) * MaxBackends);
|
||||
localappname = (char *)
|
||||
MemoryContextAlloc(pgStatLocalContext,
|
||||
NAMEDATALEN * MaxBackends);
|
||||
@@ -2821,19 +2845,19 @@ pgstat_read_current_status(void)
|
||||
{
|
||||
int save_changecount = beentry->st_changecount;
|
||||
|
||||
localentry->st_procpid = beentry->st_procpid;
|
||||
if (localentry->st_procpid > 0)
|
||||
localentry->backendStatus.st_procpid = beentry->st_procpid;
|
||||
if (localentry->backendStatus.st_procpid > 0)
|
||||
{
|
||||
memcpy(localentry, (char *) beentry, sizeof(PgBackendStatus));
|
||||
memcpy(&localentry->backendStatus, (char *) beentry, sizeof(PgBackendStatus));
|
||||
|
||||
/*
|
||||
* strcpy is safe even if the string is modified concurrently,
|
||||
* because there's always a \0 at the end of the buffer.
|
||||
*/
|
||||
strcpy(localappname, (char *) beentry->st_appname);
|
||||
localentry->st_appname = localappname;
|
||||
localentry->backendStatus.st_appname = localappname;
|
||||
strcpy(localactivity, (char *) beentry->st_activity);
|
||||
localentry->st_activity = localactivity;
|
||||
localentry->backendStatus.st_activity = localactivity;
|
||||
}
|
||||
|
||||
if (save_changecount == beentry->st_changecount &&
|
||||
@@ -2846,8 +2870,12 @@ pgstat_read_current_status(void)
|
||||
|
||||
beentry++;
|
||||
/* Only valid entries get included into the local array */
|
||||
if (localentry->st_procpid > 0)
|
||||
if (localentry->backendStatus.st_procpid > 0)
|
||||
{
|
||||
BackendIdGetTransactionIds(i,
|
||||
&localentry->backend_xid,
|
||||
&localentry->backend_xmin);
|
||||
|
||||
localentry++;
|
||||
localappname += NAMEDATALEN;
|
||||
localactivity += pgstat_track_activity_query_size;
|
||||
|
||||
Reference in New Issue
Block a user