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 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. -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com