Re: PATCH: logical_work_mem and logical streaming of large in-progress transactions
Amit Kapila <amit.kapila16@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Tighten the concurrent abort check during decoding.
- 2ce353fc1902 14.0 landed
-
Improve hash_create()'s API for some added robustness.
- b3817f5f7746 14.0 landed
-
Use HASH_BLOBS for xidhash.
- a1b8aa1e4eec 14.0 landed
-
Fix initialization of RelationSyncEntry for streaming transactions.
- 69bd60672af6 14.0 landed
-
Remove unused function declaration in logicalproto.h.
- ddd5f6d2609b 14.0 landed
-
Add additional tests to test streaming of in-progress transactions.
- 58b5ae9d62bd 14.0 landed
-
Fix inline marking introduced in commit 464824323e.
- ac15b499f7f9 14.0 landed
-
Add support for streaming to built-in logical replication.
- 464824323e57 14.0 landed
-
Fix the SharedFileSetUnregister API.
- 4ab77697f67a 14.0 landed
-
Fix comment in procarray.c
- 77c7267c37f7 14.0 cited
-
Suppress compiler warning in non-cassert builds.
- e942af7b8261 14.0 cited
-
Extend the BufFile interface.
- 808e13b282ef 14.0 landed
-
Mark a few logical decoding related variables with PGDLLIMPORT.
- b48cac3b10a0 14.0 landed
-
Implement streaming mode in ReorderBuffer.
- 7259736a6e5b 14.0 landed
-
Extend the logical decoding output plugin API with stream methods.
- 45fdc9738b36 14.0 landed
-
WAL Log invalidations at command end with wal_level=logical.
- c55040ccd017 14.0 landed
-
Immediately WAL-log subtransaction and top-level XID association.
- 0bead9af484c 14.0 landed
-
Allow logical replication to transfer data in binary format.
- 9de77b545313 14.0 cited
-
Only superuser can set sslcert/sslkey in postgres_fdw user mappings
- cebf9d6e6ee1 13.0 cited
-
Track statistics for spilling of changes from ReorderBuffer.
- 9290ad198b15 13.0 landed
-
Add logical_decoding_work_mem to limit ReorderBuffer memory usage.
- cec2edfa7859 13.0 landed
-
logical decoding: process ASSIGNMENT during snapshot build
- bac2fae05c77 13.0 cited
-
Emit invalidations to standby for transactions without xid.
- c6ff84b06a68 9.6.0 cited
On Fri, May 22, 2020 at 6:22 PM Dilip Kumar <dilipbalaut@gmail.com> wrote: > > On Mon, May 18, 2020 at 4:10 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > On Sun, May 17, 2020 at 12:41 PM Dilip Kumar <dilipbalaut@gmail.com> wrote: > > > > > > On Fri, May 15, 2020 at 4:04 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > > > > > > > > > Review comments: > > > > ------------------------------ > > > > 1. > > > > @@ -1762,10 +1952,16 @@ ReorderBufferCommit(ReorderBuffer *rb, > > > > TransactionId xid, > > > > } > > > > > > > > case REORDER_BUFFER_CHANGE_MESSAGE: > > > > - rb->message(rb, txn, change->lsn, true, > > > > - change->data.msg.prefix, > > > > - change->data.msg.message_size, > > > > - change->data.msg.message); > > > > + if (streaming) > > > > + rb->stream_message(rb, txn, change->lsn, true, > > > > + change->data.msg.prefix, > > > > + change->data.msg.message_size, > > > > + change->data.msg.message); > > > > + else > > > > + rb->message(rb, txn, change->lsn, true, > > > > + change->data.msg.prefix, > > > > + change->data.msg.message_size, > > > > + change->data.msg.message); > > > > > > > > Don't we need to set any_data_sent flag while streaming messages as we > > > > do for other types of changes? > > > > > > I think any_data_sent, was added to avoid sending abort to the > > > subscriber if we haven't sent any data, but this is not complete as > > > the output plugin can also take the decision not to send. So I think > > > this should not be done as part of this patch and can be done > > > separately. I think there is already a thread for handling the > > > same[1] > > > > > > > Hmm, but prior to this patch, we never use to send (empty) aborts but > > now that will be possible. It is probably okay to deal that with > > another patch mentioned by you but I felt at least any_data_sent will > > work for some cases. OTOH, it appears to be half-baked solution, so > > we should probably refrain from adding it. BTW, how do the pgoutput > > plugin deal with it? I see that apply_handle_stream_abort will > > unconditionally try to unlink the file and it will probably fail. > > Have you tested this scenario after your latest changes? > > Yeah, I see, I think this is a problem, but this exists without my > latest change as well, if pgoutput ignore some changes because it is > not published then we will see a similar error. Shall we handle the > ENOENT error case from unlink? > Isn't this problem only for subxact file as we anyway create changes file as part of start stream message which should have come after abort? If so, can't we detect whether subxact file exists probably by using nsubxacts or something like that? Can you please once try to reproduce this scenario to ensure that we are not missing anything? > > > > > > 8. > > > > @@ -2295,6 +2677,13 @@ ReorderBufferXidSetCatalogChanges(ReorderBuffer > > > > *rb, TransactionId xid, > > > > txn = ReorderBufferTXNByXid(rb, xid, true, NULL, lsn, true); > > > > > > > > txn->txn_flags |= RBTXN_HAS_CATALOG_CHANGES; > > > > + > > > > + /* > > > > + * TOCHECK: Mark toplevel transaction as having catalog changes too > > > > + * if one of its children has. > > > > + */ > > > > + if (txn->toptxn != NULL) > > > > + txn->toptxn->txn_flags |= RBTXN_HAS_CATALOG_CHANGES; > > > > } > > > > > > > > Why are we marking top transaction here? > > > > > > We need to mark top transaction to decide whether to build tuplecid > > > hash or not. In non-streaming mode, we are only sending during the > > > commit time, and during commit time we know whether the top > > > transaction has any catalog changes or not based on the invalidation > > > message so we are marking the top transaction there in DecodeCommit. > > > Since here we are not waiting till commit so we need to mark the top > > > transaction as soon as we mark any of its child transactions. > > > > > > > But how does it help? We use this flag (via > > ReorderBufferXidHasCatalogChanges) in SnapBuildCommitTxn which is > > anyway done in DecodeCommit and that too after setting this flag for > > the top transaction if required. So, how will it help in setting it > > while processing for subxid. Also, even if we have to do it won't it > > add the xid needlessly in builder->committed.xip array? > > In ReorderBufferBuildTupleCidHash, we use this flag to decide whether > to build the tuplecid hash or not based on whether it has catalog > changes or not. > Okay, but you haven't answered the second part of the question: "won't it add the xid of top transaction needlessly in builder->committed.xip array, see function SnapBuildCommitTxn?" IIUC, this can happen without patch as well because DecodeCommit also sets the flags just based on invalidation messages irrespective of whether the messages are generated by top transaction or not, is that right? If this is correct, please explain why we are doing so in the comments. -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com