Various temporary slots test improvements
Fix the tests on slow machines (per buildfarm). Add test for dropping on error. And also try to consume real changes from temporary slots. From: Petr Jelinek <petr.jelinek@2ndquadrant.com>
This commit is contained in:
parent
55caaaeba8
commit
fdf71389dd
|
@ -22,19 +22,27 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_p', 'test
|
||||||
init
|
init
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_t2', 'test_decoding', true);
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
init
|
||||||
|
(1 row)
|
||||||
|
|
||||||
-- here we want to start a new session and wait till old one is gone
|
-- here we want to start a new session and wait till old one is gone
|
||||||
select pg_backend_pid() as oldpid \gset
|
select pg_backend_pid() as oldpid \gset
|
||||||
\c -
|
\c -
|
||||||
do 'declare c int = 0;
|
do 'declare c int = 0;
|
||||||
begin
|
begin
|
||||||
while (select count(*) from pg_stat_activity where pid = '
|
while (select count(*) from pg_replication_slots where active_pid = '
|
||||||
:'oldpid'
|
:'oldpid'
|
||||||
') > 0 loop c := c + 1; perform pg_stat_clear_snapshot(); end loop;
|
') > 0 loop c := c + 1; perform pg_sleep(0.01); end loop;
|
||||||
raise log ''slot test looped % times'', c;
|
raise log ''slot test looped % times'', c;
|
||||||
end';
|
end';
|
||||||
-- should fail because the temporary slot was dropped automatically
|
-- should fail because the temporary slots were dropped automatically
|
||||||
SELECT pg_drop_replication_slot('regression_slot_t');
|
SELECT pg_drop_replication_slot('regression_slot_t');
|
||||||
ERROR: replication slot "regression_slot_t" does not exist
|
ERROR: replication slot "regression_slot_t" does not exist
|
||||||
|
SELECT pg_drop_replication_slot('regression_slot_t2');
|
||||||
|
ERROR: replication slot "regression_slot_t2" does not exist
|
||||||
-- permanent slot has survived
|
-- 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
|
||||||
|
@ -49,19 +57,44 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_
|
||||||
init
|
init
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
CREATE TABLE replication_example(id SERIAL PRIMARY KEY, somedata int, text varchar(120));
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO replication_example(somedata, text) VALUES (1, 1);
|
||||||
|
INSERT INTO replication_example(somedata, text) VALUES (1, 2);
|
||||||
|
COMMIT;
|
||||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot2', 'test_decoding', true);
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot2', 'test_decoding', true);
|
||||||
?column?
|
?column?
|
||||||
----------
|
----------
|
||||||
init
|
init
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT * FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL);
|
INSERT INTO replication_example(somedata, text) VALUES (1, 3);
|
||||||
location | xid | data
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
||||||
----------+-----+------
|
data
|
||||||
(0 rows)
|
---------------------------------------------------------------------------------------------------------
|
||||||
|
BEGIN
|
||||||
|
table public.replication_example: INSERT: id[integer]:1 somedata[integer]:1 text[character varying]:'1'
|
||||||
|
table public.replication_example: INSERT: id[integer]:2 somedata[integer]:1 text[character varying]:'2'
|
||||||
|
COMMIT
|
||||||
|
BEGIN
|
||||||
|
table public.replication_example: INSERT: id[integer]:3 somedata[integer]:1 text[character varying]:'3'
|
||||||
|
COMMIT
|
||||||
|
(7 rows)
|
||||||
|
|
||||||
SELECT * FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL);
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
||||||
location | xid | data
|
data
|
||||||
----------+-----+------
|
---------------------------------------------------------------------------------------------------------
|
||||||
(0 rows)
|
BEGIN
|
||||||
|
table public.replication_example: INSERT: id[integer]:3 somedata[integer]:1 text[character varying]:'3'
|
||||||
|
COMMIT
|
||||||
|
(3 rows)
|
||||||
|
|
||||||
|
DROP TABLE replication_example;
|
||||||
|
-- error
|
||||||
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_decoding', true);
|
||||||
|
ERROR: replication slot "regression_slot1" already exists
|
||||||
|
-- both should error as they should be dropped on error
|
||||||
|
SELECT pg_drop_replication_slot('regression_slot1');
|
||||||
|
ERROR: replication slot "regression_slot1" does not exist
|
||||||
|
SELECT pg_drop_replication_slot('regression_slot2');
|
||||||
|
ERROR: replication slot "regression_slot2" does not exist
|
||||||
|
|
|
@ -4,25 +4,47 @@ 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);
|
||||||
|
|
||||||
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_t2', 'test_decoding', true);
|
||||||
|
|
||||||
-- here we want to start a new session and wait till old one is gone
|
-- here we want to start a new session and wait till old one is gone
|
||||||
select pg_backend_pid() as oldpid \gset
|
select pg_backend_pid() as oldpid \gset
|
||||||
\c -
|
\c -
|
||||||
do 'declare c int = 0;
|
do 'declare c int = 0;
|
||||||
begin
|
begin
|
||||||
while (select count(*) from pg_stat_activity where pid = '
|
while (select count(*) from pg_replication_slots where active_pid = '
|
||||||
:'oldpid'
|
:'oldpid'
|
||||||
') > 0 loop c := c + 1; perform pg_stat_clear_snapshot(); end loop;
|
') > 0 loop c := c + 1; perform pg_sleep(0.01); end loop;
|
||||||
raise log ''slot test looped % times'', c;
|
raise log ''slot test looped % times'', c;
|
||||||
end';
|
end';
|
||||||
|
|
||||||
-- should fail because the temporary slot was dropped automatically
|
-- should fail because the temporary slots were dropped automatically
|
||||||
SELECT pg_drop_replication_slot('regression_slot_t');
|
SELECT pg_drop_replication_slot('regression_slot_t');
|
||||||
|
SELECT pg_drop_replication_slot('regression_slot_t2');
|
||||||
|
|
||||||
-- permanent slot has survived
|
-- permanent slot has survived
|
||||||
SELECT pg_drop_replication_slot('regression_slot_p');
|
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);
|
||||||
|
|
||||||
|
CREATE TABLE replication_example(id SERIAL PRIMARY KEY, somedata int, text varchar(120));
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO replication_example(somedata, text) VALUES (1, 1);
|
||||||
|
INSERT INTO replication_example(somedata, text) VALUES (1, 2);
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot2', 'test_decoding', true);
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot2', 'test_decoding', true);
|
||||||
SELECT * FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL);
|
|
||||||
SELECT * FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL);
|
INSERT INTO replication_example(somedata, text) VALUES (1, 3);
|
||||||
|
|
||||||
|
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');
|
||||||
|
|
||||||
|
DROP TABLE replication_example;
|
||||||
|
|
||||||
|
-- error
|
||||||
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_decoding', true);
|
||||||
|
|
||||||
|
-- both should error as they should be dropped on error
|
||||||
|
SELECT pg_drop_replication_slot('regression_slot1');
|
||||||
|
SELECT pg_drop_replication_slot('regression_slot2');
|
||||||
|
|
Loading…
Reference in New Issue