Re: Temporary tables versus wraparound... again - Mailing list pgsql-hackers
From | Greg Stark |
---|---|
Subject | Re: Temporary tables versus wraparound... again |
Date | |
Msg-id | CAM-w4HNkGdd2vDTqP-r5OEEi9yjPso-Y61EkXqtypH2mT_V8_A@mail.gmail.com Whole thread Raw |
In response to | Re: Temporary tables versus wraparound... again (Andres Freund <andres@anarazel.de>) |
List | pgsql-hackers |
On Thu, 1 Dec 2022 at 14:18, Andres Freund <andres@anarazel.de> wrote: > > Hi, > > On 2022-12-01 11:13:01 -0500, Greg Stark wrote: > > On Sat, 5 Nov 2022 at 11:34, Tom Lane <tgl@sss.pgh.pa.us> wrote: > > > > > * I find 0001 a bit scary, specifically that it's decided it's > > > okay to apply extract_autovac_opts, pgstat_fetch_stat_tabentry_ext, > > > and especially relation_needs_vacanalyze to another session's > > > temp table. How safe is that really? > > > > I can look a bit more closely but none of them are doing any thing > > with the table itself, just the catalog entries which afaik have > > always been fair game for other sessions. So I'm not really clear what > > kind of unsafeness you're asking about. > > Is that actually true? Don't we skip some locking operations for temporary > tables, which then also means catalog modifications cannot safely be done in > other sessions? This code isn't doing any catalog modifications from other sessions. The code Tom's referring to is just autovacuum looking at relfrozenxid and relfrozenmxid and printing warnings if they're approaching the wraparound limits that would otherwise trigger an anti-wraparound vacuum. > I find it problematic that ResetVacStats() bypasses tableam. Normal vacuums > etc go through tableam but you put a ResetVacStats() besides each call to > table_relation_nontransactional_truncate(). Seems like this should just be in > heapam_relation_nontransactional_truncate()? Ok. Think this patch actually predated the tableam (by a lot. I've had others actually approach me about whether there's a good solution because it's been biting them too) and I didn't see that in the merge forward. > Is it a good idea to use heap_inplace_update() in ResetVacStats()? This is a good question. I had the impression it was actually the right thing to do and there's actually been bugs in the past caused by *not* using heap_inplace_update() so I think it's actually important to get this right. I don't see any documentation explaining what the rules are for when inplace edits are safe or unsafe or indeed when they're necessary for correctness. So I searched back through the archives and checked when it came up. It seems there are a few issues: a) Nontransactional operations like vacuum have to use it because they don't have a transaction. Presumably this is why vacuum normally uses inplace_update for these stats. b) in the past SnapshotNow scans would behave incorrectly if we do normal mvcc updates on rows without exclusive locks protecting against concurrent scans. I'm not sure if this is still a factor these days with the types of scans that still exist. c) There are some constraints having to do with logical replication that I didn't understand. I hope they don't relate to frozenxid but I don't know d) There were also some issues having to do with SInval messages but I think they were additional constraints that inplace updates needed to be concerned about. These truncates are done at end of transaction but precommit so the transaction is still alive and there obviously should be no concurrent scans on temporary tables so I think it should be safe to do a regular mvcc update. Is it a good idea to bloat the catalog though? If you have many temporary tables and don't actually touch more than a few of them in your transaction that could be a lot of new tuple inserts on every commit. Actually it's only sort of true -- if no persistent xid is created then we would be creating one just for this. But that shouldn't happen because we only truncate if the transaction ever "touched" a temporary table. It occurs to me it could still be kind of a problem if you have a temporary table that you use once and then your session stays alive for a long time without using temporary tables. Then it won't be truncated and the frozenxid won't be advanced :( It's kind of annoying that we have to put RecentXmin and Get{Our,}OldestMultiXactId() in the table when truncating and then keep advancing them even if there's no data in the table. Ideally wouldn't it be better to be able to have Invalid{Sub,}Xid there and only initialize it when a first insert is made? -- greg
pgsql-hackers by date: