Re: PANIC: wrong buffer passed to visibilitymap_clear
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Peter Geoghegan <pg@bowt.ie>
Cc: Andres Freund <andres@anarazel.de>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2021-04-11T17:13:14Z
Lists: pgsql-hackers
Peter Geoghegan <pg@bowt.ie> writes: > This isn't just any super-exclusive lock, either -- we were calling > ConditionalLockBufferForCleanup() at this point. > I now think that there is a good chance that we are seeing these > symptoms because the "conditional-ness" went away -- we accidentally > relied on that. Ah, I see it. In the fragment of heap_update where we have to do some TOAST work (starting at line 3815) we transiently *release our lock* on the old tuple's page. Unlike the earlier fragments that did that, this code path has no provision for rechecking whether the page has become all-visible, so if that does happen while we're without the lock then we lose. (It does look like RelationGetBufferForTuple knows about updating vmbuffer, but there's one code path through the if-nest at 3850ff that doesn't call that.) So the previous coding in vacuumlazy didn't tickle this because it would only set the all-visible bit on a page it had superexclusive lock on; that is, continuing to hold the pin was sufficient. Nonetheless, if four out of five paths through heap_update take care of this matter, I'd say it's heap_update's bug not vacuumlazy's bug that the fifth path doesn't. regards, tom lane
Commits
-
Avoid improbable PANIC during heap_update.
- 5f12bc94dcc6 12.7 landed
- 37e76546a2ba 13.3 landed
- 34f581c39e97 14.0 landed
-
Refactor lazy_scan_heap() loop.
- 7ab96cf6b312 14.0 cited