Hi, On 2020-06-22 20:43:47 -0500, Justin Pryzby wrote: > On Mon, Jun 22, 2020 at 01:57:12PM -0700, Andres Freund wrote: > > On 2020-06-22 15:43:11 -0500, Justin Pryzby wrote: > > > On Mon, Jun 22, 2020 at 01:09:39PM -0700, Andres Freund wrote: > > > > I'm also uncomfortable with the approach of just copying all of > > > > LVRelStats in several places: > > > > > > > > > /* > > > > > @@ -1580,9 +1648,15 @@ lazy_vacuum_page(Relation onerel, BlockNumber > > > > > blkno, Buffer buffer, > > > > > int uncnt = 0; > > > > > TransactionId visibility_cutoff_xid; > > > > > bool all_frozen; > > > > > + LVRelStats olderrinfo; > > > > > > I guess the alternative is to write like > > > > > > LVRelStats olderrinfo = { > > > .phase = vacrelstats.phase, > > > .blkno = vacrelstats.blkno, > > > .indname = vacrelstats.indname, > > > }; > > > > No, I don't think that's a solution. I think it's wrong to have > > something like olderrinfo in the first place. Using a struct with ~25 > > members to store the current state of three variables just doesn't make > > sense. Why isn't this just a LVSavedPosition struct or something like > > that? > > I'd used LVRelStats on your suggestion: > https://www.postgresql.org/message-id/20191211165425.4ewww2s5k5cafi4l%40alap3.anarazel.de > https://www.postgresql.org/message-id/20200120191305.sxi44cedhtxwr3ag%40alap3.anarazel.de > > I understood the goal to be avoiding the need to add a new struct, when most > functions are already passed LVRelStats *vacrelstats.
> But maybe I misunderstood. (Also, back in January, the callback was only used > for scan-heap phase, so it's increased in scope several times). I am only suggesting that where you save the old location, as currently done with LVRelStats olderrinfo, you instead use a more specific type. Not that you should pass that anywhere (except for update_vacuum_error_info). Greetings, Andres Freund