mirror of https://github.com/postgres/postgres
This adds the statistics about total transactions count and total transaction data logically sent to the decoding output plugin from ReorderBuffer. Users can query the pg_stat_replication_slots view to check these stats. Suggested-by: Andres Freund Author: Vignesh C and Amit Kapila Reviewed-by: Sawada Masahiko, Amit Kapila Discussion: https://postgr.es/m/20210319185247.ldebgpdaxsowiflw@alap3.anarazel.depull/64/head
parent
1bf946bd43
commit
f5fc2f5b23
@ -0,0 +1,76 @@ |
||||
# Test replication statistics data in pg_stat_replication_slots is sane after |
||||
# drop replication slot and restart. |
||||
use strict; |
||||
use warnings; |
||||
use PostgresNode; |
||||
use TestLib; |
||||
use Test::More tests => 1; |
||||
|
||||
# Test set-up |
||||
my $node = get_new_node('test'); |
||||
$node->init(allows_streaming => 'logical'); |
||||
$node->append_conf('postgresql.conf', 'synchronous_commit = on'); |
||||
$node->start; |
||||
|
||||
# Create table. |
||||
$node->safe_psql('postgres', |
||||
"CREATE TABLE test_repl_stat(col1 int)"); |
||||
|
||||
# Create replication slots. |
||||
$node->safe_psql( |
||||
'postgres', qq[ |
||||
SELECT pg_create_logical_replication_slot('regression_slot1', 'test_decoding'); |
||||
SELECT pg_create_logical_replication_slot('regression_slot2', 'test_decoding'); |
||||
SELECT pg_create_logical_replication_slot('regression_slot3', 'test_decoding'); |
||||
SELECT pg_create_logical_replication_slot('regression_slot4', 'test_decoding'); |
||||
]); |
||||
|
||||
# Insert some data. |
||||
$node->safe_psql('postgres', "INSERT INTO test_repl_stat values(generate_series(1, 5));"); |
||||
|
||||
$node->safe_psql( |
||||
'postgres', qq[ |
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, |
||||
NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); |
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, |
||||
NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); |
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot3', NULL, |
||||
NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); |
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot4', NULL, |
||||
NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); |
||||
]); |
||||
|
||||
# Wait for the statistics to be updated. |
||||
$node->poll_query_until( |
||||
'postgres', qq[ |
||||
SELECT count(slot_name) >= 4 FROM pg_stat_replication_slots |
||||
WHERE slot_name ~ 'regression_slot' |
||||
AND total_txns > 0 AND total_bytes > 0; |
||||
]) or die "Timed out while waiting for statistics to be updated"; |
||||
|
||||
# Test to drop one of the replication slot and verify replication statistics data is |
||||
# fine after restart. |
||||
$node->safe_psql('postgres', "SELECT pg_drop_replication_slot('regression_slot4')"); |
||||
|
||||
$node->stop; |
||||
$node->start; |
||||
|
||||
# Verify statistics data present in pg_stat_replication_slots are sane after |
||||
# restart. |
||||
my $result = $node->safe_psql('postgres', |
||||
"SELECT slot_name, total_txns > 0 AS total_txn, |
||||
total_bytes > 0 AS total_bytes FROM pg_stat_replication_slots |
||||
ORDER BY slot_name" |
||||
); |
||||
is($result, qq(regression_slot1|t|t |
||||
regression_slot2|t|t |
||||
regression_slot3|t|t), 'check replication statistics are updated'); |
||||
|
||||
# cleanup |
||||
$node->safe_psql('postgres', "DROP TABLE test_repl_stat"); |
||||
$node->safe_psql('postgres', "SELECT pg_drop_replication_slot('regression_slot1')"); |
||||
$node->safe_psql('postgres', "SELECT pg_drop_replication_slot('regression_slot2')"); |
||||
$node->safe_psql('postgres', "SELECT pg_drop_replication_slot('regression_slot3')"); |
||||
|
||||
# shutdown |
||||
$node->stop; |
Loading…
Reference in new issue