Re: BUG #18146: Rows reappearing in Tables after Auto-Vacuum Failure in PostgreSQL on Windows
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Thomas Munro <thomas.munro@gmail.com>
Cc: Heikki Linnakangas <hlinnaka@iki.fi>, Alexander Lakhin <exclusion@gmail.com>, Robert Haas <robertmhaas@gmail.com>, Tom Lane <tgl@sss.pgh.pa.us>, Laurenz Albe <laurenz.albe@cybertec.at>, rootcause000@gmail.com, pgsql-bugs@lists.postgresql.org
Date: 2024-10-29T07:48:46Z
Lists: pgsql-bugs
On Tue, Sep 10, 2024 at 12:43:16PM +1200, Thomas Munro wrote: > Here is an experiment to try that out. The requirement to call > smgrnblock() beforehand is still slightly magical, but written in > black and white. I guess it could use an assertion cross-check on the > number of opened segments... I was looking at what you have here, and the split with smgrtruncatefrom() to do the allocations in _mdfd_openseg() for _mdfd_segpath() and _fdvec_resize() before entering in the critical section for the physical truncation is elegant. +mdtruncate(SMgrRelation reln, ForkNumber forknum, + BlockNumber curnblk, BlockNumber nblocks) + * all! That step can't be done in a critical section. Perhaps this should have an assert based on CritSectionCount==0 to force the rule. Don't you think that we'd better have a regression test on HEAD at least? It should not be complicated. I can create one if you want, perhaps for later if we want to catch the next minor release train. > I don't actually know of such an extension myself. I suppose we could > add a new member at the end called smgr_truncatefrom, and have > smgrtruncatefrom() call that if it is non-NULL (md's case), and the > existing smgr_truncate function pointer if it doesn't (ie, some > hypothetical external monkey-patching smgr replacement). Hypothetical > forks of PostgreSQL might be more likely to have used this > interception point, but wouldn't have quite the same ABI problem > (they'd adjust their function when rebasing on a minor release, but > they might also prefer if the old function prototype still worked, or > maybe they'd have some version of this bug themselves and want to be > able to fix it...). Making folks aware of the problem sounds kind of sensible seen from here. In short, changing the signature of smgr_truncate() in a minor release to fix what's a severe data corruption issue takes priority IMO. -- Michael
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