mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Fix race condition in test_decoding "slot" test.
This test, just added in commit a924c327e
, sometimes fails because
the old backend hasn't finished dropping the temporary replication slot
when the new backend looks. Borrow the previously-invented methodology
for waiting for the old process to disappear from pg_stat_activity.
Petr Jelinek
Discussion: https://postgr.es/m/62935e6f-4f1b-c433-e0fa-7f936a38b3e5@2ndquadrant.com
This commit is contained in:
@ -22,17 +22,26 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_p', 'test
|
|||||||
init
|
init
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- reconnect to clean temp slots
|
-- here we want to start a new session and wait till old one is gone
|
||||||
\c
|
select pg_backend_pid() as oldpid \gset
|
||||||
|
\c -
|
||||||
|
do 'declare c int = 0;
|
||||||
|
begin
|
||||||
|
while (select count(*) from pg_stat_activity where pid = '
|
||||||
|
:'oldpid'
|
||||||
|
') > 0 loop c := c + 1; perform pg_stat_clear_snapshot(); end loop;
|
||||||
|
raise log ''slot test looped % times'', c;
|
||||||
|
end';
|
||||||
|
-- should fail because the temporary slot was dropped automatically
|
||||||
|
SELECT pg_drop_replication_slot('regression_slot_t');
|
||||||
|
ERROR: replication slot "regression_slot_t" does not exist
|
||||||
|
-- permanent slot has survived
|
||||||
SELECT pg_drop_replication_slot('regression_slot_p');
|
SELECT pg_drop_replication_slot('regression_slot_p');
|
||||||
pg_drop_replication_slot
|
pg_drop_replication_slot
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- should fail because the temporary slot was dropped automatically
|
|
||||||
SELECT pg_drop_replication_slot('regression_slot_t');
|
|
||||||
ERROR: replication slot "regression_slot_t" does not exist
|
|
||||||
-- test switching between slots in a session
|
-- test switching between slots in a session
|
||||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_decoding', true);
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_decoding', true);
|
||||||
?column?
|
?column?
|
||||||
|
@ -4,14 +4,22 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_t', 'test
|
|||||||
SELECT pg_drop_replication_slot('regression_slot_p');
|
SELECT pg_drop_replication_slot('regression_slot_p');
|
||||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_p', 'test_decoding', false);
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_p', 'test_decoding', false);
|
||||||
|
|
||||||
-- reconnect to clean temp slots
|
-- here we want to start a new session and wait till old one is gone
|
||||||
\c
|
select pg_backend_pid() as oldpid \gset
|
||||||
|
\c -
|
||||||
SELECT pg_drop_replication_slot('regression_slot_p');
|
do 'declare c int = 0;
|
||||||
|
begin
|
||||||
|
while (select count(*) from pg_stat_activity where pid = '
|
||||||
|
:'oldpid'
|
||||||
|
') > 0 loop c := c + 1; perform pg_stat_clear_snapshot(); end loop;
|
||||||
|
raise log ''slot test looped % times'', c;
|
||||||
|
end';
|
||||||
|
|
||||||
-- should fail because the temporary slot was dropped automatically
|
-- should fail because the temporary slot was dropped automatically
|
||||||
SELECT pg_drop_replication_slot('regression_slot_t');
|
SELECT pg_drop_replication_slot('regression_slot_t');
|
||||||
|
|
||||||
|
-- permanent slot has survived
|
||||||
|
SELECT pg_drop_replication_slot('regression_slot_p');
|
||||||
|
|
||||||
-- test switching between slots in a session
|
-- test switching between slots in a session
|
||||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_decoding', true);
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_decoding', true);
|
||||||
|
Reference in New Issue
Block a user