Re: PATCH: logical_work_mem and logical streaming of largein-progress transactions - Mailing list pgsql-hackers
From | Amit Kapila |
---|---|
Subject | Re: PATCH: logical_work_mem and logical streaming of largein-progress transactions |
Date | |
Msg-id | CAA4eK1Jb6=38zu+wMVr0V_mzv1Mm7TvBK69Rr2=bzYPt0FraEg@mail.gmail.com Whole thread Raw |
In response to | Re: PATCH: logical_work_mem and logical streaming of largein-progress transactions (Dilip Kumar <dilipbalaut@gmail.com>) |
List | pgsql-hackers |
On Wed, Jun 24, 2020 at 4:27 PM Dilip Kumar <dilipbalaut@gmail.com> wrote: > > iOn Wed, Jun 24, 2020 at 4:04 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > On Tue, Jun 23, 2020 at 7:00 PM Dilip Kumar <dilipbalaut@gmail.com> wrote: > > > > > > Here is the POC patch to discuss the idea of a cleanup of shared > > > fileset on proc exit. As discussed offlist, here I am maintaining > > > the list of shared fileset. First time when the list is NULL I am > > > registering the cleanup function with on_proc_exit routine. After > > > that for subsequent fileset, I am just appending it to filesetlist. > > > There is also an interface to unregister the shared file set from the > > > cleanup list and that is done by the caller whenever we are deleting > > > the shared fileset manually. While explaining it here, I think there > > > could be one issue if we delete all the element from the list will > > > become NULL and on next SharedFileSetInit we will again register the > > > function. Maybe that is not a problem but we can avoid registering > > > multiple times by using some flag in the file > > > > > > > I don't understand what you mean by "using some flag in the file". > > Basically, in POC as shown in below code snippet, We are checking > that if the "filesetlist" is NULL then only register the on_proc_exit > function. But, as described above if all the items are deleted the > list will be NULL. So I told that instead of checking the filesetlist > is NULL, we can have just a boolean variable that if we have > registered the callback then don't do it again. > Check if there is any precedent of the same in the code? > > > > > Review comments on various patches. > > > > poc_shared_fileset_cleanup_on_procexit > > ================================= > > 1. > > - ent->subxact_fileset = > > - MemoryContextAlloc(ApplyContext, sizeof(SharedFileSet)); > > + MemoryContext oldctx; > > > > + /* Shared fileset handle must be allocated in the persistent context */ > > + oldctx = MemoryContextSwitchTo(ApplyContext); > > + ent->subxact_fileset = palloc(sizeof(SharedFileSet)); > > SharedFileSetInit(ent->subxact_fileset, NULL); > > + MemoryContextSwitchTo(oldctx); > > fd = BufFileCreateShared(ent->subxact_fileset, path); > > > > Why is this change required for this patch and why we only cover > > SharedFileSetInit in the Apply context and not BufFileCreateShared? > > The comment is also not very clear on this point. > > Because only the sharedfileset and the filesetlist which is allocated > under SharedFileSetInit, are required in the permanent context. > BufFileCreateShared, only creates the Buffile and VFD which will be > required only within the current stream so transaction context is > enough. > Okay, then add some more comments to explain it or if you have explained it elsewhere, then add a reference for the same. > > 2. > > +void > > +SharedFileSetUnregister(SharedFileSet *input_fileset) > > +{ > > + bool found = false; > > + ListCell *l; > > + > > + Assert(filesetlist != NULL); > > + > > + /* Loop over all the pending shared fileset entry */ > > + foreach (l, filesetlist) > > + { > > + SharedFileSet *fileset = (SharedFileSet *) lfirst(l); > > + > > + /* remove the entry from the list and delete the underlying files */ > > + if (input_fileset->number == fileset->number) > > + { > > + SharedFileSetDeleteAll(fileset); > > + filesetlist = list_delete_cell(filesetlist, l); > > > > Why are we calling SharedFileSetDeleteAll here when in the caller we > > have already deleted the fileset as per below code? > > BufFileDeleteShared(ent->stream_fileset, path); > > + SharedFileSetUnregister(ent->stream_fileset); > > > > I think it will be good if somehow we can remove the fileset from > > filesetlist during BufFileDeleteShared. If that is possible, then we > > don't need a separate API for SharedFileSetUnregister. > > But the filesetlist is maintained at the sharedfileset level, so even > if we delete from BufFileDeleteShared, we need to call an API from the > sharedfileset layer to unregister the fileset. > Sure, but isn't it better if we can call such an API from BufFileDeleteShared? -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com
pgsql-hackers by date: