mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-22 13:03:22 +02:00
Manifested as ERROR: subtransaction logged without previous top-level txn record this check forbids legit behaviours like - First xl_xact_assignment record is beyond reading, i.e. earlier restart_lsn. - After restart_lsn there is some change of a subxact. - After that, there is second xl_xact_assignment (for another subxact) revealing the relationship between top and first subxact. Such a transaction won't be streamed anyway because we hadn't seen it in full. Saying for sure whether xact of some record encountered after the snapshot was deserialized can be streamed or not requires to know whether it wrote something before deserialization point --if yes, it hasn't been seen in full and can't be decoded. Snapshot doesn't have such info, so there is no easy way to relax the check. Reported-by: Hsu, John Diagnosed-by: Arseny Sher Author: Arseny Sher, Amit Kapila Reviewed-by: Amit Kapila, Dilip Kumar Backpatch-through: 9.5 Discussion: https://postgr.es/m/AB5978B2-1772-4FEE-A245-74C91704ECB0@amazon.com
40 lines
1.3 KiB
Plaintext
40 lines
1.3 KiB
Plaintext
Parsed test spec with 3 sessions
|
|
|
|
starting permutation: s0_begin s0_first_subxact s2_checkpoint s1_begin s1_dml s0_many_subxacts s0_commit s2_checkpoint s2_get_changes_suppress_output s2_get_changes_suppress_output s1_commit s2_get_changes
|
|
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 s2_checkpoint: CHECKPOINT;
|
|
step s1_begin: BEGIN;
|
|
step s1_dml: INSERT INTO harvest VALUES (43);
|
|
step s0_many_subxacts: select subxacts();
|
|
subxacts
|
|
|
|
|
|
step s0_commit: COMMIT;
|
|
step s2_checkpoint: CHECKPOINT;
|
|
step s2_get_changes_suppress_output: SELECT null n FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') GROUP BY n;
|
|
n
|
|
|
|
|
|
step s2_get_changes_suppress_output: SELECT null n FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') GROUP BY n;
|
|
n
|
|
|
|
step s1_commit: COMMIT;
|
|
step s2_get_changes: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
data
|
|
|
|
BEGIN
|
|
table public.harvest: INSERT: apples[integer]:43
|
|
COMMIT
|
|
?column?
|
|
|
|
stop
|