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, Jan 10, 2020 at 10:53 AM Dilip Kumar <dilipbalaut@gmail.com> wrote: > > On Mon, Dec 30, 2019 at 3:43 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > > > > 2. During commit time in DecodeCommit we check whether we need to skip > > > the changes of the transaction or not by calling > > > SnapBuildXactNeedsSkip but since now we support streaming so it's > > > possible that before we decode the commit WAL, we might have already > > > sent the changes to the output plugin even though we could have > > > skipped those changes. So my question is instead of checking at the > > > commit time can't we check before adding to ReorderBuffer itself > > > > > > > I think if we can do that then the same will be true for current code > > irrespective of this patch. I think it is possible that we can't take > > that decision while decoding because we haven't assembled a consistent > > snapshot yet. I think we might be able to do that while we try to > > stream the changes. I think we need to take care of all the > > conditions during streaming (when the logical_decoding_workmem limit > > is reached) as we do in DecodeCommit. This needs a bit more study. > > I have analyzed this further and I think we can not decide all the > conditions even while streaming. Because IMHO once we get the > SNAPBUILD_FULL_SNAPSHOT we can add the changes to the reorder buffer > so that if we get the commit of the transaction after we reach to the > SNAPBUILD_CONSISTENT. However, if we get the commit before we reach > to SNAPBUILD_CONSISTENT then we need to ignore this transaction. Now, > even if we have SNAPBUILD_FULL_SNAPSHOT we can stream the changes > which might get dropped later but that we can not decide while > streaming. > This makes sense to me, but we should add a comment for the same when we are streaming to say we can't skip similar to how we do during commit time because of the above reason described by you. Also, what about other conditions where we can skip the transaction, basically cases like (a) when the transaction happened in another database, (b) when the output plugin is not interested in the origin and (c) when we are doing fast-forwarding -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com