From 87819f766f3791da3d01a3718b1d3fb985640ad0 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Tue, 24 Jun 2025 07:07:40 -0700 Subject: [PATCH] Fix cache-dependent test failures in logical decoding. The regression test added in commit 1230be12f failed with CLOBBER_CACHE_ALWAYS builds as it depends on cache behavior. This test failure occurred only on v13 because the original data loss problem was fixed differently in v13 compared to v14 and later versions, resulting in different expected-output files. This commit adds an extra expected-output file to cover both regular and CLOBBER_CACHE_ALWAYS build cases. Oversight in 1230be12f. Per buildfarm member trilobite. Reported-by: Alexander Lakhin Reviewed-by: Amit Kapila Reviewed-by: Hayato Kuroda Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/dbf561f7-465e-4086-adfa-733b9b9a34b3@gmail.com --- .../expected/invalidation_distribution_1.out | 41 +++++++++++++++++++ .../specs/invalidation_distribution.spec | 10 +++++ 2 files changed, 51 insertions(+) create mode 100644 contrib/test_decoding/expected/invalidation_distribution_1.out diff --git a/contrib/test_decoding/expected/invalidation_distribution_1.out b/contrib/test_decoding/expected/invalidation_distribution_1.out new file mode 100644 index 00000000000..e5a19becb68 --- /dev/null +++ b/contrib/test_decoding/expected/invalidation_distribution_1.out @@ -0,0 +1,41 @@ +Parsed test spec with 3 sessions + +starting permutation: s1_insert_tbl1 s1_begin s1_insert_tbl1 s2_alter_pub_add_tbl s1_commit s1_insert_tbl1 s2_get_binary_changes +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s1_begin: BEGIN; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s2_alter_pub_add_tbl: ALTER PUBLICATION pub ADD TABLE tbl1; +step s1_commit: COMMIT; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s2_get_binary_changes: SELECT count(data) FROM pg_logical_slot_get_binary_changes('isolation_slot', NULL, NULL, 'proto_version', '1', 'publication_names', 'pub') WHERE get_byte(data, 0) = 73; +count +----- + 1 +(1 row) + +?column? +-------- +stop +(1 row) + + +starting permutation: s1_begin s1_insert_tbl1 s3_begin s3_insert_tbl1 s2_alter_pub_add_tbl s1_insert_tbl1 s1_commit s3_commit s2_get_binary_changes +step s1_begin: BEGIN; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s3_begin: BEGIN; +step s3_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (2, 2); +step s2_alter_pub_add_tbl: ALTER PUBLICATION pub ADD TABLE tbl1; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s1_commit: COMMIT; +step s3_commit: COMMIT; +step s2_get_binary_changes: SELECT count(data) FROM pg_logical_slot_get_binary_changes('isolation_slot', NULL, NULL, 'proto_version', '1', 'publication_names', 'pub') WHERE get_byte(data, 0) = 73; +count +----- + 1 +(1 row) + +?column? +-------- +stop +(1 row) + diff --git a/contrib/test_decoding/specs/invalidation_distribution.spec b/contrib/test_decoding/specs/invalidation_distribution.spec index c5977b8c483..c36ee2d59e5 100644 --- a/contrib/test_decoding/specs/invalidation_distribution.spec +++ b/contrib/test_decoding/specs/invalidation_distribution.spec @@ -1,6 +1,10 @@ # Test that catalog cache invalidation messages are distributed to ongoing # transactions, ensuring they can access the updated catalog content after # processing these messages. +# +# This file contains a cache-behavior-dependent test case. Its result is +# different between regular and CLOBBER_CACHE_ALWAYS builds, so we must have +# two expected-output files to cover both cases. setup { SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'pgoutput'); @@ -40,4 +44,10 @@ permutation "s1_insert_tbl1" "s1_begin" "s1_insert_tbl1" "s2_alter_pub_add_tbl" # Expect to get no change because both s1's and s3's transactions # use the snapshot from before adding the table tbl1 to the # publication by "s2_alter_pub_add_tbl". +# +# Note that with CLOBBER_CACHE_ALWAYS, we expect to get one insert +# change with LOGICAL_REP_MSG_INSERT = 'I' from the second +# "s1_insert_tbl1" executed after adding the table tbl1 to the +# publication in "s2_alter_pub_add_tbl" as the cache for table tbl1 +# is forcibly flushed due to CLOBBER_CACHE_ALWAYS. permutation "s1_begin" "s1_insert_tbl1" "s3_begin" "s3_insert_tbl1" "s2_alter_pub_add_tbl" "s1_insert_tbl1" "s1_commit" "s3_commit" "s2_get_binary_changes"