Backport "Expose fsync_fname as a public API".
authorAndres Freund <andres@anarazel.de>
Sat, 15 Nov 2014 00:09:05 +0000 (01:09 +0100)
committerAndres Freund <andres@anarazel.de>
Sat, 15 Nov 2014 00:20:29 +0000 (01:20 +0100)
Backport commit cc52d5b33ff5df29de57dcae9322214cfe9c8464 back to 9.1
to allow backpatching some unlogged table fixes that use fsync_fname.

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

index 391359cdd92bf502120318487f8d5bdfb805b0b5..427a0df7182de5a00d7b807dec6aa8d4e66dce24 100644 (file)
@@ -27,9 +27,6 @@
 #include "miscadmin.h"
 
 
-static void fsync_fname(char *fname, bool isdir);
-
-
 /*
  * copydir: copy a directory
  *
@@ -207,59 +204,3 @@ copy_file(char *fromfile, char *tofile)
 
    pfree(buffer);
 }
-
-
-/*
- * fsync a file
- *
- * Try to fsync directories but ignore errors that indicate the OS
- * just doesn't allow/require fsyncing directories.
- */
-static void
-fsync_fname(char *fname, bool isdir)
-{
-   int         fd;
-   int         returncode;
-
-   /*
-    * Some OSs require directories to be opened read-only whereas other
-    * systems don't allow us to fsync files opened read-only; so we need both
-    * cases here
-    */
-   if (!isdir)
-       fd = OpenTransientFile(fname,
-                              O_RDWR | PG_BINARY,
-                              S_IRUSR | S_IWUSR);
-   else
-       fd = OpenTransientFile(fname,
-                              O_RDONLY | PG_BINARY,
-                              S_IRUSR | S_IWUSR);
-
-   /*
-    * Some OSs don't allow us to open directories at all (Windows returns
-    * EACCES)
-    */
-   if (fd < 0 && isdir && (errno == EISDIR || errno == EACCES))
-       return;
-
-   else if (fd < 0)
-       ereport(ERROR,
-               (errcode_for_file_access(),
-                errmsg("could not open file \"%s\": %m", fname)));
-
-   returncode = pg_fsync(fd);
-
-   /* Some OSs don't allow us to fsync directories at all */
-   if (returncode != 0 && isdir && errno == EBADF)
-   {
-       CloseTransientFile(fd);
-       return;
-   }
-
-   if (returncode != 0)
-       ereport(ERROR,
-               (errcode_for_file_access(),
-                errmsg("could not fsync file \"%s\": %m", fname)));
-
-   CloseTransientFile(fd);
-}
index fa0054701cde153232ed53545fc6f55438c074ff..0777a15c900a9962a951573b3448c9a00e38837c 100644 (file)
@@ -384,6 +384,62 @@ pg_flush_data(int fd, off_t offset, off_t amount)
 }
 
 
+/*
+ * fsync_fname -- fsync a file or directory, handling errors properly
+ *
+ * Try to fsync a file or directory. When doing the latter, ignore errors that
+ * indicate the OS just doesn't allow/require fsyncing directories.
+ */
+void
+fsync_fname(char *fname, bool isdir)
+{
+   int         fd;
+   int         returncode;
+
+   /*
+    * Some OSs require directories to be opened read-only whereas other
+    * systems don't allow us to fsync files opened read-only; so we need both
+    * cases here
+    */
+   if (!isdir)
+       fd = OpenTransientFile(fname,
+                              O_RDWR | PG_BINARY,
+                              S_IRUSR | S_IWUSR);
+   else
+       fd = OpenTransientFile(fname,
+                              O_RDONLY | PG_BINARY,
+                              S_IRUSR | S_IWUSR);
+
+   /*
+    * Some OSs don't allow us to open directories at all (Windows returns
+    * EACCES)
+    */
+   if (fd < 0 && isdir && (errno == EISDIR || errno == EACCES))
+       return;
+
+   else if (fd < 0)
+       ereport(ERROR,
+               (errcode_for_file_access(),
+                errmsg("could not open file \"%s\": %m", fname)));
+
+   returncode = pg_fsync(fd);
+
+   /* Some OSs don't allow us to fsync directories at all */
+   if (returncode != 0 && isdir && errno == EBADF)
+   {
+       CloseTransientFile(fd);
+       return;
+   }
+
+   if (returncode != 0)
+       ereport(ERROR,
+               (errcode_for_file_access(),
+                errmsg("could not fsync file \"%s\": %m", fname)));
+
+   CloseTransientFile(fd);
+}
+
+
 /*
  * InitFileAccess --- initialize this module during backend startup
  *
index 90b4933ecb528d034427422664807f8c51714fd2..2a60229adcfa6559953fd1e174d98a3f44c62dd5 100644 (file)
@@ -113,6 +113,7 @@ extern int  pg_fsync_no_writethrough(int fd);
 extern int pg_fsync_writethrough(int fd);
 extern int pg_fdatasync(int fd);
 extern int pg_flush_data(int fd, off_t offset, off_t amount);
+extern void fsync_fname(char *fname, bool isdir);
 
 /* Filename components for OpenTemporaryFile */
 #define PG_TEMP_FILES_DIR "pgsql_tmp"