Re: error context for vacuum to include block number
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Justin Pryzby <pryzby@telsasoft.com>
Cc: Masahiko Sawada <masahiko.sawada@2ndquadrant.com>, Alvaro Herrera <alvherre@2ndquadrant.com>,
Andres Freund <andres@anarazel.de>, Michael Paquier <michael@paquier.xyz>,
pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2020-03-24T14:00:45Z
Lists: pgsql-hackers
On Tue, Mar 24, 2020 at 7:18 PM Justin Pryzby <pryzby@telsasoft.com> wrote: > > On Tue, Mar 24, 2020 at 07:07:03PM +0530, Amit Kapila wrote: > > On Tue, Mar 24, 2020 at 6:18 PM Masahiko Sawada <masahiko.sawada@2ndquadrant.com> wrote: > > > 1. > > > + /* Update error traceback information */ > > > + olderrcbarg = *vacrelstats; > > > + update_vacuum_error_cbarg(vacrelstats, > > > + VACUUM_ERRCB_PHASE_TRUNCATE, > > > new_rel_pages, NULL, > > > + false); > > > + > > > /* > > > * Scan backwards from the end to verify that the end pages actually > > > * contain no tuples. This is *necessary*, not optional, because > > > * other backends could have added tuples to these pages whilst we > > > * were vacuuming. > > > */ > > > new_rel_pages = count_nondeletable_pages(onerel, vacrelstats); > > > > > > We need to set the error context after setting new_rel_pages. > > > > We want to cover the errors raised in count_nondeletable_pages(). In > > an earlier version of the patch, we had TRUNCATE_PREFETCH phase which > > use to cover those errors, but that was not good as we were > > setting/resetting it multiple times and it was not clear such a > > separate phase would add any value. > > I insisted on covering count_nondeletable_pages since it calls ReadBuffer(), > but I think we need to at least set vacrelsats->blkno = new_rel_pages, since it > may be different, right ? > yeah, that makes sense. > > > 2. > > > + vacrelstats->relnamespace = > > > get_namespace_name(RelationGetNamespace(onerel)); > > > + vacrelstats->relname = pstrdup(RelationGetRelationName(onerel)); > > > > > > I think we can pfree these two variables to avoid a memory leak during > > > vacuum on multiple relations. > > > > Yeah, I had also thought about it but I noticed that we are not > > freeing for vacrelstats. Also, I think the memory is allocated in > > TopTransactionContext which should be freed via > > CommitTransactionCommand before vacuuming of the next relation, so not > > sure if there is much value in freeing those variables. > > One small reason to free them is that (as Tom mentioned upthread) it's good to > ensure that those variables are their own allocation, and not depending on > being able to access relcache or anything else during an unexpected error. > That is a good reason to allocate them separately but not for doing retail free especially when the caller of the function will free the context in which that is allocated. I think Sawada-San's concern was that it will leak memory across the vacuum of multiple relations but that is not the case here. Won't it look odd if we are freeing memory for members of vacrelstats but not for vacrelstats itself? -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com
Commits
-
Avoid calls to RelationGetRelationName() and RelationGetNamespace() in
- ef75140fe756 13.0 landed
-
Introduce vacuum errcontext to display additional information.
- b61d161c1463 13.0 landed
-
Fix mesurement of elapsed time during truncating heap in VACUUM.
- 007491979461 13.0 cited
-
Allow vacuum command to process indexes in parallel.
- 40d964ec997f 13.0 cited
-
Refactor code dedicated to index vacuuming in vacuumlazy.c
- 1ab41a3c8edc 13.0 landed
-
Remove duplicated progress reporting during heap scan of VACUUM
- e5a02e0fc68b 13.0 landed