mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08: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;
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user