Skip to content

Commit 2e9f2c3

Browse files
committed
Fix and restore histogram regression test
For some reason this test was disabled since PGSM v1. This commit brings it back with some improvements. This test was flacky because data it produces was distributed in buckets randomly, that leads to multiple test output variations. This commit modifies test so that waits for new bucket start if there is not enough time left in the current bucket to fit required test data.
1 parent 802b7ee commit 2e9f2c3

5 files changed

Lines changed: 107 additions & 197 deletions

File tree

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ REGRESS = basic \
3131
user \
3232
level_tracking \
3333
decode_error_level \
34-
parallel
34+
parallel \
35+
histogram
3536

3637
# Disabled because these tests require "shared_preload_libraries=pg_stat_statements",
3738
# which typical installcheck users do not have (e.g. buildfarm clients).

regression/expected/histogram.out

Lines changed: 70 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
CREATE OR REPLACE FUNCTION generate_histogram()
22
RETURNS TABLE (
3-
range TEXT, freq INT, bar TEXT
3+
RANGE TEXT, freq INT, bar TEXT
44
) AS $$
5-
Declare
5+
DECLARE
66
bucket_id integer;
7-
query_id text;
7+
query_id int8;
88
BEGIN
9-
select bucket into bucket_id from pg_stat_monitor order by calls desc limit 1;
10-
select queryid into query_id from pg_stat_monitor order by calls desc limit 1;
11-
--RAISE INFO 'bucket_id %', bucket_id;
12-
--RAISE INFO 'query_id %', query_id;
13-
return query
9+
SELECT bucket, queryid INTO bucket_id, query_id FROM pg_stat_monitor ORDER BY calls DESC LIMIT 1;
10+
-- RAISE INFO 'bucket_id %', bucket_id;
11+
-- RAISE INFO 'query_id %', query_id;
12+
RETURN query
1413
SELECT * FROM histogram(bucket_id, query_id) AS a(range TEXT, freq INT, bar TEXT);
1514
END;
1615
$$ LANGUAGE plpgsql;
@@ -19,53 +18,85 @@ DECLARE
1918
loops ALIAS FOR $1;
2019
BEGIN
2120
FOR i IN 1..loops LOOP
22-
--RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP;
23-
RAISE INFO 'Sleep % seconds', i;
24-
PERFORM pg_sleep(i);
21+
-- RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP;
22+
-- 0.4 seconds step used here to hit the same histogram buckets consistently.
23+
-- See histogram buckets timing distribution.
24+
PERFORM pg_sleep(0.4 * i);
2525
END LOOP;
2626
END;
2727
$$ LANGUAGE 'plpgsql' STRICT;
28+
CREATE OR REPLACE FUNCTION wait_for_new_bucket() RETURNS VOID AS $$
29+
DECLARE
30+
bucket_left_time int;
31+
BEGIN
32+
-- This test works correctly only if the bucket duration is default (60 seconds).
33+
SELECT 60 - EXTRACT(
34+
SECOND FROM(
35+
SELECT CURRENT_TIMESTAMP(0) bucket_start_time FROM pg_stat_monitor ORDER BY bucket_start_time DESC LIMIT 1
36+
)
37+
)::int INTO bucket_left_time;
38+
39+
-- If the bucket lifetime is less than 10 seconds, we would not fit.
40+
IF bucket_left_time <= 4 THEN
41+
-- RAISE NOTICE 'Bucket lifetime comes to an end → sleeping 4 seconds...';
42+
PERFORM pg_sleep(4);
43+
END IF;
44+
END;
45+
$$ LANGUAGE plpgsql;
2846
CREATE EXTENSION pg_stat_monitor;
47+
SELECT wait_for_new_bucket();
48+
wait_for_new_bucket
49+
---------------------
50+
51+
(1 row)
52+
2953
SELECT pg_stat_monitor_reset();
3054
pg_stat_monitor_reset
3155
-----------------------
3256

3357
(1 row)
3458

35-
Set pg_stat_monitor.pgsm_track='all';
36-
select run_pg_sleep(5);
37-
INFO: Sleep 1 seconds
38-
INFO: Sleep 2 seconds
39-
INFO: Sleep 3 seconds
40-
INFO: Sleep 4 seconds
41-
INFO: Sleep 5 seconds
59+
SET pg_stat_monitor.pgsm_track='all';
60+
SELECT run_pg_sleep(5);
4261
run_pg_sleep
4362
--------------
4463

4564
(1 row)
4665

47-
SELECT substr(query, 0,50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C";
48-
query | calls | resp_calls
49-
--------------------------------------+-------+-----------------------
50-
SELECT pg_sleep(i) | 5 | {0,0,0,0,0,0,3,2,0,0}
51-
SELECT pg_stat_monitor_reset() | 1 | {1,0,0,0,0,0,0,0,0,0}
52-
Set pg_stat_monitor.pgsm_track='all' | 1 | {1,0,0,0,0,0,0,0,0,0}
53-
select run_pg_sleep(5) | 1 | {0,0,0,0,0,0,0,0,1,0}
66+
SELECT substr(query, 0, 50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C";
67+
query | calls | resp_calls
68+
--------------------------------------+-------+-----------------------------------------------
69+
SELECT pg_sleep(0.4 * i) | 5 | {0,0,0,0,0,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0}
70+
SELECT pg_stat_monitor_reset() | 1 | {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
71+
SELECT run_pg_sleep(5) | 1 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}
72+
SET pg_stat_monitor.pgsm_track='all' | 1 | {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
5473
(4 rows)
5574

56-
select * from generate_histogram();
57-
range | freq | bar
58-
--------------------+------+--------------------------------
59-
(0 - 3)} | 0 |
60-
(3 - 10)} | 0 |
61-
(10 - 31)} | 0 |
62-
(31 - 100)} | 0 |
63-
(100 - 316)} | 0 |
64-
(316 - 1000)} | 0 |
65-
(1000 - 3162)} | 3 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
66-
(3162 - 10000)} | 2 | ■■■■■■■■■■■■■■■■■■■■
67-
(10000 - 31622)} | 0 |
68-
(31622 - 100000)} | 0 |
69-
(10 rows)
75+
SELECT * FROM generate_histogram();
76+
range | freq | bar
77+
---------------------------+------+--------------------------------
78+
{{0.000 - 1.000} | 0 |
79+
(1.000 - 2.778} | 0 |
80+
(2.778 - 4.162} | 0 |
81+
(4.162 - 6.623} | 0 |
82+
(6.623 - 11.000} | 0 |
83+
(11.000 - 18.783} | 0 |
84+
(18.783 - 32.623} | 0 |
85+
(32.623 - 57.234} | 0 |
86+
(57.234 - 101.000} | 0 |
87+
(101.000 - 178.827} | 0 |
88+
(178.827 - 317.226} | 0 |
89+
(317.226 - 563.338} | 1 | ■■■■■■■■■■■■■■■
90+
(563.338 - 1000.994} | 1 | ■■■■■■■■■■■■■■■
91+
(1000.994 - 1779.268} | 2 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
92+
(1779.268 - 3163.256} | 1 | ■■■■■■■■■■■■■■■
93+
(3163.256 - 5624.371} | 0 |
94+
(5624.371 - 10000.920} | 0 |
95+
(10000.920 - 17783.643} | 0 |
96+
(17783.643 - 31623.492} | 0 |
97+
(31623.492 - 56234.598} | 0 |
98+
(56234.598 - 100000.000} | 0 |
99+
(100000.000 - ...}} | 0 |
100+
(22 rows)
70101

71102
DROP EXTENSION pg_stat_monitor;

regression/expected/histogram_1.out

Lines changed: 0 additions & 72 deletions
This file was deleted.

regression/expected/histogram_2.out

Lines changed: 0 additions & 70 deletions
This file was deleted.

regression/sql/histogram.sql

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
CREATE OR REPLACE FUNCTION generate_histogram()
22
RETURNS TABLE (
3-
range TEXT, freq INT, bar TEXT
3+
RANGE TEXT, freq INT, bar TEXT
44
) AS $$
5-
Declare
5+
DECLARE
66
bucket_id integer;
7-
query_id text;
7+
query_id int8;
88
BEGIN
9-
select bucket into bucket_id from pg_stat_monitor order by calls desc limit 1;
10-
select queryid into query_id from pg_stat_monitor order by calls desc limit 1;
11-
--RAISE INFO 'bucket_id %', bucket_id;
12-
--RAISE INFO 'query_id %', query_id;
13-
return query
9+
SELECT bucket, queryid INTO bucket_id, query_id FROM pg_stat_monitor ORDER BY calls DESC LIMIT 1;
10+
-- RAISE INFO 'bucket_id %', bucket_id;
11+
-- RAISE INFO 'query_id %', query_id;
12+
RETURN query
1413
SELECT * FROM histogram(bucket_id, query_id) AS a(range TEXT, freq INT, bar TEXT);
1514
END;
1615
$$ LANGUAGE plpgsql;
@@ -20,20 +19,41 @@ DECLARE
2019
loops ALIAS FOR $1;
2120
BEGIN
2221
FOR i IN 1..loops LOOP
23-
--RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP;
24-
RAISE INFO 'Sleep % seconds', i;
25-
PERFORM pg_sleep(i);
22+
-- RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP;
23+
-- 0.4 seconds step used here to hit the same histogram buckets consistently.
24+
-- See histogram buckets timing distribution.
25+
PERFORM pg_sleep(0.4 * i);
2626
END LOOP;
2727
END;
2828
$$ LANGUAGE 'plpgsql' STRICT;
2929

30+
CREATE OR REPLACE FUNCTION wait_for_new_bucket() RETURNS VOID AS $$
31+
DECLARE
32+
bucket_left_time int;
33+
BEGIN
34+
-- This test works correctly only if the bucket duration is default (60 seconds).
35+
SELECT 60 - EXTRACT(
36+
SECOND FROM(
37+
SELECT CURRENT_TIMESTAMP(0) bucket_start_time FROM pg_stat_monitor ORDER BY bucket_start_time DESC LIMIT 1
38+
)
39+
)::int INTO bucket_left_time;
40+
41+
-- If the bucket lifetime is less than 10 seconds, we would not fit.
42+
IF bucket_left_time <= 4 THEN
43+
-- RAISE NOTICE 'Bucket lifetime comes to an end → sleeping 4 seconds...';
44+
PERFORM pg_sleep(4);
45+
END IF;
46+
END;
47+
$$ LANGUAGE plpgsql;
48+
3049
CREATE EXTENSION pg_stat_monitor;
50+
SELECT wait_for_new_bucket();
3151
SELECT pg_stat_monitor_reset();
32-
Set pg_stat_monitor.pgsm_track='all';
33-
select run_pg_sleep(5);
52+
SET pg_stat_monitor.pgsm_track='all';
53+
SELECT run_pg_sleep(5);
3454

35-
SELECT substr(query, 0,50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C";
55+
SELECT substr(query, 0, 50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C";
3656

37-
select * from generate_histogram();
57+
SELECT * FROM generate_histogram();
3858

3959
DROP EXTENSION pg_stat_monitor;

0 commit comments

Comments
 (0)