Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit ece8c76

Browse files
committed
Remove assertion for replication origins in PREPARE TRANSACTION
When using replication origins, pg_replication_origin_xact_setup() is an optional choice to be able to set a LSN and a timestamp to mark the origin, which would be additionally added to WAL for transaction commits or aborts (including 2PC transactions). An assertion in the code path of PREPARE TRANSACTION assumed that this data should always be set, so it would trigger when using replication origins without setting up an origin LSN. Some tests are added to cover more this kind of scenario. Oversight in commit 1eb6d65. Per discussion with Amit Kapila and Masahiko Sawada. Discussion: https://postgr.es/m/YbbBfNSvMm5nIINV@paquier.xyz Backpatch-through: 11
1 parent 189699d commit ece8c76

File tree

3 files changed

+108
-1
lines changed

3 files changed

+108
-1
lines changed

contrib/test_decoding/expected/replorigin.out

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,3 +181,79 @@ SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot');
181181

182182
(1 row)
183183

184+
-- Set of transactions with no origin LSNs and commit timestamps set for
185+
-- this session.
186+
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_no_lsn', 'test_decoding');
187+
?column?
188+
----------
189+
init
190+
(1 row)
191+
192+
SELECT pg_replication_origin_create('regress_test_decoding: regression_slot_no_lsn');
193+
pg_replication_origin_create
194+
------------------------------
195+
1
196+
(1 row)
197+
198+
-- mark session as replaying
199+
SELECT pg_replication_origin_session_setup('regress_test_decoding: regression_slot_no_lsn');
200+
pg_replication_origin_session_setup
201+
-------------------------------------
202+
203+
(1 row)
204+
205+
-- Simple transactions
206+
BEGIN;
207+
INSERT INTO origin_tbl(data) VALUES ('no_lsn, commit');
208+
COMMIT;
209+
BEGIN;
210+
INSERT INTO origin_tbl(data) VALUES ('no_lsn, rollback');
211+
ROLLBACK;
212+
-- 2PC transactions
213+
BEGIN;
214+
INSERT INTO origin_tbl(data) VALUES ('no_lsn, commit prepared');
215+
PREPARE TRANSACTION 'replorigin_prepared';
216+
COMMIT PREPARED 'replorigin_prepared';
217+
BEGIN;
218+
INSERT INTO origin_tbl(data) VALUES ('no_lsn, rollback prepared');
219+
PREPARE TRANSACTION 'replorigin_prepared';
220+
ROLLBACK PREPARED 'replorigin_prepared';
221+
SELECT local_id, external_id,
222+
remote_lsn <> '0/0' AS valid_remote_lsn,
223+
local_lsn <> '0/0' AS valid_local_lsn
224+
FROM pg_replication_origin_status;
225+
local_id | external_id | valid_remote_lsn | valid_local_lsn
226+
----------+-----------------------------------------------+------------------+-----------------
227+
1 | regress_test_decoding: regression_slot_no_lsn | f | t
228+
(1 row)
229+
230+
SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0');
231+
data
232+
-------------------------------------------------------------------------------------
233+
BEGIN
234+
table public.origin_tbl: INSERT: id[integer]:4 data[text]:'no_lsn, commit'
235+
COMMIT
236+
BEGIN
237+
table public.origin_tbl: INSERT: id[integer]:6 data[text]:'no_lsn, commit prepared'
238+
COMMIT
239+
(6 rows)
240+
241+
-- Clean up
242+
SELECT pg_replication_origin_session_reset();
243+
pg_replication_origin_session_reset
244+
-------------------------------------
245+
246+
(1 row)
247+
248+
SELECT pg_drop_replication_slot('regression_slot_no_lsn');
249+
pg_drop_replication_slot
250+
--------------------------
251+
252+
(1 row)
253+
254+
SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot_no_lsn');
255+
pg_replication_origin_drop
256+
----------------------------
257+
258+
(1 row)
259+

contrib/test_decoding/sql/replorigin.sql

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,35 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc
8787

8888
SELECT pg_drop_replication_slot('regression_slot');
8989
SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot');
90+
91+
-- Set of transactions with no origin LSNs and commit timestamps set for
92+
-- this session.
93+
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_no_lsn', 'test_decoding');
94+
SELECT pg_replication_origin_create('regress_test_decoding: regression_slot_no_lsn');
95+
-- mark session as replaying
96+
SELECT pg_replication_origin_session_setup('regress_test_decoding: regression_slot_no_lsn');
97+
-- Simple transactions
98+
BEGIN;
99+
INSERT INTO origin_tbl(data) VALUES ('no_lsn, commit');
100+
COMMIT;
101+
BEGIN;
102+
INSERT INTO origin_tbl(data) VALUES ('no_lsn, rollback');
103+
ROLLBACK;
104+
-- 2PC transactions
105+
BEGIN;
106+
INSERT INTO origin_tbl(data) VALUES ('no_lsn, commit prepared');
107+
PREPARE TRANSACTION 'replorigin_prepared';
108+
COMMIT PREPARED 'replorigin_prepared';
109+
BEGIN;
110+
INSERT INTO origin_tbl(data) VALUES ('no_lsn, rollback prepared');
111+
PREPARE TRANSACTION 'replorigin_prepared';
112+
ROLLBACK PREPARED 'replorigin_prepared';
113+
SELECT local_id, external_id,
114+
remote_lsn <> '0/0' AS valid_remote_lsn,
115+
local_lsn <> '0/0' AS valid_local_lsn
116+
FROM pg_replication_origin_status;
117+
SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0');
118+
-- Clean up
119+
SELECT pg_replication_origin_session_reset();
120+
SELECT pg_drop_replication_slot('regression_slot_no_lsn');
121+
SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot_no_lsn');

src/backend/access/transam/twophase.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1129,7 +1129,6 @@ EndPrepare(GlobalTransaction gxact)
11291129

11301130
if (replorigin)
11311131
{
1132-
Assert(replorigin_session_origin_lsn != InvalidXLogRecPtr);
11331132
hdr->origin_lsn = replorigin_session_origin_lsn;
11341133
hdr->origin_timestamp = replorigin_session_origin_timestamp;
11351134
}

0 commit comments

Comments
 (0)