Remove durable_rename_excl()
authorMichael Paquier <michael@paquier.xyz>
Thu, 28 Apr 2022 02:10:40 +0000 (11:10 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 28 Apr 2022 02:10:40 +0000 (11:10 +0900)
ccfbd92 has replaced all existing in-core callers of this function in
favor of durable_rename().  durable_rename_excl() is by nature unsafe on
crashes happening at the wrong time, so just remove it.

Author: Nathan Bossart
Reviewed-by: Robert Haas, Kyotaro Horiguchi, Michael Paquier
Discussion: https://postgr.es/m/20220407182954.GA1231544@nathanxps13

src/backend/storage/file/fd.c
src/include/pg_config_manual.h
src/include/storage/fd.h

index 24704b6a02360abdc39c474761ac63480f7ca6ae..f904f60c086b342f6bb0f70940f4a4ac3b56f5dd 100644 (file)
@@ -807,69 +807,6 @@ durable_unlink(const char *fname, int elevel)
        return 0;
 }
 
-/*
- * durable_rename_excl -- rename a file in a durable manner.
- *
- * Similar to durable_rename(), except that this routine tries (but does not
- * guarantee) not to overwrite the target file.
- *
- * Note that a crash in an unfortunate moment can leave you with two links to
- * the target file.
- *
- * Log errors with the caller specified severity.
- *
- * On Windows, using a hard link followed by unlink() causes concurrency
- * issues, while a simple rename() does not cause that, so be careful when
- * changing the logic of this routine.
- *
- * Returns 0 if the operation succeeded, -1 otherwise. Note that errno is not
- * valid upon return.
- */
-int
-durable_rename_excl(const char *oldfile, const char *newfile, int elevel)
-{
-       /*
-        * Ensure that, if we crash directly after the rename/link, a file with
-        * valid contents is moved into place.
-        */
-       if (fsync_fname_ext(oldfile, false, false, elevel) != 0)
-               return -1;
-
-#ifdef HAVE_WORKING_LINK
-       if (link(oldfile, newfile) < 0)
-       {
-               ereport(elevel,
-                               (errcode_for_file_access(),
-                                errmsg("could not link file \"%s\" to \"%s\": %m",
-                                               oldfile, newfile)));
-               return -1;
-       }
-       unlink(oldfile);
-#else
-       if (rename(oldfile, newfile) < 0)
-       {
-               ereport(elevel,
-                               (errcode_for_file_access(),
-                                errmsg("could not rename file \"%s\" to \"%s\": %m",
-                                               oldfile, newfile)));
-               return -1;
-       }
-#endif
-
-       /*
-        * Make change persistent in case of an OS crash, both the new entry and
-        * its parent directory need to be flushed.
-        */
-       if (fsync_fname_ext(newfile, false, false, elevel) != 0)
-               return -1;
-
-       /* Same for parent directory */
-       if (fsync_parent_path(newfile, elevel) != 0)
-               return -1;
-
-       return 0;
-}
-
 /*
  * InitFileAccess --- initialize this module during backend startup
  *
index 84ce5a4a5d7f4e6a1ae6f3cf76271ecf27748f40..830804fdfbfb1f974df6898b03a6360db49dc7f0 100644 (file)
 #define USE_BARRIER_SMGRRELEASE
 #endif
 
-/*
- * Define this if your operating system supports link()
- */
-#if !defined(WIN32) && !defined(__CYGWIN__)
-#define HAVE_WORKING_LINK 1
-#endif
-
 /*
  * USE_POSIX_FADVISE controls whether Postgres will attempt to use the
  * posix_fadvise() kernel call.  Usually the automatic configure tests are
index 69549b000fa39c26c047a78cf24da590a9d5213c..2b4a8e0ffe87e85e093c6149e067042f1f57a6ec 100644 (file)
@@ -187,7 +187,6 @@ extern void fsync_fname(const char *fname, bool isdir);
 extern int     fsync_fname_ext(const char *fname, bool isdir, bool ignore_perm, int elevel);
 extern int     durable_rename(const char *oldfile, const char *newfile, int loglevel);
 extern int     durable_unlink(const char *fname, int loglevel);
-extern int     durable_rename_excl(const char *oldfile, const char *newfile, int loglevel);
 extern void SyncDataDirectory(void);
 extern int     data_sync_elevel(int elevel);