1117 lines
39 KiB
PL/PgSQL
1117 lines
39 KiB
PL/PgSQL
/* contrib/polar_monitor/polar_monitor--1.2.sql */
|
|
|
|
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
|
\echo Use "CREATE EXTENSION polar_monitor" to load this file. \quit
|
|
|
|
-- Register the function.
|
|
CREATE FUNCTION polar_consistent_lsn()
|
|
RETURNS pg_lsn
|
|
AS 'MODULE_PATHNAME', 'polar_consistent_lsn'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_oldest_apply_lsn()
|
|
RETURNS pg_lsn
|
|
AS 'MODULE_PATHNAME', 'polar_oldest_apply_lsn'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_oldest_lock_lsn()
|
|
RETURNS pg_lsn
|
|
AS 'MODULE_PATHNAME', 'polar_oldest_lock_lsn'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_replica_min_used_lsn()
|
|
RETURNS pg_lsn
|
|
AS 'MODULE_PATHNAME', 'polar_replica_min_used_lsn'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_min_used_lsn()
|
|
RETURNS pg_lsn
|
|
AS 'MODULE_PATHNAME', 'polar_min_used_lsn'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_get_logindex_mem_tbl_size()
|
|
RETURNS bigint
|
|
AS 'MODULE_PATHNAME', 'polar_get_logindex_mem_tbl_size'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_used_logindex_mem_tbl_size()
|
|
RETURNS bigint
|
|
AS 'MODULE_PATHNAME', 'polar_used_logindex_mem_tbl_size'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_used_logindex_fullpage_snapshot_mem_tbl_size()
|
|
RETURNS bigint
|
|
AS 'MODULE_PATHNAME', 'polar_used_logindex_fullpage_snapshot_mem_tbl_size'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_replica_use_xlog_queue()
|
|
RETURNS bool
|
|
AS 'MODULE_PATHNAME', 'polar_replica_use_xlog_queue'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_replica_bg_replay_lsn()
|
|
RETURNS pg_lsn
|
|
AS 'MODULE_PATHNAME', 'polar_replica_bg_replay_lsn'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- useless function, keep them just for not influence performance collection tools
|
|
CREATE FUNCTION polar_xlog_buffer_full()
|
|
RETURNS bool
|
|
AS 'MODULE_PATHNAME', 'polar_xlog_buffer_full'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_page_hashtable_full()
|
|
RETURNS bool
|
|
AS 'MODULE_PATHNAME', 'polar_page_hashtable_full'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_page_hashtable_used_size()
|
|
RETURNS bigint
|
|
AS 'MODULE_PATHNAME', 'polar_page_hashtable_used_size'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- Register the normal buffer function.
|
|
CREATE FUNCTION polar_get_normal_buffercache_pages()
|
|
RETURNS SETOF RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_get_normal_buffercache_pages'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- Create a view for normal buffer convenient access.
|
|
CREATE VIEW polar_normal_buffercache AS
|
|
SELECT P.* FROM polar_get_normal_buffercache_pages() AS P
|
|
(bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid,
|
|
relforknumber int2, relblocknumber int8, isdirty bool, usagecount int2,
|
|
oldest_lsn pg_lsn, newest_lsn pg_lsn, flushnext int4, flushprev int4,
|
|
incopybuf bool,first_touched_after_copy bool, pinning_backends int4,
|
|
recently_modified_count int2, oldest_lsn_is_fake bool);
|
|
|
|
-- Don't want these to be available to public.
|
|
REVOKE ALL ON FUNCTION polar_get_normal_buffercache_pages() FROM PUBLIC;
|
|
REVOKE ALL ON polar_normal_buffercache FROM PUBLIC;
|
|
|
|
-- Register the copy buffer function.
|
|
CREATE FUNCTION polar_get_copy_buffercache_pages()
|
|
RETURNS SETOF RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_get_copy_buffercache_pages'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- Create a view for copy buffer convenient access.
|
|
CREATE VIEW polar_copy_buffercache AS
|
|
SELECT P.* FROM polar_get_copy_buffercache_pages() AS P
|
|
(bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid,
|
|
relforknumber int2, relblocknumber int8, freenext int4, passcount int4,
|
|
state int2, oldest_lsn pg_lsn, newest_lsn pg_lsn, is_flushed bool);
|
|
|
|
-- Don't want these to be available to public.
|
|
REVOKE ALL ON FUNCTION polar_get_copy_buffercache_pages() FROM PUBLIC;
|
|
REVOKE ALL ON polar_copy_buffercache FROM PUBLIC;
|
|
|
|
CREATE FUNCTION polar_flushlist(OUT size int8,
|
|
OUT put int8,
|
|
OUT remove int8,
|
|
OUT find int8,
|
|
OUT batchread int8,
|
|
OUT cbuf int8,
|
|
OUT fakelsn int8)
|
|
RETURNS record
|
|
AS 'MODULE_PATHNAME', 'polar_flushlist'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_cbuf(OUT flush int8,
|
|
OUT copy int8,
|
|
OUT unavailable int8,
|
|
OUT full int8,
|
|
OUT release int8)
|
|
RETURNS record
|
|
AS 'MODULE_PATHNAME', 'polar_cbuf'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_csnlog(OUT all_fetches int8,
|
|
OUT ub_fetches int8,
|
|
OUT ub_hits int8)
|
|
RETURNS record
|
|
AS 'MODULE_PATHNAME', 'polar_csnlog'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- Create customized replication slot func
|
|
CREATE FUNCTION polar_get_replication_slots(
|
|
OUT slot_name name,
|
|
OUT plugin name,
|
|
OUT slot_type text,
|
|
OUT datoid oid,
|
|
OUT temporary boolean,
|
|
OUT active boolean,
|
|
OUT active_pid integer,
|
|
OUT xmin xid,
|
|
OUT catalog_xmin xid,
|
|
OUT restart_lsn pg_lsn,
|
|
OUT confirmed_flush_lsn pg_lsn,
|
|
OUT polar_replica_apply_lsn pg_lsn,
|
|
OUT wal_status text,
|
|
OUT safe_wal_size int8
|
|
)
|
|
RETURNS record
|
|
AS 'MODULE_PATHNAME', 'polar_get_replication_slots'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- Create customized polar process info func
|
|
CREATE FUNCTION polar_stat_process(
|
|
OUT pid oid,
|
|
OUT wait_object int4,
|
|
OUT wait_time float8,
|
|
OUT cpu_user int8,
|
|
OUT cpu_sys int8,
|
|
OUT rss int8,
|
|
OUT shared_read_ps int8,
|
|
OUT shared_write_ps int8,
|
|
OUT shared_read_throughput int8,
|
|
OUT shared_write_throughput int8,
|
|
OUT shared_read_latency_ms float8,
|
|
OUT shared_write_latency_ms float8,
|
|
OUT local_read_ps int8,
|
|
OUT local_write_ps int8,
|
|
OUT local_read_throughput int8,
|
|
OUT local_write_throughput int8,
|
|
OUT local_read_latency_ms float8,
|
|
OUT local_write_latency_ms float8,
|
|
OUT wait_type text,
|
|
OUT queryid int8
|
|
)
|
|
RETURNS record
|
|
AS 'MODULE_PATHNAME', 'polar_stat_process'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
|
|
CREATE VIEW polar_stat_activity AS
|
|
SELECT b.*, a.queryid,
|
|
(CASE WHEN a.wait_object IS NULL and a.wait_time IS NOT NULL THEN CAST(pg_blocking_pids(b.pid) as text) ELSE CAST(a.wait_object as text) END)::text AS wait_object,
|
|
wait_type,wait_time as "wait_time_ms", cpu_user, cpu_sys, rss,
|
|
shared_read_ps, shared_write_ps, shared_read_throughput, shared_write_throughput, shared_read_latency_ms, shared_write_latency_ms,
|
|
local_read_ps, local_write_ps, local_read_throughput, local_write_throughput, local_read_latency_ms, local_write_latency_ms
|
|
FROM pg_stat_activity AS b left join polar_stat_process() AS a on b.pid = a.pid;
|
|
|
|
-- Create customized polar IO info func
|
|
CREATE FUNCTION polar_stat_io_info(
|
|
OUT pid oid,
|
|
OUT filetype text,
|
|
OUT fileloc text,
|
|
OUT open_count int8,
|
|
OUT open_latency_us float8,
|
|
OUT close_count int8,
|
|
OUT read_count int8,
|
|
OUT write_count int8,
|
|
OUT read_throughput int8,
|
|
OUT write_throughput int8,
|
|
OUT read_latency_us float8,
|
|
OUT write_latency_us float8,
|
|
OUT seek_count int8,
|
|
OUT seek_latency_us float8,
|
|
OUT creat_count int8,
|
|
OUT creat_latency_us float8,
|
|
OUT fsync_count int8,
|
|
OUT fsync_latency_us float8,
|
|
OUT falloc_count int8,
|
|
OUT falloc_latency_us float8
|
|
)
|
|
RETURNS record
|
|
AS 'MODULE_PATHNAME', 'polar_stat_io_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_stat_io_info AS
|
|
SELECT filetype, fileloc, sum(open_count) as open_count, sum(open_latency_us) as open_latency_us,
|
|
sum(close_count) as close_count, sum(read_count) as read_count, sum(write_count) as write_count, sum(read_throughput) as read_throughput,
|
|
sum(write_throughput) as write_throughput,
|
|
sum(read_latency_us) as read_latency_us, sum(write_latency_us) as write_latency_us, sum(seek_count) as seek_count, sum(seek_latency_us) as seek_latency_us,
|
|
sum(creat_count) as creat_count, sum(creat_latency_us) as creat_latency_us, sum(fsync_count) as fsync_count,
|
|
sum(fsync_latency_us) as fsync_latency_us, sum(falloc_count) as falloc_count, sum(falloc_latency_us) as falloc_latency_us
|
|
FROM polar_stat_io_info() GROUP BY filetype, fileloc;
|
|
|
|
-- Create customized io latency info func
|
|
CREATE FUNCTION polar_io_latency_info(
|
|
OUT pid oid,
|
|
OUT IOKind text,
|
|
OUT Num_LessThan200us int8,
|
|
OUT Num_LessThan400us int8,
|
|
OUT Num_LessThan600us int8,
|
|
OUT Num_LessThan800us int8,
|
|
OUT Num_LessThan1ms int8,
|
|
OUT Num_LessThan10ms int8,
|
|
OUT Num_LessThan100ms int8,
|
|
OUT Num_MoreThan100ms int8
|
|
)
|
|
RETURNS record
|
|
AS 'MODULE_PATHNAME', 'polar_io_latency_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_stat_io_latency AS
|
|
SELECT IOKind, sum(Num_LessThan200us) Num_LessThan200us, sum(Num_LessThan400us) Num_LessThan400us,
|
|
sum(Num_LessThan600us) Num_LessThan600us, sum(Num_LessThan800us) Num_LessThan800us,
|
|
sum(Num_LessThan1ms) Num_LessThan1ms, sum(Num_LessThan10ms) Num_LessThan10ms,
|
|
sum(Num_LessThan100ms) Num_LessThan100ms, sum(Num_MoreThan100ms) Num_MoreThan100ms
|
|
FROM polar_io_latency_info() GROUP BY IOKind;
|
|
|
|
-- Create customized replication slot view using polar_get_replication_slots
|
|
CREATE VIEW polar_replication_slots AS
|
|
SELECT
|
|
L.slot_name,
|
|
L.plugin,
|
|
L.slot_type,
|
|
L.datoid,
|
|
D.datname AS database,
|
|
L.temporary,
|
|
L.active,
|
|
L.active_pid,
|
|
L.xmin,
|
|
L.catalog_xmin,
|
|
L.restart_lsn,
|
|
L.confirmed_flush_lsn,
|
|
L.polar_replica_apply_lsn,
|
|
L.wal_status,
|
|
L.safe_wal_size
|
|
FROM polar_get_replication_slots() AS L
|
|
LEFT JOIN pg_database D ON (L.datoid = D.oid);
|
|
|
|
/* bulk read stats */
|
|
/* per table (or index) */
|
|
CREATE FUNCTION polar_pg_stat_get_bulk_read_calls(
|
|
IN oid,
|
|
OUT int8
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_pg_stat_get_bulk_read_calls'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_pg_stat_get_bulk_read_calls_IO(
|
|
IN oid,
|
|
OUT int8
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_pg_stat_get_bulk_read_calls_IO'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_pg_stat_get_bulk_read_blocks_IO(
|
|
IN oid,
|
|
OUT int8
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_pg_stat_get_bulk_read_blocks_IO'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
/* data per database */
|
|
CREATE FUNCTION polar_pg_stat_get_db_bulk_read_calls(
|
|
IN oid,
|
|
OUT int8
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_pg_stat_get_db_bulk_read_calls'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_pg_stat_get_db_bulk_read_calls_IO(
|
|
IN oid,
|
|
OUT int8
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_pg_stat_get_db_bulk_read_calls_IO'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_pg_stat_get_db_bulk_read_blocks_IO(
|
|
IN oid,
|
|
OUT int8
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_pg_stat_get_db_bulk_read_blocks_IO'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
|
|
CREATE VIEW polar_pg_statio_all_tables AS
|
|
SELECT
|
|
C.oid AS relid,
|
|
N.nspname AS schemaname,
|
|
C.relname AS relname,
|
|
polar_pg_stat_get_bulk_read_calls(C.oid) AS heap_bulk_read_calls,
|
|
polar_pg_stat_get_bulk_read_calls_IO(C.oid) AS heap_bulk_read_calls_IO,
|
|
polar_pg_stat_get_bulk_read_blocks_IO(C.oid) AS heap_bulk_read_blks_IO,
|
|
|
|
sum(polar_pg_stat_get_bulk_read_calls(I.indexrelid))::bigint AS idx_bulk_read_calls,
|
|
sum(polar_pg_stat_get_bulk_read_calls_IO(I.indexrelid))::bigint AS idx_bulk_read_calls_IO,
|
|
sum(polar_pg_stat_get_bulk_read_blocks_IO(I.indexrelid))::bigint AS idx_bulk_read_blks_IO,
|
|
|
|
polar_pg_stat_get_bulk_read_calls(T.oid) AS toast_bulk_read_calls,
|
|
polar_pg_stat_get_bulk_read_calls_IO(T.oid) AS toast_bulk_read_calls_IO,
|
|
polar_pg_stat_get_bulk_read_blocks_IO(T.oid) AS toast_bulk_read_blks_IO,
|
|
|
|
sum(polar_pg_stat_get_bulk_read_calls(X.indexrelid))::bigint AS tidx_bulk_read_calls,
|
|
sum(polar_pg_stat_get_bulk_read_calls_IO(X.indexrelid))::bigint AS tidx_bulk_read_calls_IO,
|
|
sum(polar_pg_stat_get_bulk_read_blocks_IO(X.indexrelid))::bigint AS tidx_bulk_read_blocks_IO
|
|
|
|
FROM pg_class C LEFT JOIN
|
|
pg_index I ON C.oid = I.indrelid LEFT JOIN
|
|
pg_class T ON C.reltoastrelid = T.oid LEFT JOIN
|
|
pg_index X ON T.oid = X.indrelid
|
|
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
|
|
WHERE C.relkind IN ('r', 't', 'm')
|
|
GROUP BY C.oid, N.nspname, C.relname, T.oid, X.indrelid;
|
|
|
|
CREATE VIEW polar_pg_statio_sys_tables AS
|
|
SELECT * FROM polar_pg_statio_all_tables
|
|
WHERE schemaname IN ('pg_catalog', 'information_schema') OR
|
|
schemaname ~ '^pg_toast';
|
|
|
|
CREATE VIEW polar_pg_statio_user_tables AS
|
|
SELECT * FROM polar_pg_statio_all_tables
|
|
WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND
|
|
schemaname !~ '^pg_toast';
|
|
|
|
CREATE VIEW polar_pg_stat_database AS
|
|
SELECT
|
|
D.oid AS datid,
|
|
D.datname AS datname,
|
|
polar_pg_stat_get_db_bulk_read_calls(D.oid) AS bulk_read_calls,
|
|
polar_pg_stat_get_db_bulk_read_calls_IO(D.oid) AS bulk_read_calls_IO,
|
|
polar_pg_stat_get_db_bulk_read_blocks_IO(D.oid) AS bulk_read_blks_IO
|
|
FROM pg_database D;
|
|
|
|
CREATE FUNCTION polar_node_type()
|
|
RETURNS text
|
|
AS 'MODULE_PATHNAME', 'polar_get_node_type'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- polar replica multi version snapshot store function and dynamic view
|
|
CREATE FUNCTION polar_get_multi_version_snapshot_store_info(
|
|
OUT shmem_size bigint,
|
|
OUT slot_num integer,
|
|
OUT retry_times integer,
|
|
OUT curr_slot_no integer,
|
|
OUT next_slot_no integer,
|
|
OUT read_retried_times bigint,
|
|
OUT read_switched_times bigint,
|
|
OUT write_retried_times bigint,
|
|
OUT write_switched_times bigint
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_get_multi_version_snapshot_store_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_multi_version_snapshot_store_info AS
|
|
SELECT * FROM polar_get_multi_version_snapshot_store_info();
|
|
|
|
-- only used by superuser
|
|
REVOKE ALL ON FUNCTION polar_get_multi_version_snapshot_store_info FROM PUBLIC;
|
|
REVOKE ALL ON polar_multi_version_snapshot_store_info FROM PUBLIC;
|
|
|
|
/* POLAR: delay dml count */
|
|
CREATE FUNCTION polar_pg_stat_get_delay_dml_count(
|
|
IN oid,
|
|
OUT int8
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_pg_stat_get_delay_dml_count'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_stat_slru(
|
|
OUT slru_type text,
|
|
OUT slots_number int4,
|
|
OUT valid_pages int4,
|
|
OUT empty_pages int4,
|
|
OUT reading_pages int4,
|
|
OUT writing_pages int4,
|
|
OUT wait_readings int4,
|
|
OUT wait_writings int4,
|
|
OUT read_count int8,
|
|
OUT read_only_count int8,
|
|
OUT read_upgrade_count int8,
|
|
OUT victim_count int8,
|
|
OUT victim_write_count int8,
|
|
OUT write_count int8,
|
|
OUT zero_count int8,
|
|
OUT flush_count int8,
|
|
OUT truncate_count int8,
|
|
OUT storage_read_count int8,
|
|
OUT storage_write_count int8
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_stat_slru'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- Register the polar_show_shared_memory.
|
|
CREATE FUNCTION polar_show_shared_memory()
|
|
RETURNS SETOF RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_show_shared_memory'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- Register the polar_shmem_total_size.
|
|
CREATE FUNCTION polar_shmem_total_size()
|
|
RETURNS SETOF RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_shmem_total_size'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_stat_shmem_total_size AS
|
|
SELECT P.* FROM polar_shmem_total_size() AS P
|
|
(shmsize int8, shmtype text);
|
|
|
|
CREATE VIEW polar_stat_shmem AS
|
|
SELECT P.* FROM polar_show_shared_memory() AS P
|
|
(shmname text, shmsize int8, shmtype text);
|
|
|
|
/*
|
|
* POLAR:
|
|
* This is an naive implementation for
|
|
* getting delta value or watching delta change on accumulated values.
|
|
* NOTE: we'd better not use this function online especially as a routine.
|
|
*
|
|
* What you need to do is:
|
|
* 1. Create a view with dimension columns and value columns.
|
|
* Dimension columns name must starts with 'd_', we use these columns as join condition.
|
|
* Value columns name must starts with 'v_', we calculate delta for these columns.
|
|
* Other columns we just get newest value in view;
|
|
* 2. Then use
|
|
* "select * from polar_delta(NULL::view_name)"
|
|
* to get delta value of view, or use
|
|
* "\watch 1 select * from polar_delta(NULL::view_name)"
|
|
* Follow up I give an simple example on watching cpu/mem/iops for every backends
|
|
*
|
|
*/
|
|
CREATE OR REPLACE FUNCTION polar_delta(IN _tbl_type anyelement)
|
|
RETURNS SETOF anyelement AS
|
|
$func$
|
|
DECLARE
|
|
r record;
|
|
pid int;
|
|
sql text;
|
|
firstselect bool;
|
|
firstjoin bool;
|
|
fieldstr text;
|
|
join_condition text;
|
|
old_tmp_table text;
|
|
new_tmp_table text;
|
|
real_tmp_table text;
|
|
BEGIN
|
|
sql := ' ';
|
|
join_condition := ' ';
|
|
fieldstr := ' ';
|
|
firstselect := true;
|
|
firstjoin := true;
|
|
pid := (SELECT PG_BACKEND_PID());
|
|
old_tmp_table := pg_typeof(_tbl_type) || '_' || pid || '_old';
|
|
new_tmp_table := pg_typeof(_tbl_type) || '_' || pid || '_new';
|
|
real_tmp_table := pg_typeof(_tbl_type) || '_' || pid || '_tmp';
|
|
|
|
SET LOCAL client_min_messages=ERROR;
|
|
/* 1. try to create two tmp table */
|
|
EXECUTE FORMAT('CREATE TEMP TABLE IF NOT EXISTS %s AS SELECT * FROM %s',
|
|
old_tmp_table, pg_typeof(_tbl_type));
|
|
EXECUTE FORMAT('CREATE TEMP TABLE IF NOT EXISTS %s AS SELECT * FROM %s',
|
|
new_tmp_table, pg_typeof(_tbl_type));
|
|
|
|
/* 2. exchange two tmp talbe for keeping old data in old_tmp_table */
|
|
EXECUTE FORMAT('ALTER TABLE %s RENAME TO %s', old_tmp_table, real_tmp_table);
|
|
EXECUTE FORMAT('ALTER TABLE %s RENAME TO %s', new_tmp_table, old_tmp_table);
|
|
EXECUTE FORMAT('ALTER TABLE %s RENAME TO %s', real_tmp_table, new_tmp_table);
|
|
|
|
/* 3. truncate and insert data into new tmp table. */
|
|
EXECUTE FORMAT('TRUNCATE TABLE %s', new_tmp_table);
|
|
EXECUTE FORMAT('INSERT INTO %s SELECT * FROM %s', new_tmp_table, pg_typeof(_tbl_type));
|
|
|
|
/* 4. Then we join old tmp table and new tmp table on dimension column to get delta values */
|
|
FOR r IN SELECT attname FROM pg_class, pg_attribute WHERE pg_class.reltype=pg_typeof(_tbl_type) AND pg_class.oid=pg_attribute.attrelid ORDER BY attnum
|
|
LOOP
|
|
IF NOT firstselect THEN
|
|
fieldstr := fieldstr || ', ';
|
|
ELSE
|
|
firstselect := false;
|
|
END IF;
|
|
|
|
IF starts_with(r.attname, 'd_') THEN
|
|
IF NOT firstjoin THEN
|
|
join_condition := join_condition || ' AND ';
|
|
ELSE
|
|
firstjoin := false;
|
|
END IF;
|
|
|
|
join_condition := join_condition || FORMAT(' old.%s = new.%s ', r.attname, r.attname);
|
|
fieldstr := fieldstr || FORMAT(' new.%s ', r.attname);
|
|
ELSE
|
|
IF starts_with(r.attname, 'v_') THEN
|
|
fieldstr := fieldstr || FORMAT(' new.%s - old.%s ', r.attname, r.attname);
|
|
ELSE
|
|
fieldstr := fieldstr || FORMAT(' new.%s', r.attname);
|
|
END IF;
|
|
END IF;
|
|
END LOOP;
|
|
|
|
sql := FORMAT('SELECT %s FROM %s new JOIN %s old ON %s',
|
|
fieldstr, new_tmp_table, old_tmp_table, join_condition);
|
|
|
|
RETURN QUERY EXECUTE sql;
|
|
END
|
|
$func$ LANGUAGE plpgsql;
|
|
|
|
/*
|
|
* POLAR: with clause would not register meta in pg_class and pg_attribute
|
|
* so we can only create reduncdent view here now.
|
|
*/
|
|
CREATE VIEW polar_stat_activity_rt_mid AS
|
|
SELECT pid AS d_pid
|
|
, backend_type AS d_backend_type
|
|
, cpu_user AS v_cpu_user
|
|
, cpu_sys AS v_cpu_sys
|
|
, rss AS rss
|
|
, local_read_ps AS v_local_read_iops
|
|
, local_write_ps AS v_local_write_iops
|
|
, local_read_throughput AS v_local_read_iothroughput
|
|
, local_write_throughput AS v_local_write_iothroughput
|
|
, local_read_latency_ms AS v_local_read_latency
|
|
, local_write_latency_ms AS v_local_write_latency
|
|
FROM
|
|
polar_stat_activity;
|
|
|
|
/*
|
|
* POLAR: watch each backend cpu, rss, iops and so on.
|
|
*/
|
|
CREATE VIEW polar_stat_activity_rt AS
|
|
SELECT d_pid AS pid
|
|
, d_backend_type AS backend_type
|
|
, v_cpu_user AS cpu_user
|
|
, v_cpu_sys AS cpu_sys
|
|
, ROUND(rss * 4096 / 1024 / 1024.0, 2) AS rss
|
|
, v_local_read_iops AS local_read_iops
|
|
, v_local_write_iops AS local_write_iops
|
|
, ROUND(v_local_read_iothroughput / 1024 / 1024, 2) AS local_read_iothroughput
|
|
, ROUND(v_local_write_iothroughput / 1024 / 1024, 2) AS local_write_iothroughput
|
|
, v_local_read_latency AS local_read_latency
|
|
, v_local_write_latency AS local_write_latency
|
|
FROM polar_delta(NULL::polar_stat_activity_rt_mid);
|
|
|
|
-- POLAR: watch async ddl lock replay worker stat
|
|
CREATE FUNCTION polar_stat_async_ddl_lock_replay_worker()
|
|
RETURNS SETOF RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_async_ddl_lock_replay_worker'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_stat_async_ddl_lock_replay_worker AS
|
|
SELECT P.* FROM polar_stat_async_ddl_lock_replay_worker() AS P
|
|
(id int4, pid int4, xid int4, lsn pg_lsn, commit_state text,
|
|
dbOid oid, relOid oid, rtime timestamp with time zone, state text);
|
|
|
|
-- POLAR: watch async ddl lock replay transaction stat
|
|
CREATE FUNCTION polar_stat_async_ddl_lock_replay_transaction()
|
|
RETURNS SETOF RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_async_ddl_lock_replay_transaction'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_stat_async_ddl_lock_replay_transaction AS
|
|
SELECT P.* FROM polar_stat_async_ddl_lock_replay_transaction() AS P
|
|
(xid int4, lsn pg_lsn, commit_state text, dbOid oid, relOid oid,
|
|
rtime timestamp with time zone, state text, worker_id int4, worker_pid int4);
|
|
|
|
-- POLAR: watch async ddl lock replay lock stat
|
|
CREATE FUNCTION polar_stat_async_ddl_lock_replay_lock()
|
|
RETURNS SETOF RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_async_ddl_lock_replay_lock'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_stat_async_ddl_lock_replay_lock AS
|
|
SELECT P.* FROM polar_stat_async_ddl_lock_replay_lock() AS P
|
|
(xid int4, dbOid oid, relOid oid, lsn pg_lsn, rtime timestamp with time zone,
|
|
state text, commit_state text, worker_id int4, worker_pid int4);
|
|
|
|
-- POLAR: control group info stat
|
|
CREATE FUNCTION polar_stat_cgroup(
|
|
OUT subtype text,
|
|
OUT infotype text,
|
|
OUT count int8
|
|
)
|
|
RETURNS SETOF record
|
|
AS 'MODULE_PATHNAME', 'polar_stat_cgroup'
|
|
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_stat_cgroup AS
|
|
SELECT * FROM polar_stat_cgroup();
|
|
|
|
GRANT SELECT ON polar_stat_cgroup TO PUBLIC;
|
|
|
|
-- POLAR: control group quato
|
|
CREATE FUNCTION polar_cgroup_quota(
|
|
OUT subtype text,
|
|
OUT infotype text,
|
|
OUT count int8
|
|
)
|
|
RETURNS SETOF record
|
|
AS 'MODULE_PATHNAME', 'polar_cgroup_quota'
|
|
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_cgroup_quota AS
|
|
SELECT * FROM polar_cgroup_quota();
|
|
|
|
GRANT SELECT ON polar_cgroup_quota TO PUBLIC;
|
|
|
|
/*
|
|
* POLAR dma
|
|
*/
|
|
CREATE FUNCTION polar_dma_get_member_status(
|
|
OUT server_id int8,
|
|
OUT current_term int8,
|
|
OUT current_leader int8,
|
|
OUT commit_index int8,
|
|
OUT last_log_term int8,
|
|
OUT last_log_index int8,
|
|
OUT paxos_role int4,
|
|
OUT vote_for int8
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_dma_get_member_status'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_dma_member_status AS
|
|
SELECT * FROM polar_dma_get_member_status();
|
|
|
|
CREATE FUNCTION polar_dma_get_cluster_status(
|
|
OUT server_id int8,
|
|
OUT ip_port text,
|
|
OUT match_index int8,
|
|
OUT next_index int8,
|
|
OUT role int4,
|
|
OUT has_voted bool,
|
|
OUT force_sync bool,
|
|
OUT election_weight int4,
|
|
OUT learner_source int8,
|
|
OUT pipelining bool
|
|
)
|
|
RETURNS SETOF record
|
|
AS 'MODULE_PATHNAME', 'polar_dma_get_cluster_status'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_dma_cluster_status AS
|
|
SELECT * FROM polar_dma_get_cluster_status();
|
|
|
|
CREATE FUNCTION polar_dma_get_msg_stats(
|
|
OUT server_id int8,
|
|
OUT count_msg_append_log int8,
|
|
OUT count_msg_request_vote int8,
|
|
OUT count_heartbeat int8,
|
|
OUT count_on_msg_append_log int8,
|
|
OUT count_on_msg_request_vote int8,
|
|
OUT count_on_heartbeat int8,
|
|
OUT count_replicate_log int8
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_dma_get_msg_stats'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_dma_msg_stats AS
|
|
SELECT * FROM polar_dma_get_msg_stats();
|
|
|
|
CREATE FUNCTION polar_dma_get_consensus_status(
|
|
OUT state int4,
|
|
OUT term int8,
|
|
OUT log_term int8,
|
|
OUT xlog_term int8,
|
|
OUT leader_id int8,
|
|
OUT sync_rqst_lsn pg_lsn,
|
|
OUT synced_tli int4,
|
|
OUT synced_lsn pg_lsn,
|
|
OUT purge_lsn pg_lsn,
|
|
OUT commit_index int8,
|
|
OUT flushed_lsn pg_lsn,
|
|
OUT flushed_tli int4,
|
|
OUT appened_lsn pg_lsn,
|
|
OUT commit_queue_length int8,
|
|
OUT stats_queue_length int8
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_dma_get_consensus_status'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_dma_consensus_status AS
|
|
SELECT * FROM polar_dma_get_consensus_status();
|
|
|
|
CREATE FUNCTION polar_dma_get_log_status(
|
|
OUT term int8,
|
|
OUT current_index int8,
|
|
OUT sync_index int8,
|
|
OUT last_writ_lsn pg_lsn,
|
|
OUT last_write_timeline int4,
|
|
OUT last_append_term int8,
|
|
OUT next_append_term int8,
|
|
OUT variable_length_log_next_offset int8,
|
|
OUT disable_purge bool
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_dma_get_log_status'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_dma_log_status AS
|
|
SELECT * FROM polar_dma_get_log_status();
|
|
|
|
CREATE FUNCTION polar_dma_get_meta_status(
|
|
OUT term int8,
|
|
OUT vote_for int8,
|
|
OUT last_leader_term int8,
|
|
OUT last_leader_log_index int8,
|
|
OUT scan_index int8,
|
|
OUT cluster_id int8,
|
|
OUT commit_index int8,
|
|
OUT purge_index int8,
|
|
OUT member_info_str text,
|
|
OUT learner_info_str text
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_dma_get_meta_status'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_dma_meta_status AS
|
|
SELECT * FROM polar_dma_get_meta_status();
|
|
|
|
CREATE FUNCTION polar_dma_get_consensus_stats(
|
|
OUT transit_waits int8,
|
|
OUT xlog_transit_waits int8,
|
|
OUT xlog_flush_waits int8,
|
|
OUT consensus_appends int8,
|
|
OUT consensus_wakeups int8,
|
|
OUT consensus_backend_wakeups int8,
|
|
OUT consensus_commit_waits int8,
|
|
OUT consensus_commit_wait_time int8
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_dma_get_consensus_stats'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_dma_consensus_stats AS
|
|
SELECT * FROM polar_dma_get_consensus_stats();
|
|
|
|
CREATE FUNCTION polar_dma_get_log_stats(
|
|
OUT log_reads int8,
|
|
OUT variable_log_reads int8,
|
|
OUT log_appends int8,
|
|
OUT variable_log_appends int8,
|
|
OUT log_flushes int8,
|
|
OUT meta_flushes int8,
|
|
OUT xlog_flush_tries int8,
|
|
OUT xlog_flush_failed_tries int8,
|
|
OUT xlog_transit_waits int8
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_dma_get_log_stats'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_dma_log_stats AS
|
|
SELECT * FROM polar_dma_get_log_stats();
|
|
|
|
CREATE FUNCTION polar_dma_get_slru_stats(
|
|
OUT slru_type text,
|
|
OUT slots_number int4,
|
|
OUT valid_pages int4,
|
|
OUT empty_pages int4,
|
|
OUT reading_pages int4,
|
|
OUT writing_pages int4,
|
|
OUT wait_readings int4,
|
|
OUT wait_writings int4,
|
|
OUT read_count int8,
|
|
OUT read_only_count int8,
|
|
OUT read_upgrade_count int8,
|
|
OUT victim_count int8,
|
|
OUT victim_write_count int8,
|
|
OUT write_count int8,
|
|
OUT zero_count int8,
|
|
OUT flush_count int8,
|
|
OUT truncate_forward_count int8,
|
|
OUT truncate_backward_count int8,
|
|
OUT storage_read_count int8,
|
|
OUT storage_write_count int8
|
|
)
|
|
RETURNS SETOF record
|
|
AS 'MODULE_PATHNAME', 'polar_dma_get_slru_stats'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_dma_slru_stats AS
|
|
SELECT * FROM polar_dma_get_slru_stats();
|
|
|
|
CREATE FUNCTION polar_dma_wal_committed_lsn()
|
|
RETURNS pg_lsn
|
|
AS 'MODULE_PATHNAME', 'polar_dma_wal_committed_lsn'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- POLAR: DataMax exposed sql interface
|
|
CREATE FUNCTION polar_get_datamax_info(
|
|
OUT min_received_timeline INT4,
|
|
OUT min_received_lsn pg_lsn,
|
|
OUT last_received_timeline INT4,
|
|
OUT last_received_lsn pg_lsn,
|
|
OUT last_valid_received_lsn pg_lsn,
|
|
OUT clean_reserved_lsn pg_lsn,
|
|
OUT force_clean BOOL
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_get_datamax_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_set_datamax_reserved_lsn(
|
|
IN reserved_lsn pg_lsn,
|
|
IN force boolean
|
|
)
|
|
RETURNS BOOL
|
|
AS 'MODULE_PATHNAME', 'polar_set_datamax_reserved_lsn'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- POLAR: get xact split xids and splittable info, for debug and test purpose
|
|
CREATE FUNCTION polar_stat_xact_split_info(OUT xids text, OUT splittable bool, OUT lsn bigint)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_xact_split_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- polar wal function and dynamic view
|
|
CREATE FUNCTION polar_wal_pipeline_info(
|
|
OUT wal_current_insert_lsn bigint,
|
|
OUT wal_continuous_insert_lsn bigint,
|
|
OUT wal_write_lsn bigint,
|
|
OUT wal_flush_lsn bigint,
|
|
OUT unflushed_xlog_add_slot_no bigint,
|
|
OUT unflushed_xlog_del_slot_no bigint,
|
|
OUT last_notify_lsn1 bigint,
|
|
OUT last_notify_lsn2 bigint,
|
|
OUT last_notify_lsn3 bigint,
|
|
OUT last_notify_lsn4 bigint
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_wal_pipeline_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_wal_pipeline_stats(
|
|
OUT write_wroker_timeout_waits bigint,
|
|
OUT write_wroker_wakeup_waits bigint,
|
|
OUT advance_wroker_timeout_waits bigint,
|
|
OUT advance_wroker_wakeup_waits bigint,
|
|
OUT flush_wroker_timeout_waits bigint,
|
|
OUT flush_wroker_wakeup_waits bigint,
|
|
OUT notify_wroker1_timeout_waits bigint,
|
|
OUT notify_wroker1_wakeup_waits bigint,
|
|
OUT notify_wroker2_timeout_waits bigint,
|
|
OUT notify_wroker2_wakeup_waits bigint,
|
|
OUT notify_wroker3_timeout_waits bigint,
|
|
OUT notify_wroker3_wakeup_waits bigint,
|
|
OUT notify_wroker4_timeout_waits bigint,
|
|
OUT notify_wroker4_wakeup_waits bigint,
|
|
OUT total_user_group_commits bigint,
|
|
OUT total_user_spin_commits bigint,
|
|
OUT total_user_timeout_commits bigint,
|
|
OUT total_user_wakeup_commits bigint,
|
|
OUT total_user_miss_timeouts bigint,
|
|
OUT total_user_miss_wakeups bigint,
|
|
OUT total_advance_callups bigint,
|
|
OUT total_advances bigint,
|
|
OUT total_write_callups bigint,
|
|
OUT total_writes bigint,
|
|
OUT unflushed_xlog_slot_waits bigint,
|
|
OUT total_flush_callups bigint,
|
|
OUT total_flushes bigint,
|
|
OUT total_flush_merges bigint,
|
|
OUT total_notify_callups bigint,
|
|
OUT total_notifies bigint,
|
|
OUT total_notified_users bigint
|
|
)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_wal_pipeline_stats'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_wal_pipeline_info AS
|
|
SELECT * FROM polar_wal_pipeline_info();
|
|
|
|
CREATE VIEW polar_wal_pipeline_stats AS
|
|
SELECT * FROM polar_wal_pipeline_stats();
|
|
|
|
CREATE FUNCTION polar_wal_pipeline_reset_stats()
|
|
RETURNS BOOL
|
|
AS 'MODULE_PATHNAME', 'polar_wal_pipeline_reset_stats'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- only used by superuser
|
|
REVOKE ALL ON FUNCTION polar_wal_pipeline_reset_stats FROM PUBLIC;
|
|
REVOKE ALL ON FUNCTION polar_wal_pipeline_info FROM PUBLIC;
|
|
REVOKE ALL ON FUNCTION polar_wal_pipeline_stats FROM PUBLIC;
|
|
REVOKE ALL ON polar_wal_pipeline_info FROM PUBLIC;
|
|
REVOKE ALL ON polar_wal_pipeline_stats FROM PUBLIC;
|
|
|
|
-- POLAR: get flashback log write status
|
|
CREATE FUNCTION polar_stat_flashback_log_write(
|
|
OUT write_total_num bigint,
|
|
OUT bg_worker_write_num bigint,
|
|
OUT segs_added_total_num bigint,
|
|
OUT max_seg_no bigint,
|
|
OUT write_result pg_lsn,
|
|
OUT fbpoint_flog_start_ptr pg_lsn)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_flashback_log_write'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- POLAR: get flashback log buffer status
|
|
CREATE FUNCTION polar_stat_flashback_log_buf(
|
|
OUT insert_curr_ptr pg_lsn,
|
|
OUT insert_prev_ptr pg_lsn,
|
|
OUT initalized_upto pg_lsn,
|
|
OUT keep_wal_lsn pg_lsn,
|
|
OUT is_ready boolean)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_flashback_log_buf'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- POLAR: get flashback log list status
|
|
CREATE FUNCTION polar_stat_flashback_log_list(
|
|
OUT insert_total_num bigint,
|
|
OUT remove_total_num bigint,
|
|
OUT bg_remove_num bigint)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_flashback_log_list'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- POLAR: get flashback logindex status
|
|
CREATE FUNCTION polar_stat_flashback_logindex(
|
|
OUT max_ptr_in_mem bigint,
|
|
OUT max_ptr_in_disk bigint,
|
|
OUT is_ready boolean)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_flashback_logindex'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- POLAR: get flashback logindex queue status
|
|
CREATE FUNCTION polar_stat_flashback_logindex_queue(
|
|
OUT free_up_total_times bigint,
|
|
OUT read_from_file_rec_nums bigint,
|
|
OUT read_from_queue_rec_nums bigint)
|
|
RETURNS RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_flashback_logindex_queue'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- Don't want these to be available to public.
|
|
REVOKE ALL ON FUNCTION polar_show_shared_memory() FROM PUBLIC;
|
|
REVOKE ALL ON FUNCTION polar_shmem_total_size() FROM PUBLIC;
|
|
REVOKE ALL ON polar_stat_shmem FROM PUBLIC;
|
|
REVOKE ALL ON polar_stat_shmem_total_size FROM PUBLIC;
|
|
REVOKE ALL on FUNCTION polar_delta FROM PUBLIC;
|
|
REVOKE ALL on polar_stat_activity_rt_mid FROM PUBLIC;
|
|
REVOKE ALL on polar_stat_activity_rt FROM PUBLIC;
|
|
REVOKE ALL ON FUNCTION polar_stat_async_ddl_lock_replay_worker() FROM PUBLIC;
|
|
REVOKE ALL ON FUNCTION polar_stat_async_ddl_lock_replay_transaction() FROM PUBLIC;
|
|
REVOKE ALL ON FUNCTION polar_stat_async_ddl_lock_replay_lock() FROM PUBLIC;
|
|
|
|
CREATE FUNCTION polar_stat_smgr_shared_pool(
|
|
OUT total_num int4,
|
|
OUT locked_num int4,
|
|
OUT valid_num int4,
|
|
OUT dirty_num int4,
|
|
OUT syncing_num int4,
|
|
OUT just_dirtied_num int4
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_stat_smgr_shared_pool'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_stat_get_smgr_shared_mem(
|
|
IN boolean default true,
|
|
OUT spc_node OID,
|
|
OUT db_node OID,
|
|
OUT rel_node OID,
|
|
OUT backend int4,
|
|
OUT in_cache boolean,
|
|
OUT main_cache int4,
|
|
OUT fsm_cache int4,
|
|
OUT vm_cache int4,
|
|
OUT flags int4,
|
|
OUT generation int8,
|
|
OUT usecount int8
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_stat_get_smgr_shared_mem'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_get_current_db_smgr_shared_mem(
|
|
IN boolean default true,
|
|
OUT spc_node OID,
|
|
OUT db_node OID,
|
|
OUT rel_node OID,
|
|
OUT backend int4,
|
|
OUT main_real int4,
|
|
OUT fsm_real int4,
|
|
OUT vm_real int4
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_get_current_db_smgr_shared_mem'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_stat_get_smgr_shared_mem_ng(
|
|
OUT sr_offset int4,
|
|
OUT is_locked boolean,
|
|
OUT is_valid boolean,
|
|
OUT is_dirty boolean,
|
|
OUT is_syncing boolean,
|
|
OUT is_just_dirtied boolean
|
|
)
|
|
AS 'MODULE_PATHNAME', 'polar_stat_get_smgr_shared_mem_ng'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_release_target_smgr_shared_mem(
|
|
IN int4
|
|
) RETURNS VOID
|
|
AS 'MODULE_PATHNAME', 'polar_release_target_smgr_shared_mem'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- global io read time monitor
|
|
CREATE FUNCTION polar_io_read_delta_info(
|
|
OUT count int4,
|
|
OUT force_delay_times int8,
|
|
OUT less_than_delay_times int8,
|
|
OUT more_than_delay_times int8,
|
|
OUT read_size_avg int8,
|
|
OUT read_time_avg float8,
|
|
OUT current_throughtput float8,
|
|
OUT max_throuhgtput int8,
|
|
OUT user_set_throughtput bool,
|
|
OUT top_throughtput int8[]
|
|
)
|
|
RETURNS record
|
|
AS 'MODULE_PATHNAME', 'polar_io_read_delta_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
-- global proxy monitor
|
|
CREATE FUNCTION polar_stat_get_real_pid(pid int default NULL)
|
|
RETURNS INT
|
|
AS 'MODULE_PATHNAME', 'polar_stat_get_real_pid'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
CREATE FUNCTION polar_stat_get_virtual_pid(pid int default NULL)
|
|
RETURNS INT
|
|
AS 'MODULE_PATHNAME', 'polar_stat_get_virtual_pid'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE FUNCTION polar_stat_proxy_info()
|
|
RETURNS SETOF RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_stat_proxy_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
CREATE FUNCTION polar_stat_reset_proxy_info()
|
|
RETURNS void
|
|
AS 'MODULE_PATHNAME', 'polar_stat_reset_proxy_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_stat_proxy_info AS
|
|
SELECT * FROM polar_stat_proxy_info() AS P (reason text, count int8);
|
|
CREATE VIEW polar_stat_proxy_info_rt_mid AS
|
|
SELECT * FROM polar_stat_proxy_info() AS P
|
|
(d_reason text, v_count int8);
|
|
CREATE VIEW polar_stat_proxy_info_rt AS
|
|
SELECT * FROM polar_delta(NULL::polar_stat_proxy_info_rt_mid);
|
|
|
|
-- POLAR: cluster info
|
|
CREATE FUNCTION polar_cluster_info()
|
|
RETURNS SETOF RECORD
|
|
AS 'MODULE_PATHNAME', 'polar_cluster_info'
|
|
LANGUAGE C PARALLEL SAFE;
|
|
|
|
CREATE VIEW polar_cluster_info AS
|
|
SELECT P.* FROM polar_cluster_info() AS P
|
|
(name text, host text, port int4, release_date text, version text, slot_name text,
|
|
type text, state text, cpu int, cpu_quota int, memory int, memory_quota int,
|
|
iops int, iops_quota int, connection int, connection_quota int,
|
|
px_connection int, px_connection_quota int);
|
|
|
|
CREATE FUNCTION polar_set_available(available bool)
|
|
RETURNS VOID
|
|
AS 'MODULE_PATHNAME', 'polar_set_available'
|
|
LANGUAGE C PARALLEL UNSAFE;
|
|
|
|
CREATE FUNCTION polar_is_available()
|
|
RETURNS BOOL
|
|
AS 'MODULE_PATHNAME', 'polar_is_available'
|
|
LANGUAGE C PARALLEL UNSAFE;
|
|
|
|
REVOKE ALL ON polar_cluster_info FROM PUBLIC;
|
|
REVOKE ALL ON FUNCTION polar_cluster_info FROM PUBLIC;
|
|
REVOKE ALL ON FUNCTION polar_set_available FROM PUBLIC;
|
|
REVOKE ALL ON FUNCTION polar_is_available FROM PUBLIC;
|