Relink cache stats file atomically via rename

The new file may already exist so link may fail.  Further link/unlink
is not atomic.  Addresses an error when renaming an open with with
use_cache.  References #1296.
This commit is contained in:
Andrew Gaul 2020-05-31 23:02:52 +09:00
parent 75e72385cc
commit 274321524c

View File

@ -1525,13 +1525,9 @@ bool FdEntity::RenamePath(const string& newpath, string& fentmapkey)
return false;
}
// link and unlink cache file
if(-1 == link(cachepath.c_str(), newcachepath.c_str())){
S3FS_PRN_ERR("failed to link old cache path(%s) to new cache path(%s) by errno(%d).", cachepath.c_str(), newcachepath.c_str(), errno);
return false;
}
if(-1 == unlink(cachepath.c_str())){
S3FS_PRN_ERR("failed to unlink old cache path(%s) by errno(%d).", cachepath.c_str(), errno);
// rename cache file
if(-1 == rename(cachepath.c_str(), newcachepath.c_str())){
S3FS_PRN_ERR("failed to rename old cache path(%s) to new cache path(%s) by errno(%d).", cachepath.c_str(), newcachepath.c_str(), errno);
return false;
}