On 2020-Apr-05, Andres Freund wrote: > vacuum_rel() has the following comment: > /* > * Functions in indexes may want a snapshot set. Also, setting a > snapshot > * ensures that RecentGlobalXmin is kept truly recent. > */ > PushActiveSnapshot(GetTransactionSnapshot()); > > which was added quite a while ago in > > commit d53a56687f3d4772d17ffa0013a33231b7163731
Note that what that commit did was change the snapshot acquisition from occurring solely during vacuum full to being acquired always -- and added a small additional bit of knowledge: - if (vacstmt->full) - { - /* functions in indexes may want a snapshot set */ - PushActiveSnapshot(GetTransactionSnapshot()); - } - else + /* + * Functions in indexes may want a snapshot set. Also, setting + * a snapshot ensures that RecentGlobalXmin is kept truly recent. + */ + PushActiveSnapshot(GetTransactionSnapshot()); so I wouldn't blame that commit for failing to understand all the side effects of acquiring a snapshot there and then. > But to me that's understating the issue. Don't we e.g. need a snapshot > to ensure that pg_subtrans won't be truncated away? I thought xlog.c > doesn't pass PROCARRAY_FLAGS_VACUUM to GetOldestXmin when truncating? > TruncateSUBTRANS(GetOldestXmin(NULL, PROCARRAY_FLAGS_DEFAULT)); Nice find. This bug would probably be orders-of-magnitude easier to hit now than it was in 2008 -- given both the hardware advances and the increased transaction rates. > Also, without an xmin set, it seems possible that vacuum could see some > of the transaction ids it uses (in local memory) wrap around. Ditto. > How about replacing it with something like > /* > * Need to acquire a snapshot to prevent pg_subtrans from being > truncated, > * cutoff xids in local memory wrapping around, and to have updated xmin > * horizons. > */ "While we don't typically need a snapshot, we need the side effects of acquiring one: having an xmin prevents concurrent pg_subtrans truncation and prevents our cutoff Xids from becoming wrapped-around; this also updates our Xmin horizons. Lastly, functions in indexes may want a snapshot set." (You omitted that last point without explanation -- maybe on purpose? is it no longer needed?) -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services