blob: 9bf02f770601c3053eddd17546d779f4b4d96658 [file]
-- Test pg_stat_resqueues cumulative statistics for resource queues.
0:CREATE RESOURCE QUEUE rq_stats_test WITH (active_statements = 1);
CREATE
0:CREATE ROLE role_stats_test RESOURCE QUEUE rq_stats_test;
CREATE
-- Session 1 holds the queue slot so session 2 will block.
1:SET role role_stats_test;
SET
1:BEGIN;
BEGIN
1:DECLARE c1 CURSOR FOR SELECT 1;
DECLARE
-- Session 2 submits a query that will block.
2:SET role role_stats_test;
SET
2&:SELECT pg_sleep(0); <waiting ...>
-- Verify session 2 is waiting on the resource queue.
0:SELECT wait_event_type, wait_event FROM pg_stat_activity WHERE query = 'SELECT pg_sleep(0);';
wait_event_type | wait_event
-----------------+---------------
ResourceQueue | ResourceQueue
(1 row)
-- Cancel the blocked query (increments queries_rejected).
0:SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query = 'SELECT pg_sleep(0);' AND wait_event = 'ResourceQueue';
pg_cancel_backend
-------------------
t
(1 row)
2<: <... completed>
ERROR: canceling statement due to user request
-- Release session 1's slot so later sessions can proceed.
1:CLOSE c1;
CLOSE
1:END;
END
-- Session 3 runs a query that should be admitted and complete normally.
3:SET role role_stats_test;
SET
3:SELECT 1;
?column?
----------
1
(1 row)
-- Session 4 runs another query that completes normally.
4:SET role role_stats_test;
SET
4:SELECT 2;
?column?
----------
2
(1 row)
-- All resqueue stats are written directly to shared memory (no flush needed).
-- Check that the view shows the expected minimum counts.
-- queries_submitted >= 3: sessions 2 (rejected), 3, 4
-- queries_admitted >= 2: sessions 3 and 4
-- queries_completed >= 2: sessions 3 and 4
0:SELECT queuename, queries_submitted >= 3 AS submitted_ok, queries_admitted >= 2 AS admitted_ok, queries_completed >= 2 AS completed_ok FROM pg_stat_resqueues WHERE queuename = 'rq_stats_test';
queuename | submitted_ok | admitted_ok | completed_ok
---------------+--------------+-------------+--------------
rq_stats_test | t | t | t
(1 row)
-- All counter columns must be non-negative.
0:SELECT queries_submitted >= 0 AS sub_nn, queries_admitted >= 0 AS adm_nn, queries_rejected >= 0 AS rej_nn, queries_completed >= 0 AS cmp_nn, total_wait_time_secs >= 0 AS wait_nn, max_wait_secs >= 0 AS maxw_nn, total_exec_time_secs >= 0 AS exec_nn, max_exec_secs >= 0 AS maxe_nn, total_cost >= 0 AS cost_nn, total_memory_kb >= 0 AS mem_nn FROM pg_stat_resqueues WHERE queuename = 'rq_stats_test';
sub_nn | adm_nn | rej_nn | cmp_nn | wait_nn | maxw_nn | exec_nn | maxe_nn | cost_nn | mem_nn
--------+--------+--------+--------+---------+---------+---------+---------+---------+--------
t | t | t | t | t | t | t | t | t | t
(1 row)
-- Verify pg_stat_get_resqueue_stats() returns data directly.
-- The function has OUT parameters so no column definition list is needed.
0:SELECT queries_submitted >= 0 AS ok FROM pg_stat_get_resqueue_stats( (SELECT oid FROM pg_resqueue WHERE rsqname = 'rq_stats_test') ) AS s;
ok
------
t
(1 row)
-- Cleanup.
0:DROP ROLE role_stats_test;
DROP
0:DROP RESOURCE QUEUE rq_stats_test;
DROP