Skip to content

Commit 9bf760f

Browse files
committed
Add a 'waiting' column to pg_stat_activity to carry the same information
that ps_status provides by appending 'waiting' to the PS display. This completes the project of making it feasible to turn off process title updates and instead rely on pg_stat_activity. Per my suggestion a few weeks ago.
1 parent 1be4390 commit 9bf760f

File tree

9 files changed

+83
-13
lines changed

9 files changed

+83
-13
lines changed

doc/src/sgml/monitoring.sgml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- $PostgreSQL: pgsql/doc/src/sgml/monitoring.sgml,v 1.36 2006/06/29 20:00:08 tgl Exp $ -->
1+
<!-- $PostgreSQL: pgsql/doc/src/sgml/monitoring.sgml,v 1.37 2006/08/19 01:36:23 tgl Exp $ -->
22

33
<chapter id="monitoring">
44
<title>Monitoring Database Activity</title>
@@ -245,7 +245,8 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
245245
<row>
246246
<entry><structname>pg_stat_activity</></entry>
247247
<entry>One row per server process, showing database OID, database name,
248-
process <acronym>ID</>, user OID, user name, current query, time at
248+
process <acronym>ID</>, user OID, user name, current query, query's
249+
waiting status, time at
249250
which the current query began execution, time at which the process
250251
was started, and client's address and port number. The columns
251252
that report data on the current query are available unless the
@@ -649,6 +650,17 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
649650
</entry>
650651
</row>
651652

653+
<row>
654+
<entry><literal><function>pg_stat_get_backend_waiting</function>(<type>integer</type>)</literal></entry>
655+
<entry><type>boolean</type></entry>
656+
<entry>
657+
True if the given server process is waiting for a lock,
658+
but only if the current user is a superuser or the same user as that of
659+
the session being queried (and
660+
<varname>stats_command_string</varname> is on)
661+
</entry>
662+
</row>
663+
652664
<row>
653665
<entry><literal><function>pg_stat_get_backend_activity_start</function>(<type>integer</type>)</literal></entry>
654666
<entry><type>timestamp with time zone</type></entry>

src/backend/catalog/system_views.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* Copyright (c) 1996-2006, PostgreSQL Global Development Group
55
*
6-
* $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.29 2006/07/27 08:30:41 petere Exp $
6+
* $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.30 2006/08/19 01:36:24 tgl Exp $
77
*/
88

99
CREATE VIEW pg_roles AS
@@ -332,7 +332,8 @@ CREATE VIEW pg_stat_activity AS
332332
pg_stat_get_backend_pid(S.backendid) AS procpid,
333333
pg_stat_get_backend_userid(S.backendid) AS usesysid,
334334
U.rolname AS usename,
335-
pg_stat_get_backend_activity(S.backendid) AS current_query,
335+
pg_stat_get_backend_activity(S.backendid) AS current_query,
336+
pg_stat_get_backend_waiting(S.backendid) AS waiting,
336337
pg_stat_get_backend_activity_start(S.backendid) AS query_start,
337338
pg_stat_get_backend_start(S.backendid) AS backend_start,
338339
pg_stat_get_backend_client_addr(S.backendid) AS client_addr,

src/backend/postmaster/pgstat.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
1515
*
16-
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.136 2006/07/16 18:17:14 tgl Exp $
16+
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.137 2006/08/19 01:36:24 tgl Exp $
1717
* ----------
1818
*/
1919
#include "postgres.h"
@@ -1358,6 +1358,7 @@ pgstat_bestart(void)
13581358
beentry->st_databaseid = MyDatabaseId;
13591359
beentry->st_userid = userid;
13601360
beentry->st_clientaddr = clientaddr;
1361+
beentry->st_waiting = false;
13611362
beentry->st_activity[0] = '\0';
13621363
/* Also make sure the last byte in the string area is always 0 */
13631364
beentry->st_activity[PGBE_ACTIVITY_SIZE - 1] = '\0';
@@ -1445,6 +1446,31 @@ pgstat_report_activity(const char *cmd_str)
14451446
}
14461447

14471448

1449+
/* ----------
1450+
* pgstat_report_waiting() -
1451+
*
1452+
* Called from lock manager to report beginning or end of a lock wait.
1453+
* ----------
1454+
*/
1455+
void
1456+
pgstat_report_waiting(bool waiting)
1457+
{
1458+
volatile PgBackendStatus *beentry;
1459+
1460+
if (!pgstat_collect_querystring)
1461+
return;
1462+
1463+
/*
1464+
* Since this is a single-byte field in a struct that only this process
1465+
* may modify, there seems no need to bother with the st_changecount
1466+
* protocol. The update must appear atomic in any case.
1467+
*/
1468+
beentry = MyBEEntry;
1469+
1470+
beentry->st_waiting = waiting;
1471+
}
1472+
1473+
14481474
/* ----------
14491475
* pgstat_read_current_status() -
14501476
*

src/backend/storage/lmgr/lock.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/storage/lmgr/lock.c,v 1.170 2006/07/31 20:09:05 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/storage/lmgr/lock.c,v 1.171 2006/08/19 01:36:28 tgl Exp $
1212
*
1313
* NOTES
1414
* A lock table is a shared memory hash table. When
@@ -36,6 +36,7 @@
3636
#include "access/twophase.h"
3737
#include "access/twophase_rmgr.h"
3838
#include "miscadmin.h"
39+
#include "pgstat.h"
3940
#include "storage/lmgr.h"
4041
#include "utils/memutils.h"
4142
#include "utils/ps_status.h"
@@ -1114,6 +1115,7 @@ WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner)
11141115
LOCK_PRINT("WaitOnLock: sleeping on lock",
11151116
locallock->lock, locallock->tag.mode);
11161117

1118+
/* Report change to waiting status */
11171119
if (update_process_title)
11181120
{
11191121
old_status = get_ps_display(&len);
@@ -1123,7 +1125,8 @@ WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner)
11231125
set_ps_display(new_status, false);
11241126
new_status[len] = '\0'; /* truncate off " waiting" */
11251127
}
1126-
1128+
pgstat_report_waiting(true);
1129+
11271130
awaitedLock = locallock;
11281131
awaitedOwner = owner;
11291132

@@ -1160,11 +1163,13 @@ WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner)
11601163

11611164
awaitedLock = NULL;
11621165

1166+
/* Report change to non-waiting status */
11631167
if (update_process_title)
11641168
{
11651169
set_ps_display(new_status, false);
11661170
pfree(new_status);
11671171
}
1172+
pgstat_report_waiting(false);
11681173

11691174
LOCK_PRINT("WaitOnLock: wakeup on lock",
11701175
locallock->lock, locallock->tag.mode);

src/backend/utils/adt/pgstatfuncs.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.32 2006/07/14 14:52:24 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.33 2006/08/19 01:36:29 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -42,6 +42,7 @@ extern Datum pg_stat_get_backend_pid(PG_FUNCTION_ARGS);
4242
extern Datum pg_stat_get_backend_dbid(PG_FUNCTION_ARGS);
4343
extern Datum pg_stat_get_backend_userid(PG_FUNCTION_ARGS);
4444
extern Datum pg_stat_get_backend_activity(PG_FUNCTION_ARGS);
45+
extern Datum pg_stat_get_backend_waiting(PG_FUNCTION_ARGS);
4546
extern Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS);
4647
extern Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS);
4748
extern Datum pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS);
@@ -377,6 +378,25 @@ pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
377378
}
378379

379380

381+
Datum
382+
pg_stat_get_backend_waiting(PG_FUNCTION_ARGS)
383+
{
384+
int32 beid = PG_GETARG_INT32(0);
385+
bool result;
386+
PgBackendStatus *beentry;
387+
388+
if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
389+
PG_RETURN_NULL();
390+
391+
if (!superuser() && beentry->st_userid != GetUserId())
392+
PG_RETURN_NULL();
393+
394+
result = beentry->st_waiting;
395+
396+
PG_RETURN_BOOL(result);
397+
}
398+
399+
380400
Datum
381401
pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
382402
{

src/include/catalog/catversion.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
3838
* Portions Copyright (c) 1994, Regents of the University of California
3939
*
40-
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.350 2006/08/17 23:04:08 tgl Exp $
40+
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.351 2006/08/19 01:36:29 tgl Exp $
4141
*
4242
*-------------------------------------------------------------------------
4343
*/
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/* yyyymmddN */
56-
#define CATALOG_VERSION_NO 200608171
56+
#define CATALOG_VERSION_NO 200608181
5757

5858
#endif

src/include/catalog/pg_proc.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.421 2006/08/17 23:04:10 tgl Exp $
10+
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.422 2006/08/19 01:36:33 tgl Exp $
1111
*
1212
* NOTES
1313
* The script catalog/genbki.sh reads this file and generates .bki
@@ -2898,6 +2898,8 @@ DATA(insert OID = 1939 ( pg_stat_get_backend_userid PGNSP PGUID 12 f f t f s 1
28982898
DESCR("Statistics: User ID of backend");
28992899
DATA(insert OID = 1940 ( pg_stat_get_backend_activity PGNSP PGUID 12 f f t f s 1 25 "23" _null_ _null_ _null_ pg_stat_get_backend_activity - _null_ ));
29002900
DESCR("Statistics: Current query of backend");
2901+
DATA(insert OID = 2853 ( pg_stat_get_backend_waiting PGNSP PGUID 12 f f t f s 1 16 "23" _null_ _null_ _null_ pg_stat_get_backend_waiting - _null_ ));
2902+
DESCR("Statistics: Is backend currently waiting for a lock");
29012903
DATA(insert OID = 2094 ( pg_stat_get_backend_activity_start PGNSP PGUID 12 f f t f s 1 1184 "23" _null_ _null_ _null_ pg_stat_get_backend_activity_start - _null_));
29022904
DESCR("Statistics: Start time for current query of backend");
29032905
DATA(insert OID = 1391 ( pg_stat_get_backend_start PGNSP PGUID 12 f f t f s 1 1184 "23" _null_ _null_ _null_ pg_stat_get_backend_start - _null_));

src/include/pgstat.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*
66
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
77
*
8-
* $PostgreSQL: pgsql/src/include/pgstat.h,v 1.48 2006/06/29 20:00:08 tgl Exp $
8+
* $PostgreSQL: pgsql/src/include/pgstat.h,v 1.49 2006/08/19 01:36:34 tgl Exp $
99
* ----------
1010
*/
1111
#ifndef PGSTAT_H
@@ -334,6 +334,9 @@ typedef struct PgBackendStatus
334334
Oid st_userid;
335335
SockAddr st_clientaddr;
336336

337+
/* Is backend currently waiting on an lmgr lock? */
338+
bool st_waiting;
339+
337340
/* current command string; MUST be null-terminated */
338341
char st_activity[PGBE_ACTIVITY_SIZE];
339342
} PgBackendStatus;
@@ -387,6 +390,7 @@ extern void pgstat_report_analyze(Oid tableoid, bool shared,
387390

388391
extern void pgstat_bestart(void);
389392
extern void pgstat_report_activity(const char *what);
393+
extern void pgstat_report_waiting(bool waiting);
390394

391395
extern void pgstat_initstats(PgStat_Info *stats, Relation rel);
392396

src/test/regress/expected/rules.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1287,7 +1287,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
12871287
pg_rules | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition FROM ((pg_rewrite r JOIN pg_class c ON ((c.oid = r.ev_class))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name);
12881288
pg_settings | SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val FROM pg_show_all_settings() a(name text, setting text, unit text, category text, short_desc text, extra_desc text, context text, vartype text, source text, min_val text, max_val text);
12891289
pg_shadow | SELECT pg_authid.rolname AS usename, pg_authid.oid AS usesysid, pg_authid.rolcreatedb AS usecreatedb, pg_authid.rolsuper AS usesuper, pg_authid.rolcatupdate AS usecatupd, pg_authid.rolpassword AS passwd, (pg_authid.rolvaliduntil)::abstime AS valuntil, pg_authid.rolconfig AS useconfig FROM pg_authid WHERE pg_authid.rolcanlogin;
1290-
pg_stat_activity | SELECT d.oid AS datid, d.datname, pg_stat_get_backend_pid(s.backendid) AS procpid, pg_stat_get_backend_userid(s.backendid) AS usesysid, u.rolname AS usename, pg_stat_get_backend_activity(s.backendid) AS current_query, pg_stat_get_backend_activity_start(s.backendid) AS query_start, pg_stat_get_backend_start(s.backendid) AS backend_start, pg_stat_get_backend_client_addr(s.backendid) AS client_addr, pg_stat_get_backend_client_port(s.backendid) AS client_port FROM pg_database d, (SELECT pg_stat_get_backend_idset() AS backendid) s, pg_authid u WHERE ((pg_stat_get_backend_dbid(s.backendid) = d.oid) AND (pg_stat_get_backend_userid(s.backendid) = u.oid));
1290+
pg_stat_activity | SELECT d.oid AS datid, d.datname, pg_stat_get_backend_pid(s.backendid) AS procpid, pg_stat_get_backend_userid(s.backendid) AS usesysid, u.rolname AS usename, pg_stat_get_backend_activity(s.backendid) AS current_query, pg_stat_get_backend_waiting(s.backendid) AS waiting, pg_stat_get_backend_activity_start(s.backendid) AS query_start, pg_stat_get_backend_start(s.backendid) AS backend_start, pg_stat_get_backend_client_addr(s.backendid) AS client_addr, pg_stat_get_backend_client_port(s.backendid) AS client_port FROM pg_database d, (SELECT pg_stat_get_backend_idset() AS backendid) s, pg_authid u WHERE ((pg_stat_get_backend_dbid(s.backendid) = d.oid) AND (pg_stat_get_backend_userid(s.backendid) = u.oid));
12911291
pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch FROM (((pg_class c JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
12921292
pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_last_vacuum_time(c.oid) AS last_vacuum, pg_stat_get_last_autovacuum_time(c.oid) AS last_autovacuum, pg_stat_get_last_analyze_time(c.oid) AS last_analyze, pg_stat_get_last_autoanalyze_time(c.oid) AS last_autoanalyze, pg_stat_get_numscans(c.oid) AS seq_scan, pg_stat_get_tuples_returned(c.oid) AS seq_tup_read, (sum(pg_stat_get_numscans(i.indexrelid)))::bigint AS idx_scan, ((sum(pg_stat_get_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_tuples_fetched(c.oid)) AS idx_tup_fetch, pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_tuples_deleted(c.oid) AS n_tup_del FROM ((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) GROUP BY c.oid, n.nspname, c.relname;
12931293
pg_stat_database | SELECT d.oid AS datid, d.datname, pg_stat_get_db_numbackends(d.oid) AS numbackends, pg_stat_get_db_xact_commit(d.oid) AS xact_commit, pg_stat_get_db_xact_rollback(d.oid) AS xact_rollback, (pg_stat_get_db_blocks_fetched(d.oid) - pg_stat_get_db_blocks_hit(d.oid)) AS blks_read, pg_stat_get_db_blocks_hit(d.oid) AS blks_hit FROM pg_database d;

0 commit comments

Comments
 (0)