Re: BUG #18146: Rows reappearing in Tables after Auto-Vacuum Failure in PostgreSQL on Windows
Thomas Munro <thomas.munro@gmail.com>
From: Thomas Munro <thomas.munro@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Michael Paquier <michael@paquier.xyz>,
Laurenz Albe <laurenz.albe@cybertec.at>, rootcause000@gmail.com, pgsql-bugs@lists.postgresql.org
Date: 2023-10-04T21:12:27Z
Lists: pgsql-bugs
On Thu, Oct 5, 2023 at 3:26 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: > Michael Paquier <michael@paquier.xyz> writes: > > On Wed, Oct 04, 2023 at 09:17:11AM +0200, Laurenz Albe wrote: > >> Data corruption like this is not necessarily caused by a PostgreSQL bug. > > > Err, well... A failure on the end-of-vacuum truncation should not > > lead to corruption afterwards as well, and this ought to be safe even > > if this step failed. This is a very tricky problem that nobody has > > really looked into yet. > > ISTM we did identify the problem: while all the tuples in the > pages-to-be-truncated should be dead and thus invisible, it may > be that some of those pages are dirty and haven't been written > out of shared buffers yet, and the page versions on disk contain > tuples that look live. If VACUUM discards those dirty buffers > and then fails to truncate, voila you have tuples rising from > the dead. > > I'm too lazy to check the commit log right now, but I think > we did implement a fix for that (ie, flush dirty pages even > if we anticipate them going away due to truncation). But as > Laurenz says, v10 is out of support and possibly didn't get > that fix. Even if it did, you'd need to be running one of > the last minor releases, because this wasn't very long ago. This thread seems to be saying otherwise: https://www.postgresql.org/message-id/flat/2348.1544474335%40sss.pgh.pa.us > In the end though, the *real* problem here is running on a > platform that randomly disallows writes to disk. There's only > so much that Postgres can possibly do about unreliability of the > underlying platform. I would never run a production database on > Windows, because it's just too prone to that sort of BS. It's surprising that ftruncate() AKA chsize() is able to fail like this (I am not a Windows user but AFAIR that sharing stuff obstructs stuff like open, unlink, rename, so it surprises me to see it come up with ftruncate, since we must already have made it past the open stage). Hmm, the documentation is scant, but I know from my attempts to use large files that chsize() is probably some kind of wrapper around SetEndOfFile() or similar, and that is documented as failing if someone has the file mapped. I don't know why someone would have the file mapped, though. But as for what we should do about it, PANIC (as suggested by several people) seems better than corruption, if we're not going to write some kind of resilience? How else are we supposed to deal with "this shouldn't happen, and if it does we're hosed?"
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix C error reported by Oracle compiler.
- 417d41c658b3 13.19 landed
- 049c8cb9a239 14.16 landed
- 190054e61f5d 15.11 landed
- 9defaaa1da60 16.7 landed
- 45aef9f6bb0f 17.3 landed
-
Restore smgrtruncate() prototype in back-branches.
- a1d17a894731 13.19 landed
- f154f028d856 14.16 landed
- 3181befdca71 15.11 landed
- c957d7444fcc 16.7 landed
- 66aaabe7a18f 17.3 landed
-
Fix corruption when relation truncation fails.
- 2280912165d6 13.19 landed
- 23c743b645a5 14.16 landed
- fb540b6aa5ab 15.11 landed
- ba02d24bacbb 16.7 landed
- 0350b876b074 17.3 landed
- 38c579b08988 18.0 landed
-
RelationTruncate() must set DELAY_CHKPT_START.
- a501fe5a971e 15.11 landed
- ad5aa7bfd042 16.7 landed
- d4ffbf47b2d4 17.3 landed
- 1168acbca475 13.19 landed
- 7d0b91a28421 14.16 landed
- 75818b3afbf8 18.0 landed
-
WAL-log inplace update before revealing it to other sessions.
- 8e7e672cdaa6 18.0 cited
-
Fix bugs in MultiXact truncation
- b1ffe3ff0b7e 17.0 cited
-
Fix possible recovery trouble if TRUNCATE overlaps a checkpoint.
- 412ad7a55639 15.0 cited