Skip to content

Commit b025f32

Browse files
committed
Add leader_pid to pg_stat_activity
This new field tracks the PID of the group leader used with parallel query. For parallel workers and the leader, the value is set to the PID of the group leader. So, for the group leader, the value is the same as its own PID. Note that this reflects what PGPROC stores in shared memory, so as leader_pid is NULL if a backend has never been involved in parallel query. If the backend is using parallel query or has used it at least once, the value is set until the backend exits. Author: Julien Rouhaud Reviewed-by: Sergei Kornilov, Guillaume Lelarge, Michael Paquier, Tomas Vondra Discussion: https://postgr.es/m/CAOBaU_Yy5bt0vTPZ2_LUM6cUcGeqmYNoJ8-Rgto+c2+w3defYA@mail.gmail.com
1 parent bf6cc19 commit b025f32

File tree

5 files changed

+47
-25
lines changed

5 files changed

+47
-25
lines changed

doc/src/sgml/monitoring.sgml

+12
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,18 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser
622622
<entry><type>integer</type></entry>
623623
<entry>Process ID of this backend</entry>
624624
</row>
625+
<row>
626+
<entry><structfield>leader_pid</structfield></entry>
627+
<entry><type>integer</type></entry>
628+
<entry>
629+
Process ID of the parallel group leader if this process is or
630+
has been involved in parallel query, or null. This field is set
631+
when a process wants to cooperate with parallel workers, and
632+
remains set as long as the process exists. For a parallel group leader,
633+
this field is set to its own process ID. For a parallel worker,
634+
this field is set to the process ID of the parallel group leader.
635+
</entry>
636+
</row>
625637
<row>
626638
<entry><structfield>usesysid</structfield></entry>
627639
<entry><type>oid</type></entry>

src/backend/catalog/system_views.sql

+1
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,7 @@ CREATE VIEW pg_stat_activity AS
741741
S.datid AS datid,
742742
D.datname AS datname,
743743
S.pid,
744+
S.leader_pid,
744745
S.usesysid,
745746
U.rolname AS usename,
746747
S.application_name,

src/backend/utils/adt/pgstatfuncs.c

+26-18
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ pg_stat_get_progress_info(PG_FUNCTION_ARGS)
547547
Datum
548548
pg_stat_get_activity(PG_FUNCTION_ARGS)
549549
{
550-
#define PG_STAT_GET_ACTIVITY_COLS 29
550+
#define PG_STAT_GET_ACTIVITY_COLS 30
551551
int num_backends = pgstat_fetch_stat_numbackends();
552552
int curr_backend;
553553
int pid = PG_ARGISNULL(0) ? -1 : PG_GETARG_INT32(0);
@@ -686,33 +686,40 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
686686
values[5] = CStringGetTextDatum(clipped_activity);
687687
pfree(clipped_activity);
688688

689-
proc = BackendPidGetProc(beentry->st_procpid);
690-
if (proc != NULL)
691-
{
692-
uint32 raw_wait_event;
689+
/* leader_pid */
690+
nulls[29] = true;
693691

694-
raw_wait_event = UINT32_ACCESS_ONCE(proc->wait_event_info);
695-
wait_event_type = pgstat_get_wait_event_type(raw_wait_event);
696-
wait_event = pgstat_get_wait_event(raw_wait_event);
692+
proc = BackendPidGetProc(beentry->st_procpid);
697693

698-
}
699-
else if (beentry->st_backendType != B_BACKEND)
694+
if (proc == NULL && (beentry->st_backendType != B_BACKEND))
700695
{
701696
/*
702697
* For an auxiliary process, retrieve process info from
703698
* AuxiliaryProcs stored in shared-memory.
704699
*/
705700
proc = AuxiliaryPidGetProc(beentry->st_procpid);
701+
}
706702

707-
if (proc != NULL)
708-
{
709-
uint32 raw_wait_event;
703+
/*
704+
* If a PGPROC entry was retrieved, display wait events and lock
705+
* group leader information if any. To avoid extra overhead, no
706+
* extra lock is being held, so there is no guarantee of
707+
* consistency across multiple rows.
708+
*/
709+
if (proc != NULL)
710+
{
711+
uint32 raw_wait_event;
712+
PGPROC *leader;
710713

711-
raw_wait_event =
712-
UINT32_ACCESS_ONCE(proc->wait_event_info);
713-
wait_event_type =
714-
pgstat_get_wait_event_type(raw_wait_event);
715-
wait_event = pgstat_get_wait_event(raw_wait_event);
714+
raw_wait_event = UINT32_ACCESS_ONCE(proc->wait_event_info);
715+
wait_event_type = pgstat_get_wait_event_type(raw_wait_event);
716+
wait_event = pgstat_get_wait_event(raw_wait_event);
717+
718+
leader = proc->lockGroupLeader;
719+
if (leader)
720+
{
721+
values[29] = Int32GetDatum(leader->pid);
722+
nulls[29] = false;
716723
}
717724
}
718725

@@ -908,6 +915,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
908915
nulls[26] = true;
909916
nulls[27] = true;
910917
nulls[28] = true;
918+
nulls[29] = true;
911919
}
912920

913921
tuplestore_putvalues(tupstore, tupdesc, values, nulls);

src/include/catalog/pg_proc.dat

+3-3
Original file line numberDiff line numberDiff line change
@@ -5175,9 +5175,9 @@
51755175
proname => 'pg_stat_get_activity', prorows => '100', proisstrict => 'f',
51765176
proretset => 't', provolatile => 's', proparallel => 'r',
51775177
prorettype => 'record', proargtypes => 'int4',
5178-
proallargtypes => '{int4,oid,int4,oid,text,text,text,text,text,timestamptz,timestamptz,timestamptz,timestamptz,inet,text,int4,xid,xid,text,bool,text,text,int4,bool,text,numeric,text,bool,text,bool}',
5179-
proargmodes => '{i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}',
5180-
proargnames => '{pid,datid,pid,usesysid,application_name,state,query,wait_event_type,wait_event,xact_start,query_start,backend_start,state_change,client_addr,client_hostname,client_port,backend_xid,backend_xmin,backend_type,ssl,sslversion,sslcipher,sslbits,sslcompression,ssl_client_dn,ssl_client_serial,ssl_issuer_dn,gss_auth,gss_princ,gss_enc}',
5178+
proallargtypes => '{int4,oid,int4,oid,text,text,text,text,text,timestamptz,timestamptz,timestamptz,timestamptz,inet,text,int4,xid,xid,text,bool,text,text,int4,bool,text,numeric,text,bool,text,bool,int4}',
5179+
proargmodes => '{i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}',
5180+
proargnames => '{pid,datid,pid,usesysid,application_name,state,query,wait_event_type,wait_event,xact_start,query_start,backend_start,state_change,client_addr,client_hostname,client_port,backend_xid,backend_xmin,backend_type,ssl,sslversion,sslcipher,sslbits,sslcompression,ssl_client_dn,ssl_client_serial,ssl_issuer_dn,gss_auth,gss_princ,gss_enc,leader_pid}',
51815181
prosrc => 'pg_stat_get_activity' },
51825182
{ oid => '3318',
51835183
descr => 'statistics: information about progress of backends running maintenance command',

src/test/regress/expected/rules.out

+5-4
Original file line numberDiff line numberDiff line change
@@ -1730,6 +1730,7 @@ pg_shmem_allocations| SELECT pg_get_shmem_allocations.name,
17301730
pg_stat_activity| SELECT s.datid,
17311731
d.datname,
17321732
s.pid,
1733+
s.leader_pid,
17331734
s.usesysid,
17341735
u.rolname AS usename,
17351736
s.application_name,
@@ -1747,7 +1748,7 @@ pg_stat_activity| SELECT s.datid,
17471748
s.backend_xmin,
17481749
s.query,
17491750
s.backend_type
1750-
FROM ((pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, sslcompression, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc)
1751+
FROM ((pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, sslcompression, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc, leader_pid)
17511752
LEFT JOIN pg_database d ON ((s.datid = d.oid)))
17521753
LEFT JOIN pg_authid u ON ((s.usesysid = u.oid)));
17531754
pg_stat_all_indexes| SELECT c.oid AS relid,
@@ -1851,7 +1852,7 @@ pg_stat_gssapi| SELECT s.pid,
18511852
s.gss_auth AS gss_authenticated,
18521853
s.gss_princ AS principal,
18531854
s.gss_enc AS encrypted
1854-
FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, sslcompression, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc)
1855+
FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, sslcompression, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc, leader_pid)
18551856
WHERE (s.client_port IS NOT NULL);
18561857
pg_stat_progress_analyze| SELECT s.pid,
18571858
s.datid,
@@ -1984,7 +1985,7 @@ pg_stat_replication| SELECT s.pid,
19841985
w.spill_txns,
19851986
w.spill_count,
19861987
w.spill_bytes
1987-
FROM ((pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, sslcompression, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc)
1988+
FROM ((pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, sslcompression, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc, leader_pid)
19881989
JOIN pg_stat_get_wal_senders() w(pid, state, sent_lsn, write_lsn, flush_lsn, replay_lsn, write_lag, flush_lag, replay_lag, sync_priority, sync_state, reply_time, spill_txns, spill_count, spill_bytes) ON ((s.pid = w.pid)))
19891990
LEFT JOIN pg_authid u ON ((s.usesysid = u.oid)));
19901991
pg_stat_ssl| SELECT s.pid,
@@ -1996,7 +1997,7 @@ pg_stat_ssl| SELECT s.pid,
19961997
s.ssl_client_dn AS client_dn,
19971998
s.ssl_client_serial AS client_serial,
19981999
s.ssl_issuer_dn AS issuer_dn
1999-
FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, sslcompression, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc)
2000+
FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, sslcompression, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc, leader_pid)
20002001
WHERE (s.client_port IS NOT NULL);
20012002
pg_stat_subscription| SELECT su.oid AS subid,
20022003
su.subname,

0 commit comments

Comments
 (0)