From a722ed7a7d96777d506bdb6fd1791cb50974569b Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Thu, 24 Sep 2020 16:25:12 +0530 Subject: [PATCH v6 2/2] Test stats. --- contrib/test_decoding/expected/spill.out | 42 ++++++++++++++++++++++++++++++++ contrib/test_decoding/sql/spill.sql | 35 ++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/contrib/test_decoding/expected/spill.out b/contrib/test_decoding/expected/spill.out index 10734bd..0d8534e 100644 --- a/contrib/test_decoding/expected/spill.out +++ b/contrib/test_decoding/expected/spill.out @@ -1,5 +1,33 @@ -- predictability SET synchronous_commit = on; +-- function to wait for counters to advance +create function wait_for_spill_stats() returns void as $$ +declare + start_time timestamptz := clock_timestamp(); + updated bool; +begin + -- we don't want to wait forever; loop will exit after 30 seconds + for i in 1 .. 300 loop + + -- check to see if all updates have been sensed + SELECT (spill_txns > 0) INTO updated + FROM pg_stat_replication_slots WHERE name='regression_slot'; + + exit when updated; + + -- wait a little + perform pg_sleep_for('100 milliseconds'); + + -- reset stats snapshot so we can test again + perform pg_stat_clear_snapshot(); + + end loop; + + -- report time waited in postmaster log (where it won't change test output) + raise log 'wait_for_spill_stats delayed % seconds', + extract(epoch from clock_timestamp() - start_time); +end +$$ language plpgsql; SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); ?column? ---------- @@ -25,6 +53,19 @@ GROUP BY 1 ORDER BY 1; 'serialize-topbig--1 | 5000 | table public.spill_test: INSERT: data[text]:'serialize-topbig--1:1' | table public.spill_test: INSERT: data[text]:'serialize-topbig--1:5000' (1 row) +-- check stats, wait for stats collector to update +SELECT wait_for_spill_stats(); + wait_for_spill_stats +---------------------- + +(1 row) + +SELECT name, spill_txns, spill_count FROM pg_stat_replication_slots; + name | spill_txns | spill_count +-----------------+------------+------------- + regression_slot | 1 | 12 +(1 row) + -- spilling subxact, nothing in main BEGIN; SAVEPOINT s; @@ -247,6 +288,7 @@ GROUP BY 1 ORDER BY 1; 'serialize-nested-subbig-subbigabort-subbig-3 | 5000 | table public.spill_test: INSERT: data[text]:'serialize-nested-subbig-subbigabort-subbig-3:5001' | table public.spill_test: INSERT: data[text]:'serialize-nested-subbig-subbigabort-subbig-3:10000' (2 rows) +DROP FUNCTION wait_for_spill_stats(); DROP TABLE spill_test; SELECT pg_drop_replication_slot('regression_slot'); pg_drop_replication_slot diff --git a/contrib/test_decoding/sql/spill.sql b/contrib/test_decoding/sql/spill.sql index e638cac..a312892 100644 --- a/contrib/test_decoding/sql/spill.sql +++ b/contrib/test_decoding/sql/spill.sql @@ -1,6 +1,35 @@ -- predictability SET synchronous_commit = on; +-- function to wait for counters to advance +create function wait_for_spill_stats() returns void as $$ +declare + start_time timestamptz := clock_timestamp(); + updated bool; +begin + -- we don't want to wait forever; loop will exit after 30 seconds + for i in 1 .. 300 loop + + -- check to see if all updates have been sensed + SELECT (spill_txns > 0) INTO updated + FROM pg_stat_replication_slots WHERE name='regression_slot'; + + exit when updated; + + -- wait a little + perform pg_sleep_for('100 milliseconds'); + + -- reset stats snapshot so we can test again + perform pg_stat_clear_snapshot(); + + end loop; + + -- report time waited in postmaster log (where it won't change test output) + raise log 'wait_for_spill_stats delayed % seconds', + extract(epoch from clock_timestamp() - start_time); +end +$$ language plpgsql; + SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); CREATE TABLE spill_test(data text); @@ -16,6 +45,10 @@ SELECT (regexp_split_to_array(data, ':'))[4], COUNT(*), (array_agg(data))[1], (a FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL) WHERE data ~ 'INSERT' GROUP BY 1 ORDER BY 1; +-- check stats, wait for stats collector to update +SELECT wait_for_spill_stats(); +SELECT name, spill_txns, spill_count FROM pg_stat_replication_slots; + -- spilling subxact, nothing in main BEGIN; SAVEPOINT s; @@ -174,6 +207,8 @@ SELECT (regexp_split_to_array(data, ':'))[4] COLLATE "C", COUNT(*), (array_agg(d FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL) WHERE data ~ 'INSERT' GROUP BY 1 ORDER BY 1; +DROP FUNCTION wait_for_spill_stats(); + DROP TABLE spill_test; SELECT pg_drop_replication_slot('regression_slot'); -- 1.8.3.1