On Mon, Feb 14, 2022 at 8:04 PM John Naylor <john.nay...@enterprisedb.com> wrote: > The failsafe mode does disable truncation as of v14: > > commit 60f1f09ff44308667ef6c72fbafd68235e55ae27 > Author: Peter Geoghegan <p...@bowt.ie> > Date: Tue Apr 13 12:58:31 2021 -0700 > > Don't truncate heap when VACUUM's failsafe is in effect.
That's true, but bear in mind that it only does so when the specific table being vacuumed actually triggers the failsafe. I believe that VACUUM(EMERGENCY) doesn't just limit itself to vacuuming tables where this is guaranteed (or even likely). If I'm not mistaken, it's possible (even likely) that there will be a table whose age(relfrozenxid) is high enough for VACUUM(EMERGENCY) to target the table, and yet not so high that the failsafe will kick in at the earliest opportunity. > To demonstrate to myself, I tried a few vacuums in a debugger session > with a breakpoint at GetNewTransactionId(). I've only seen it reach > here when heap truncation happens (or the not relevant for wraparound > situations FULL and ANALYZE). It's possible for a manually issued VACUUM to directly disable truncation (same with index_cleanup). Without getting into the question of what the ideal behavior might be right now, I can say for sure that it wouldn't be difficult to teach VACUUM(EMERGENCY) to pass down the same options. The failsafe is essentially a mechanism that dynamically changes these options for an ongoing vacuum, once age(relfrozenxid) crosses a certain threshold. There is nothing fundamentally special about that. -- Peter Geoghegan