| -- 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 |