aboutsummaryrefslogtreecommitdiff
path: root/contrib/test_decoding/expected/stats.out
blob: dafca965201d0545ff3c4be97a5ebcd534e69b08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
-- predictability
SET synchronous_commit = on;
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
 ?column? 
----------
 init
(1 row)

CREATE TABLE stats_test(data text);
-- function to wait for counters to advance
CREATE FUNCTION wait_for_decode_stats(check_reset bool) 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 reset/updated
    SELECT CASE WHEN check_reset THEN (spill_txns = 0)
                ELSE (spill_txns > 0)
           END
    INTO updated
    FROM pg_stat_replication_slots WHERE slot_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_decode_stats delayed % seconds',
    extract(epoch from clock_timestamp() - start_time);
END
$$ LANGUAGE plpgsql;
-- spilling the xact
BEGIN;
INSERT INTO stats_test SELECT 'serialize-topbig--1:'||g.i FROM generate_series(1, 5000) g(i);
COMMIT;
SELECT count(*) FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'skip-empty-xacts', '1');
 count 
-------
  5002
(1 row)

-- Check stats, wait for the stats collector to update. We can't test the
-- exact stats count as that can vary if any background transaction (say by
-- autovacuum) happens in parallel to the main transaction.
SELECT wait_for_decode_stats(false);
 wait_for_decode_stats 
-----------------------
 
(1 row)

SELECT slot_name, spill_txns > 0 AS spill_txns, spill_count > 0 AS spill_count FROM pg_stat_replication_slots;
    slot_name    | spill_txns | spill_count 
-----------------+------------+-------------
 regression_slot | t          | t
(1 row)

-- reset the slot stats, and wait for stats collector to reset
SELECT pg_stat_reset_replication_slot('regression_slot');
 pg_stat_reset_replication_slot 
--------------------------------
 
(1 row)

SELECT wait_for_decode_stats(true);
 wait_for_decode_stats 
-----------------------
 
(1 row)

SELECT slot_name, spill_txns, spill_count FROM pg_stat_replication_slots;
    slot_name    | spill_txns | spill_count 
-----------------+------------+-------------
 regression_slot |          0 |           0
(1 row)

-- decode and check stats again.
SELECT count(*) FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'skip-empty-xacts', '1');
 count 
-------
  5002
(1 row)

SELECT wait_for_decode_stats(false);
 wait_for_decode_stats 
-----------------------
 
(1 row)

SELECT slot_name, spill_txns > 0 AS spill_txns, spill_count > 0 AS spill_count FROM pg_stat_replication_slots;
    slot_name    | spill_txns | spill_count 
-----------------+------------+-------------
 regression_slot | t          | t
(1 row)

DROP FUNCTION wait_for_decode_stats(bool);
DROP TABLE stats_test;
SELECT pg_drop_replication_slot('regression_slot');
 pg_drop_replication_slot 
--------------------------
 
(1 row)