Re: New IndexAM API controlling index vacuum strategies - Mailing list pgsql-hackers
From | Andres Freund |
---|---|
Subject | Re: New IndexAM API controlling index vacuum strategies |
Date | |
Msg-id | 20210315231110.anhigaacbbvxviaw@alap3.anarazel.de Whole thread Raw |
In response to | Re: New IndexAM API controlling index vacuum strategies (Masahiko Sawada <sawada.mshk@gmail.com>) |
Responses |
Re: New IndexAM API controlling index vacuum strategies
Re: New IndexAM API controlling index vacuum strategies |
List | pgsql-hackers |
Hi, On 2021-03-15 12:58:33 -0700, Peter Geoghegan wrote: > On Mon, Mar 15, 2021 at 12:21 PM Andres Freund <andres@anarazel.de> wrote: > > It's evil sorcery. Fragile sorcery. I think Robert, Tom and me all run > > afoul of edge cases around it in the last few years. > > Right, which is why I thought that I might be missing something; why > put up with that at all for so long? > > > > But removing the awful "tupgone = true" special case seems to buy us a > > > lot -- it makes unifying everything relatively straightforward. In > > > particular, it makes it possible to delay the decision to vacuum > > > indexes until the last moment, which seems essential to making index > > > vacuuming optional. > > > > You haven't really justified, in the patch or this email, why it's OK to > > remove the whole logic around HEAPTUPLE_DEAD part of the logic. > > I don't follow. > > > VACUUM can take a long time, and not removing space for all the > > transactions that aborted while it wa > > I guess that you trailed off here. My understanding is that removing > the special case results in practically no loss of dead tuples removed > in practice -- so there are no practical performance considerations > here. > > Have I missed something? Forget what I said above - I had intended to remove it after dislogding something stuck in my brain... But apparently didn't :(. Sorry. > > I'm not comfortable with this change without adding more safety > > checks. If there's ever a case in which the HEAPTUPLE_DEAD case is hit > > and the xid needs to be frozen, we'll either cause errors or > > corruption. Yes, that's already the case with params->index_cleanup == > > DISABLED, but that's not that widely used. > > I noticed that Noah's similar 2013 patch [1] added a defensive > heap_tuple_needs_freeze() + elog(ERROR) to the HEAPTUPLE_DEAD case. I > suppose that that's roughly what you have in mind here? I'm not sure that's sufficient. If the case is legitimately reachable (I'm maybe 60% is not, after staring at it for a long time, but ...), then we can't just error out when we didn't so far. I kinda wonder whether this case should just be handled by just gotoing back to the start of the blkno loop, and redoing the pruning. The only thing that makes that a bit more complicatd is that we've already incremented vacrelstats->{scanned_pages,vacrelstats->tupcount_pages}. We really should put the per-page work (i.e. the blkno loop body) of lazy_scan_heap() into a separate function, same with the too-many-dead-tuples branch. > Comments above heap_prepare_freeze_tuple() say something about making > sure that HTSV did not return HEAPTUPLE_DEAD...but that's already > possible today: > > * It is assumed that the caller has checked the tuple with > * HeapTupleSatisfiesVacuum() and determined that it is not HEAPTUPLE_DEAD > * (else we should be removing the tuple, not freezing it). > > Does that need work too? I'm pretty scared of the index-cleanup-disabled path, for that reason. I think the hot path is more likely to be unproblematic, but I'd not bet my (nonexistant) farm on it. Greetings, Andres Freund
pgsql-hackers by date: