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 Wed, Jun 17, 2020 at 9:33 AM Amit Kapila <amit.kapila16@gmail.com> wrote: > > On Tue, Jun 16, 2020 at 7:49 PM Dilip Kumar <dilipbalaut@gmail.com> wrote: > > > > On Tue, Jun 9, 2020 at 3:04 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > > > On Mon, Jun 8, 2020 at 11:53 AM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > > > > > I think one of the usages we still need is in ReorderBufferForget > > > > because it can be called when we skip processing the txn. See the > > > > comments in DecodeCommit where we call this function. If I am > > > > correct, we need to probably collect all invalidations in > > > > ReorderBufferTxn as we are collecting tuplecids and use them here. We > > > > can do the same during processing of XLOG_XACT_INVALIDATIONS. > > > > > > > > > > One more point related to this is that after this patch series, we > > > need to consider executing all invalidation during transaction abort. > > > Because it is possible that due to memory overflow, we have processed > > > some of the messages which also contain a few XACT_INVALIDATION > > > messages, so to avoid cache pollution, we need to execute all of them > > > in abort. We also do the similar thing in Rollback/Rollback To > > > Savepoint, see AtEOXact_Inval and AtEOSubXact_Inval. > > > > I have analyzed this further and I think there is some problem with > > that. If Instead of keeping the invalidation as an individual change, > > if we try to combine them in ReorderBufferTxn's invalidation then what > > happens if the (sub)transaction is aborted. Basically, in this case, > > we will end up executing all those invalidations for those we never > > polluted the cache if we never try to stream it. So this will affect > > the normal case where we haven't streamed the transaction because > > every time we have executed the invalidation logged by transaction > > those are aborted. One way is we develop the list at the > > sub-transaction level and just before sending the transaction (on > > commit) combine all the (sub) transaction's invalidation list. But, > > I think since we already have the invalidation in the commit message > > then there is no point in adding this complexity. > > But, my main worry is about the streaming transaction, the problems are > > - Immediately on the arrival of individual invalidation, we can not > > directly add to the top-level transaction's invalidation list because > > later if the transaction aborted before we stream (or we directly > > stream on commit) then we will get an unnecessarily long list of > > invalidation which is done by aborted subtransaction. > > > > Is there any problem you see with this or you are concerned with the > efficiency? Please note, we already do something similar in > ReorderBufferForget and if your concern is efficiency then that > applies to existing cases as well. I think if we want we can improve > it later in many ways and one of them you have already suggested, at > this time, the main thing is correctness and also aborts are not > frequent enough to worry too much about their performance. As of now, I am not seeing the problem, I was just concerned about processing more invalidation messages in the aborted cases compared to current code, even if the streaming is off/ or transaction never streamed as memory size is not crossed. But, I agree that it is only in the case of the abort, so I will work on this and later maybe we can test the performance. -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com