Re: avoid multiple hard links to same WAL file after a crash
Robert Haas <robertmhaas@gmail.com>
On Fri, Apr 8, 2022 at 12:53 PM Nathan Bossart <nathandbossart@gmail.com> wrote: > On Fri, Apr 08, 2022 at 10:38:03AM -0400, Robert Haas wrote: > > I see that durable_rename_excl() has the following comment: "Similar > > to durable_rename(), except that this routine tries (but does not > > guarantee) not to overwrite the target file." If those are the desired > > semantics, we could achieve them more simply and more safely by just > > trying to stat() the target file and then, if it's not found, call > > durable_rename(). I think that would be a heck of a lot safer than > > what this function is doing right now. > > IIUC it actually does guarantee that you won't overwrite the target file > when HAVE_WORKING_LINK is defined. If not, it provides no guarantees at > all. Using stat() before rename() would therefore weaken this check for > systems with working link(), but it'd probably strengthen it for systems > without a working link(). Sure, but a guarantee that happens on only some systems isn't worth much. And, if it comes at the price of potentially having multiple hard links to the same file in obscure situations, that seems like it could easily cause more problems than this whole scheme can ever hope to solve. > I think there might be another problem. The man page for rename() seems to > indicate that overwriting an existing file also introduces a window where > the old and new path are hard links to the same file. This isn't a problem > for the WAL files because we should never be overwriting an existing one, > but I wonder if it's a problem for other code paths. My guess is that many > code paths that overwrite an existing file are first writing changes to a > temporary file before atomically replacing the original. Those paths are > likely okay, too, as you can usually just discard any existing temporary > files. I wonder if this is really true. I thought rename() was supposed to be atomic. -- Robert Haas EDB: http://www.enterprisedb.com
Commits
-
Test restartpoints in archive recovery.
- 4399d1055627 13.21 landed
- 41ffd9d6a724 14.18 landed
- e297ddcfb7d3 17.5 landed
- 91168a9ae38d 15.13 landed
- 4664de1826a8 16.9 landed
- 714bd9e3a733 18.0 landed
-
Reset InstallXLogFileSegmentActive after walreceiver self-initiated exit.
- 69a498eb6465 13.21 landed
- 3635a0a35aaf 14.18 landed
-
Skip WAL recycling and preallocation during archive recovery.
- a5b0c06daae9 13.21 landed
- 014a508009df 14.18 landed
- cc2c7d65fc27 15.0 cited
-
Don't ERROR on PreallocXlogFiles() race condition.
- cbed472a9341 13.21 landed
- 675b771ca5f2 14.18 landed
-
Revert "Add HINT for restartpoint race with KeepFileRestoredFromArchive()."
- e77d9cd4f52e 13.21 landed
- 47d2d2982729 14.18 landed
-
Remove XLogFileInit() ability to unlink a pre-existing file.
- d0b6acaf04a2 13.21 landed
- b494640e8297 14.18 landed
-
In XLogFileInit(), fix *use_existent postcondition to suit callers.
- 20e5ef3ca70c 13.21 landed
- 8967dddf086e 14.18 landed
-
Remove XLogFileInit() ability to skip ControlFileLock.
- df8ec9634ccd 13.21 landed
- 6b168c1299c5 14.18 landed
-
Replace durable_rename_excl() by durable_rename(), take two
- 26a79cbbdace 13.19 landed
- 1f95181b44c8 14.16 landed
- c1c9df3159cf 15.11 landed
- dac1ff30906b 16.0 landed
-
Add HINT for restartpoint race with KeepFileRestoredFromArchive().
- 8ad6c5dbbe5a 14.5 cited
-
Remove durable_rename_excl()
- eb64ceac7ec3 16.0 landed
- 2c902bbf1911 15.0 landed
-
Replace existing durable_rename_excl() calls with durable_rename()
- ccfbd9287d70 15.0 landed