Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita755ea3

Browse files
committed
New system view pg_stat_replication displays activity of wal sender processes.
Itagaki Takahiro and Simon Riggs.
1 parent46d2882 commita755ea3

File tree

5 files changed

+95
-1
lines changed

5 files changed

+95
-1
lines changed

‎src/backend/catalog/system_views.sql

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,21 @@ CREATE VIEW pg_stat_activity AS
492492
WHERES.datid=D.oidAND
493493
S.usesysid=U.oid;
494494

495+
CREATEVIEWpg_stat_replicationAS
496+
SELECT
497+
S.procpid,
498+
S.usesysid,
499+
U.rolnameAS usename,
500+
S.application_name,
501+
S.client_addr,
502+
S.client_port,
503+
S.backend_start,
504+
W.sent_location
505+
FROM pg_stat_get_activity(NULL)AS S, pg_authid U,
506+
pg_stat_get_wal_senders()AS W
507+
WHERES.usesysid=U.oidAND
508+
S.procpid=W.procpid;
509+
495510
CREATEVIEWpg_stat_databaseAS
496511
SELECT
497512
D.oidAS datid,

‎src/backend/replication/walsender.c

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include<signal.h>
3838
#include<unistd.h>
3939

40+
#include"funcapi.h"
4041
#include"access/xlog_internal.h"
4142
#include"catalog/pg_type.h"
4243
#include"libpq/libpq.h"
@@ -49,6 +50,7 @@
4950
#include"storage/ipc.h"
5051
#include"storage/pmsignal.h"
5152
#include"tcop/tcopprot.h"
53+
#include"utils/builtins.h"
5254
#include"utils/guc.h"
5355
#include"utils/memutils.h"
5456
#include"utils/ps_status.h"
@@ -942,6 +944,78 @@ WalSndWakeup(void)
942944
SetLatch(&WalSndCtl->walsnds[i].latch);
943945
}
944946

947+
/*
948+
* Returns activity of walsenders, including pids and xlog locations sent to
949+
* standby servers.
950+
*/
951+
Datum
952+
pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
953+
{
954+
#definePG_STAT_GET_WAL_SENDERS_COLS 2
955+
ReturnSetInfo*rsinfo= (ReturnSetInfo*)fcinfo->resultinfo;
956+
TupleDesctupdesc;
957+
Tuplestorestate*tupstore;
958+
MemoryContextper_query_ctx;
959+
MemoryContextoldcontext;
960+
inti;
961+
962+
/* check to see if caller supports us returning a tuplestore */
963+
if (rsinfo==NULL|| !IsA(rsinfo,ReturnSetInfo))
964+
ereport(ERROR,
965+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
966+
errmsg("set-valued function called in context that cannot accept a set")));
967+
if (!(rsinfo->allowedModes&SFRM_Materialize))
968+
ereport(ERROR,
969+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
970+
errmsg("materialize mode required, but it is not " \
971+
"allowed in this context")));
972+
973+
/* Build a tuple descriptor for our result type */
974+
if (get_call_result_type(fcinfo,NULL,&tupdesc)!=TYPEFUNC_COMPOSITE)
975+
elog(ERROR,"return type must be a row type");
976+
977+
per_query_ctx=rsinfo->econtext->ecxt_per_query_memory;
978+
oldcontext=MemoryContextSwitchTo(per_query_ctx);
979+
980+
tupstore=tuplestore_begin_heap(true, false,work_mem);
981+
rsinfo->returnMode=SFRM_Materialize;
982+
rsinfo->setResult=tupstore;
983+
rsinfo->setDesc=tupdesc;
984+
985+
MemoryContextSwitchTo(oldcontext);
986+
987+
for (i=0;i<max_wal_senders;i++)
988+
{
989+
/* use volatile pointer to prevent code rearrangement */
990+
volatileWalSnd*walsnd=&WalSndCtl->walsnds[i];
991+
charsent_location[MAXFNAMELEN];
992+
XLogRecPtrsentPtr;
993+
Datumvalues[PG_STAT_GET_WAL_SENDERS_COLS];
994+
boolnulls[PG_STAT_GET_WAL_SENDERS_COLS];
995+
996+
if (walsnd->pid==0)
997+
continue;
998+
999+
SpinLockAcquire(&walsnd->mutex);
1000+
sentPtr=walsnd->sentPtr;
1001+
SpinLockRelease(&walsnd->mutex);
1002+
1003+
snprintf(sent_location,sizeof(sent_location),"%X/%X",
1004+
sentPtr.xlogid,sentPtr.xrecoff);
1005+
1006+
memset(nulls,0,sizeof(nulls));
1007+
values[0]=Int32GetDatum(walsnd->pid);
1008+
values[1]=CStringGetTextDatum(sent_location);
1009+
1010+
tuplestore_putvalues(tupstore,tupdesc,values,nulls);
1011+
}
1012+
1013+
/* clean up and return the tuplestore */
1014+
tuplestore_donestoring(tupstore);
1015+
1016+
return (Datum)0;
1017+
}
1018+
9451019
/*
9461020
* This isn't currently used for anything. Monitoring tools might be
9471021
* interested in the future, and we'll need something like this in the

‎src/include/catalog/pg_proc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3075,6 +3075,8 @@ DATA(insert OID = 1936 ( pg_stat_get_backend_idsetPGNSP PGUID 12 1 100 0 f f
30753075
DESCR("statistics: currently active backend IDs");
30763076
DATA(insertOID=2022 (pg_stat_get_activityPGNSPPGUID1211000ffffts102249"23""{23,26,23,26,25,25,16,1184,1184,1184,869,23}""{i,o,o,o,o,o,o,o,o,o,o,o}""{pid,datid,procpid,usesysid,application_name,current_query,waiting,xact_start,query_start,backend_start,client_addr,client_port}"_null_pg_stat_get_activity_null__null__null_ ));
30773077
DESCR("statistics: information about currently active backends");
3078+
DATA(insertOID=3099 (pg_stat_get_wal_sendersPGNSPPGUID121100ffffts002249"""{23,25}""{o,o}""{procpid,sent_location}"_null_pg_stat_get_wal_senders_null__null__null_ ));
3079+
DESCR("statistics: information about currently active replication");
30783080
DATA(insertOID=2026 (pg_backend_pidPGNSPPGUID12100ffftfs0023""_null__null__null__null_pg_backend_pid_null__null__null_ ));
30793081
DESCR("statistics: current backend PID");
30803082
DATA(insertOID=1937 (pg_stat_get_backend_pidPGNSPPGUID12100ffftfs1023"23"_null__null__null__null_pg_stat_get_backend_pid_null__null__null_ ));

‎src/include/replication/walsender.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,6 @@ extern Size WalSndShmemSize(void);
5454
externvoidWalSndShmemInit(void);
5555
externvoidWalSndWakeup(void);
5656

57+
externDatumpg_stat_get_wal_senders(PG_FUNCTION_ARGS);
58+
5759
#endif/* _WALSENDER_H */

‎src/test/regress/expected/rules.out

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1296,6 +1296,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
12961296
pg_stat_bgwriter | SELECT pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint, pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, pg_stat_get_buf_written_backend() AS buffers_backend, pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync, pg_stat_get_buf_alloc() AS buffers_alloc;
12971297
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, pg_stat_get_db_tuples_returned(d.oid) AS tup_returned, pg_stat_get_db_tuples_fetched(d.oid) AS tup_fetched, pg_stat_get_db_tuples_inserted(d.oid) AS tup_inserted, pg_stat_get_db_tuples_updated(d.oid) AS tup_updated, pg_stat_get_db_tuples_deleted(d.oid) AS tup_deleted, pg_stat_get_db_conflict_all(d.oid) AS conflicts FROM pg_database d;
12981298
pg_stat_database_conflicts | SELECT d.oid AS datid, d.datname, pg_stat_get_db_conflict_tablespace(d.oid) AS confl_tablespace, pg_stat_get_db_conflict_lock(d.oid) AS confl_lock, pg_stat_get_db_conflict_snapshot(d.oid) AS confl_snapshot, pg_stat_get_db_conflict_bufferpin(d.oid) AS confl_bufferpin, pg_stat_get_db_conflict_startup_deadlock(d.oid) AS confl_deadlock FROM pg_database d;
1299+
pg_stat_replication | SELECT s.procpid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_port, s.backend_start, w.sent_location FROM pg_stat_get_activity(NULL::integer) s(datid, procpid, usesysid, application_name, current_query, waiting, xact_start, query_start, backend_start, client_addr, client_port), pg_authid u, pg_stat_get_wal_senders() w(procpid, sent_location) WHERE ((s.usesysid = u.oid) AND (s.procpid = w.procpid));
12991300
pg_stat_sys_indexes | SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, pg_stat_all_indexes.relname, pg_stat_all_indexes.indexrelname, pg_stat_all_indexes.idx_scan, pg_stat_all_indexes.idx_tup_read, pg_stat_all_indexes.idx_tup_fetch FROM pg_stat_all_indexes WHERE ((pg_stat_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_indexes.schemaname ~ '^pg_toast'::text));
13001301
pg_stat_sys_tables | SELECT pg_stat_all_tables.relid, pg_stat_all_tables.schemaname, pg_stat_all_tables.relname, pg_stat_all_tables.seq_scan, pg_stat_all_tables.seq_tup_read, pg_stat_all_tables.idx_scan, pg_stat_all_tables.idx_tup_fetch, pg_stat_all_tables.n_tup_ins, pg_stat_all_tables.n_tup_upd, pg_stat_all_tables.n_tup_del, pg_stat_all_tables.n_tup_hot_upd, pg_stat_all_tables.n_live_tup, pg_stat_all_tables.n_dead_tup, pg_stat_all_tables.last_vacuum, pg_stat_all_tables.last_autovacuum, pg_stat_all_tables.last_analyze, pg_stat_all_tables.last_autoanalyze, pg_stat_all_tables.vacuum_count, pg_stat_all_tables.autovacuum_count, pg_stat_all_tables.analyze_count, pg_stat_all_tables.autoanalyze_count FROM pg_stat_all_tables WHERE ((pg_stat_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_tables.schemaname ~ '^pg_toast'::text));
13011302
pg_stat_user_functions | SELECT p.oid AS funcid, n.nspname AS schemaname, p.proname AS funcname, pg_stat_get_function_calls(p.oid) AS calls, (pg_stat_get_function_time(p.oid) / 1000) AS total_time, (pg_stat_get_function_self_time(p.oid) / 1000) AS self_time FROM (pg_proc p LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_function_calls(p.oid) IS NOT NULL));
@@ -1335,7 +1336,7 @@ SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
13351336
shoelace_obsolete | SELECT shoelace.sl_name, shoelace.sl_avail, shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm FROM shoelace WHERE (NOT (EXISTS (SELECT shoe.shoename FROM shoe WHERE (shoe.slcolor = shoelace.sl_color))));
13361337
street | SELECT r.name, r.thepath, c.cname FROM ONLY road r, real_city c WHERE (c.outline ## r.thepath);
13371338
toyemp | SELECT emp.name, emp.age, emp.location, (12 * emp.salary) AS annualsal FROM emp;
1338-
(57 rows)
1339+
(58 rows)
13391340

13401341
SELECT tablename, rulename, definition FROM pg_rules
13411342
ORDER BY tablename, rulename;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp