Commit 677da8c1 authored by Michael Paquier's avatar Michael Paquier

Use access() to check file existence in GetNewRelFileNode()

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
parent 0903bbda
...@@ -397,7 +397,6 @@ GetNewRelFileNode(Oid reltablespace, Relation pg_class, char relpersistence) ...@@ -397,7 +397,6 @@ GetNewRelFileNode(Oid reltablespace, Relation pg_class, char relpersistence)
{ {
RelFileNodeBackend rnode; RelFileNodeBackend rnode;
char *rpath; char *rpath;
int fd;
bool collides; bool collides;
BackendId backend; BackendId backend;
...@@ -445,12 +444,10 @@ GetNewRelFileNode(Oid reltablespace, Relation pg_class, char relpersistence) ...@@ -445,12 +444,10 @@ GetNewRelFileNode(Oid reltablespace, Relation pg_class, char relpersistence)
/* Check for existing file of same name */ /* Check for existing file of same name */
rpath = relpath(rnode, MAIN_FORKNUM); rpath = relpath(rnode, MAIN_FORKNUM);
fd = BasicOpenFile(rpath, O_RDONLY | PG_BINARY);
if (fd >= 0) if (access(rpath, F_OK) == 0)
{ {
/* definite collision */ /* definite collision */
close(fd);
collides = true; collides = true;
} }
else else
...@@ -458,13 +455,9 @@ GetNewRelFileNode(Oid reltablespace, Relation pg_class, char relpersistence) ...@@ -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 * Here we have a little bit of a dilemma: if errno is something
* other than ENOENT, should we declare a collision and loop? In * other than ENOENT, should we declare a collision and loop? In
* particular one might think this advisable for, say, EPERM. * practice it seems best to go ahead regardless of the errno. If
* However there really shouldn't be any unreadable files in a * there is a colliding file we will get an smgr failure when we
* tablespace directory, and if the EPERM is actually complaining * attempt to create the new relation file.
* 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.
*/ */
collides = false; collides = false;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment