]> granicus.if.org Git - postgresql/commitdiff
Use access() to check file existence in GetNewRelFileNode()
authorMichael Paquier <michael@paquier.xyz>
Sun, 8 Jul 2018 09:53:20 +0000 (18:53 +0900)
committerMichael Paquier <michael@paquier.xyz>
Sun, 8 Jul 2018 09:53:20 +0000 (18:53 +0900)
Previous code used BasicOpenFile() and close() just to check for a file
collision, while there is no need to hold open a file descriptor but
that's an overkill here.

Author: Paul Guo
Reviewed-by: Peter Eisentraut, Michael Paquier
Discussion: https://postgr.es/m/CABQrizcUtiHaquxK=d4etBX8GF9kbZB50Nt1gO9_aN-e9SptyQ@mail.gmail.com

src/backend/catalog/catalog.c

index 2292deb703a4169da6dd618924680ea03ad252d0..a42155eeea846b571857569fb28d97b6fa2870ba 100644 (file)
@@ -397,7 +397,6 @@ GetNewRelFileNode(Oid reltablespace, Relation pg_class, char relpersistence)
 {
        RelFileNodeBackend rnode;
        char       *rpath;
-       int                     fd;
        bool            collides;
        BackendId       backend;
 
@@ -445,12 +444,10 @@ GetNewRelFileNode(Oid reltablespace, Relation pg_class, char relpersistence)
 
                /* Check for existing file of same name */
                rpath = relpath(rnode, MAIN_FORKNUM);
-               fd = BasicOpenFile(rpath, O_RDONLY | PG_BINARY);
 
-               if (fd >= 0)
+               if (access(rpath, F_OK) == 0)
                {
                        /* definite collision */
-                       close(fd);
                        collides = true;
                }
                else
@@ -458,13 +455,9 @@ GetNewRelFileNode(Oid reltablespace, Relation pg_class, char relpersistence)
                        /*
                         * Here we have a little bit of a dilemma: if errno is something
                         * other than ENOENT, should we declare a collision and loop? In
-                        * particular one might think this advisable for, say, EPERM.
-                        * However there really shouldn't be any unreadable files in a
-                        * tablespace directory, and if the EPERM is actually complaining
-                        * that we can't read the directory itself, we'd be in an infinite
-                        * loop.  In practice it seems best to go ahead regardless of the
-                        * errno.  If there is a colliding file we will get an smgr
-                        * failure when we attempt to create the new relation file.
+                        * practice it seems best to go ahead regardless of the errno.  If
+                        * there is a colliding file we will get an smgr failure when we
+                        * attempt to create the new relation file.
                         */
                        collides = false;
                }