mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
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
This commit is contained in:
parent
0903bbdad2
commit
677da8c15d
@ -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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
/*
|
/*
|
||||||
* 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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user