Re: [HACKERS] logical decoding of two-phase transactions - Mailing list pgsql-hackers
From | Peter Smith |
---|---|
Subject | Re: [HACKERS] logical decoding of two-phase transactions |
Date | |
Msg-id | CAHut+PsMpKTjw3GR=djjQJ+48gKdhqa97NeLUpNB+Wm1P1Zb0Q@mail.gmail.com Whole thread Raw |
In response to | Re: [HACKERS] logical decoding of two-phase transactions (Ajin Cherian <itsajin@gmail.com>) |
Responses |
Re: [HACKERS] logical decoding of two-phase transactions
|
List | pgsql-hackers |
Hi Ajin. I checked the to see how my previous review comments (of v10) were addressed by the latest patches (currently v12) There are a couple of remaining items. --- ==================== v12-0001. File: doc/src/sgml/logicaldecoding.sgml ==================== COMMENT Section 49.6.1 Says: An output plugin may also define functions to support streaming of large, in-progress transactions. The stream_start_cb, stream_stop_cb, stream_abort_cb, stream_commit_cb, stream_change_cb, and stream_prepare_cb are required, while stream_message_cb and stream_truncate_cb are optional. An output plugin may also define functions to support two-phase commits, which are decoded on PREPARE TRANSACTION. The prepare_cb, commit_prepared_cb and rollback_prepared_cb callbacks are required, while filter_prepare_cb is optional. ~ I was not sure how the paragraphs are organised. e.g. 1st seems to be about streams and 2nd seems to be about two-phase commit. But they are not mutually exclusive, so I guess I thought it was odd that stream_prepare_cb was not mentioned in the 2nd paragraph. Or maybe it is OK as-is? ==================== v12-0002. File: contrib/test_decoding/expected/two_phase.out ==================== COMMENT Line 26 PREPARE TRANSACTION 'test_prepared#1'; -- SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'two-phase-commit', '1', 'include-xids', '0', 'skip-empty-xacts', '1'); ~ Seems like a missing comment to explain the expectation of that select. --- COMMENT Line 80 -- The insert should show the newly altered column. ~ Do you also need to mention something about the DDL not being present in the decoding? ==================== v12-0002. File: src/backend/replication/logical/reorderbuffer.c ==================== COMMENT Line 1807 /* Here we are streaming and part of the PREPARE of a two-phase commit * The full cleanup will happen as part of the COMMIT PREPAREDs, so now * just truncate txn by removing changes and tuple_cids */ ~ Something seems strange about the first sentence of that comment --- COMMENT Line 1944 /* Discard the changes that we just streamed. * This can only be called if streaming and not part of a PREPARE in * a two-phase commit, so set prepared flag as false. */ ~ I thought since this comment that is asserting various things, that should also actually be written as code Assert. --- COMMENT Line 2401 /* * We are here due to one of the 3 scenarios: * 1. As part of streaming in-progress transactions * 2. Prepare of a two-phase commit * 3. Commit of a transaction. * * If we are streaming the in-progress transaction then discard the * changes that we just streamed, and mark the transactions as * streamed (if they contained changes), set prepared flag as false. * If part of a prepare of a two-phase commit set the prepared flag * as true so that we can discard changes and cleanup tuplecids. * Otherwise, remove all the * changes and deallocate the ReorderBufferTXN. */ ~ The above comment is beyond my understanding. Anything you could do to simplify it would be good. For example, when viewing this function in isolation I have never understood why the streaming flag and rbtxn_prepared(txn) flag are not possible to be set at the same time? Perhaps the code is relying on just internal knowledge of how this helper function gets called? And if it is just that, then IMO there really should be some Asserts in the code to give more assurance about that. (Or maybe use completely different flags to represent those 3 scenarios instead of bending the meanings of the existing flags) ==================== v12-0003. File: src/backend/access/transam/twophase.c ==================== COMMENT Line 557 @@ -548,6 +548,33 @@ MarkAsPrepared(GlobalTransaction gxact, bool lock_held) } /* + * LookupGXact + * Check if the prepared transaction with the given GID is around + */ +bool +LookupGXact(const char *gid) +{ + int i; + bool found = false; ~ Alignment of the variable declarations in LookupGXact function --- Kind Regards, Peter Smith. Fujitsu Australia
pgsql-hackers by date: