From 7729166ace2fc37859b845c2dde490d6379e5a2b Mon Sep 17 00:00:00 2001
From: Amit Kapila <akapila@postgresql.org>
Date: Thu, 24 Sep 2020 16:25:12 +0530
Subject: [PATCH v8 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 10734bdb6a..0d8534e5ee 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 e638cacd3f..a312892c02 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');
-- 
2.28.0.windows.1

