Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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;
        }