diff options
author | Amit Kapila | 2023-09-27 09:02:51 +0000 |
---|---|---|
committer | Amit Kapila | 2023-09-27 09:02:51 +0000 |
commit | 54ccfd65868c013a8c6906bc894bc5ea3640740a (patch) | |
tree | a36b9678a875324f596ff97af123e383d597ddde /contrib/test_decoding | |
parent | 6fc3a138b1e8049a73e48d4b0f1031a1e6e7b8c6 (diff) |
Fix the misuse of origin filter across multiple pg_logical_slot_get_changes() calls.
The pgoutput module uses a global variable (publish_no_origin) to cache
the action for the origin filter, but we didn't reset the flag when
shutting down the output plugin, so subsequent retries may access the
previous publish_no_origin value.
We fix this by storing the flag in the output plugin's private data.
Additionally, the patch removes the currently unused origin string from the
structure.
For the back branch, to avoid changing the exposed structure, we eliminated the
global variable and instead directly used the origin string for change
filtering.
Author: Hou Zhijie
Reviewed-by: Amit Kapila, Michael Paquier
Backpatch-through: 16
Discussion: http://postgr.es/m/OS0PR01MB571690EF24F51F51EFFCBB0E94FAA@OS0PR01MB5716.jpnprd01.prod.outlook.com
Diffstat (limited to 'contrib/test_decoding')
-rw-r--r-- | contrib/test_decoding/expected/replorigin.out | 56 | ||||
-rw-r--r-- | contrib/test_decoding/sql/replorigin.sql | 22 |
2 files changed, 78 insertions, 0 deletions
diff --git a/contrib/test_decoding/expected/replorigin.out b/contrib/test_decoding/expected/replorigin.out index 49ffaeea2da..c85e1a01b23 100644 --- a/contrib/test_decoding/expected/replorigin.out +++ b/contrib/test_decoding/expected/replorigin.out @@ -267,3 +267,59 @@ SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot_no_lsn (1 row) +-- Test that the pgoutput correctly filters changes corresponding to the provided origin value. +SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'pgoutput'); + ?column? +---------- + init +(1 row) + +CREATE PUBLICATION pub FOR TABLE target_tbl; +SELECT pg_replication_origin_create('regress_test_decoding: regression_slot'); + pg_replication_origin_create +------------------------------ + 1 +(1 row) + +-- mark session as replaying +SELECT pg_replication_origin_session_setup('regress_test_decoding: regression_slot'); + pg_replication_origin_session_setup +------------------------------------- + +(1 row) + +INSERT INTO target_tbl(data) VALUES ('test data'); +-- The replayed change will be filtered. +SELECT count(*) = 0 FROM pg_logical_slot_peek_binary_changes('regression_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub', 'origin', 'none'); + ?column? +---------- + t +(1 row) + +-- The replayed change will be output if the origin value is not specified. +SELECT count(*) != 0 FROM pg_logical_slot_peek_binary_changes('regression_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub'); + ?column? +---------- + t +(1 row) + +-- Clean up +SELECT pg_replication_origin_session_reset(); + pg_replication_origin_session_reset +------------------------------------- + +(1 row) + +SELECT pg_drop_replication_slot('regression_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) + +SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot'); + pg_replication_origin_drop +---------------------------- + +(1 row) + +DROP PUBLICATION pub; diff --git a/contrib/test_decoding/sql/replorigin.sql b/contrib/test_decoding/sql/replorigin.sql index db06541f565..e71ee02d050 100644 --- a/contrib/test_decoding/sql/replorigin.sql +++ b/contrib/test_decoding/sql/replorigin.sql @@ -124,3 +124,25 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NUL SELECT pg_replication_origin_session_reset(); SELECT pg_drop_replication_slot('regression_slot_no_lsn'); SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot_no_lsn'); + +-- Test that the pgoutput correctly filters changes corresponding to the provided origin value. +SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'pgoutput'); +CREATE PUBLICATION pub FOR TABLE target_tbl; +SELECT pg_replication_origin_create('regress_test_decoding: regression_slot'); + +-- mark session as replaying +SELECT pg_replication_origin_session_setup('regress_test_decoding: regression_slot'); + +INSERT INTO target_tbl(data) VALUES ('test data'); + +-- The replayed change will be filtered. +SELECT count(*) = 0 FROM pg_logical_slot_peek_binary_changes('regression_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub', 'origin', 'none'); + +-- The replayed change will be output if the origin value is not specified. +SELECT count(*) != 0 FROM pg_logical_slot_peek_binary_changes('regression_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub'); + +-- Clean up +SELECT pg_replication_origin_session_reset(); +SELECT pg_drop_replication_slot('regression_slot'); +SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot'); +DROP PUBLICATION pub; |