Remove durable_rename_excl()
authorMichael Paquier <[email protected]>
Tue, 5 Jul 2022 03:54:25 +0000 (12:54 +0900)
committerMichael Paquier <[email protected]>
Tue, 5 Jul 2022 03:54:25 +0000 (12:54 +0900)
A previous commit replaced all the calls to this function with
durable_rename() as of dac1ff3, making it used nowhere in the tree.
Using it in extension code is also risky based on the issues described
in this previous commit, so let's remove it.  This makes possible the
removal of HAVE_WORKING_LINK.

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 8d2e3e3a57d0cdba0b407b112812fc83a5f6e8e9..5ee2c4626740ab5f6cddc2b31f4b52b33743da7a 100644 (file)
 #define EXEC_BACKEND
 #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);