From fdf71389dd5da949cb305ace9a0347d50ef0f020 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 15 Dec 2016 12:00:00 -0500 Subject: [PATCH] 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 --- contrib/test_decoding/expected/slot.out | 55 ++++++++++++++++++++----- contrib/test_decoding/sql/slot.sql | 32 +++++++++++--- 2 files changed, 71 insertions(+), 16 deletions(-) diff --git a/contrib/test_decoding/expected/slot.out b/contrib/test_decoding/expected/slot.out index c9171ffa5f..6dee1436cc 100644 --- a/contrib/test_decoding/expected/slot.out +++ b/contrib/test_decoding/expected/slot.out @@ -22,19 +22,27 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_p', 'test init (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 select pg_backend_pid() as oldpid \gset \c - do 'declare c int = 0; begin - while (select count(*) from pg_stat_activity where pid = ' + while (select count(*) from pg_replication_slots where active_pid = ' :'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; 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'); 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 SELECT pg_drop_replication_slot('regression_slot_p'); pg_drop_replication_slot @@ -49,19 +57,44 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_ init (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); ?column? ---------- init (1 row) -SELECT * FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL); - location | xid | data -----------+-----+------ -(0 rows) +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'); + data +--------------------------------------------------------------------------------------------------------- + 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); - location | xid | data -----------+-----+------ -(0 rows) +SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + data +--------------------------------------------------------------------------------------------------------- + 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 diff --git a/contrib/test_decoding/sql/slot.sql b/contrib/test_decoding/sql/slot.sql index 5d6d97a9e3..7ca83feac5 100644 --- a/contrib/test_decoding/sql/slot.sql +++ b/contrib/test_decoding/sql/slot.sql @@ -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 '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 select pg_backend_pid() as oldpid \gset \c - do 'declare c int = 0; begin - while (select count(*) from pg_stat_activity where pid = ' + while (select count(*) from pg_replication_slots where active_pid = ' :'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; 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_t2'); -- permanent slot has survived SELECT pg_drop_replication_slot('regression_slot_p'); -- test switching between slots in a session 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 * 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');