Re: ERROR: subtransaction logged without previous top-level txn record - Mailing list pgsql-bugs
From | Arseny Sher |
---|---|
Subject | Re: ERROR: subtransaction logged without previous top-level txn record |
Date | |
Msg-id | 87wo8ulhjl.fsf@ars-thinkpad Whole thread Raw |
In response to | Re: ERROR: subtransaction logged without previous top-level txn record (Amit Kapila <amit.kapila16@gmail.com>) |
Responses |
Re: ERROR: subtransaction logged without previous top-level txn record
|
List | pgsql-bugs |
Amit Kapila <amit.kapila16@gmail.com> writes: >> I don't believe you can that without persisting additional >> data. Basically, what we need is list of transactions who are running at >> the point of snapshot serialization *and* already wrote something before >> it -- those we hadn't seen in full and can't decode. We have no such >> data currently. The closest thing we have is xl_running_xacts->nextXid, >> but >> >> 1) issued xid doesn't necessarily means xact actually wrote something, >> so we can't just skip xl_xact_assignment for xid < nextXid, it might >> still be decoded >> 2) snapshot might be serialized not at xl_running_xacts anyway >> >> Surely this thing doesn't deserve changing persisted data format. >> > > I agree that it won't be a good idea to change the persisted data > format, especially in back-branches. I don't see any fix which can > avoid this without doing major changes in the code. Apart from this, > we have to come up with a solution for point (3) discussed in the > above email [1] which again could be change in design. I think we can > first try to proceed with the patch > 0002-Stop-demanding-that-top-xact-must-be-seen-before--v2 and then we > can discuss the other patch. I can't see a way to write a test case > for this, can you think of any way? Yeah, let's finally get it. Attached is raw version of isolation test triggering false 'subtransaction logged without...' (case (1)). However, frankly I don't see much value in it, so I'm dubious whether it should be included in the patch. diff --git a/contrib/test_decoding/specs/subxact_logged_without_top.spec b/contrib/test_decoding/specs/subxact_logged_without_top.spec new file mode 100644 index 0000000000..55b51357a9 --- /dev/null +++ b/contrib/test_decoding/specs/subxact_logged_without_top.spec @@ -0,0 +1,51 @@ + +setup +{ + SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding'); -- must be first write inxact + CREATE TABLE harvest(apples integer); + CREATE OR REPLACE FUNCTION subxacts() returns void as $$ + BEGIN + FOR i in 1 .. 65 LOOP + BEGIN + INSERT INTO harvest VALUES (42); + EXCEPTION + WHEN OTHERS THEN + RAISE; + END; + END LOOP; + END; $$LANGUAGE 'plpgsql'; +} + +teardown +{ + DROP TABLE IF EXISTS harvest; + SELECT 'stop' FROM pg_drop_replication_slot('isolation_slot'); +} + +session "s0" +setup { SET synchronous_commit=on; } +step "s0_begin" { BEGIN; } +step "s0_first_subxact" { + DO LANGUAGE plpgsql $$ + BEGIN + BEGIN + INSERT INTO harvest VALUES (41); + EXCEPTION WHEN OTHERS THEN RAISE; + END; + END $$; +} +step "s0_many_subxacts" { select subxacts(); } +step "s0_commit" { COMMIT; } + +session "s1" +setup { SET synchronous_commit=on; } +step "s1_begin" { BEGIN; } +step "s1_dml" { INSERT INTO harvest VALUES (43); } +step "s1_commit" { COMMIT; } + +session "s2" +setup { SET synchronous_commit=on; } +step "s2_checkpoint" { CHECKPOINT; } +step "s2_get_changes" { SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0','skip-empty-xacts', '1'); } + +permutation "s0_begin" "s0_first_subxact" "s2_checkpoint" "s1_begin" "s1_dml" "s0_many_subxacts" "s0_commit" "s2_checkpoint""s2_get_changes" "s1_commit" "s2_get_changes" -- cheers, Arseny
pgsql-bugs by date: