Re: PATCH: logical_work_mem and logical streaming of large in-progress transactions
Dilip Kumar <dilipbalaut@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 Thu, May 28, 2020 at 2:41 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > On Thu, May 28, 2020 at 12:46 PM Dilip Kumar <dilipbalaut@gmail.com> wrote: > > > > On Tue, May 26, 2020 at 12:00 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > > > 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? > > > > I have tested this, as of now, by default we create both changes and > > subxact files irrespective of whether we get any subtransactions or > > not. Maybe this could be optimized that only if we have any subxact > > then only create that file otherwise not? What's your opinion on the > > same. > > > > Yeah, that makes sense. > > > > > > > > 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? > > > > Yes, with or without the patch it always adds the topxid. I think > > purpose for doing this with/without patch is not for the snapshot > > instead we are marking the top itself that some of its subtxn has the > > catalog changes so that while building the tuplecid has we can know > > whether to build the hash or not. But, having said that I feel in > > ReorderBufferBuildTupleCidHash why do we need these two checks > > if (!rbtxn_has_catalog_changes(txn) || dlist_is_empty(&txn->tuplecids)) > > return; > > > > I mean it should be enough to just have the check, because if we have > > added something to the tuplecids then catalog changes must be there > > because that time we are setting the catalog changes to true. > > > > if (dlist_is_empty(&txn->tuplecids)) > > return; > > > > I think in the base code there are multiple things going on > > 1. If we get new CID we always set the catalog change in that > > transaction but add the tuplecids in the top transaction. So > > basically, top transaction is so far not marked with catalog changes > > but it has tuplecids. > > 2. Now, in DecodeCommit the top xid will be marked that it has catalog > > changes based on the invalidation messages. > > > > I don't think it is advisable to remove that check from base code > unless we have a strong reason for doing so. I think here you can > write better comments about why you are marking the flag for top > transaction and remove TOCHECK from the comment. Ok, I will do that. -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com