Explicitly specify lock type (#1701)

This makes it more clear and type-safe if the caller already has the
lock.  Follows on to 84174c560d7542436067dfbfe1f697368ad7d4a1.
This commit is contained in:
Andrew Gaul 2021-06-27 15:15:48 +09:00 committed by GitHub
parent 2154e898bc
commit f505c8224e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 28 additions and 27 deletions

View File

@ -503,7 +503,7 @@ FdEntity* FdManager::GetFdEntity(const char* path, int& existfd, bool newfd, boo
return NULL; return NULL;
} }
FdEntity* FdManager::Open(int& fd, const char* path, headers_t* pmeta, off_t size, time_t time, int flags, bool force_tmpfile, bool is_create, bool no_fd_lock_wait) FdEntity* FdManager::Open(int& fd, const char* path, headers_t* pmeta, off_t size, time_t time, int flags, bool force_tmpfile, bool is_create, AutoLock::Type type)
{ {
S3FS_PRN_DBG("[path=%s][size=%lld][time=%lld][flags=0x%x]", SAFESTRPTR(path), static_cast<long long>(size), static_cast<long long>(time), flags); S3FS_PRN_DBG("[path=%s][size=%lld][time=%lld][flags=0x%x]", SAFESTRPTR(path), static_cast<long long>(size), static_cast<long long>(time), flags);
@ -542,7 +542,7 @@ FdEntity* FdManager::Open(int& fd, const char* path, headers_t* pmeta, off_t siz
} }
// (re)open // (re)open
if(-1 == (fd = ent->Open(pmeta, size, time, flags, no_fd_lock_wait ? AutoLock::NO_WAIT : AutoLock::NONE))){ if(-1 == (fd = ent->Open(pmeta, size, time, flags, type))){
S3FS_PRN_ERR("failed to (re)open and create new pseudo fd for path(%s).", path); S3FS_PRN_ERR("failed to (re)open and create new pseudo fd for path(%s).", path);
return NULL; return NULL;
} }
@ -558,7 +558,7 @@ FdEntity* FdManager::Open(int& fd, const char* path, headers_t* pmeta, off_t siz
ent = new FdEntity(path, cache_path.c_str()); ent = new FdEntity(path, cache_path.c_str());
// open // open
if(-1 == (fd = ent->Open(pmeta, size, time, flags, no_fd_lock_wait ? AutoLock::NO_WAIT : AutoLock::NONE))){ if(-1 == (fd = ent->Open(pmeta, size, time, flags, type))){
delete ent; delete ent;
return NULL; return NULL;
} }
@ -610,7 +610,7 @@ FdEntity* FdManager::OpenExistFdEntity(const char* path, int& fd, int flags)
S3FS_PRN_DBG("[path=%s][flags=0x%x]", SAFESTRPTR(path), flags); S3FS_PRN_DBG("[path=%s][flags=0x%x]", SAFESTRPTR(path), flags);
// search entity by path, and create pseudo fd // search entity by path, and create pseudo fd
FdEntity* ent = Open(fd, path, NULL, -1, -1, flags, false, false); FdEntity* ent = Open(fd, path, NULL, -1, -1, flags, false, false, AutoLock::NONE);
if(!ent){ if(!ent){
// Not found entity // Not found entity
return NULL; return NULL;

View File

@ -82,7 +82,7 @@ class FdManager
// Return FdEntity associated with path, returning NULL on error. This operation increments the reference count; callers must decrement via Close after use. // Return FdEntity associated with path, returning NULL on error. This operation increments the reference count; callers must decrement via Close after use.
FdEntity* GetFdEntity(const char* path, int& existfd, bool newfd = true, bool lock_already_held = false); FdEntity* GetFdEntity(const char* path, int& existfd, bool newfd = true, bool lock_already_held = false);
FdEntity* Open(int& fd, const char* path, headers_t* pmeta = NULL, off_t size = -1, time_t time = -1, int flags = O_RDONLY, bool force_tmpfile = false, bool is_create = true, bool no_fd_lock_wait = false); FdEntity* Open(int& fd, const char* path, headers_t* pmeta, off_t size, time_t time, int flags, bool force_tmpfile, bool is_create, AutoLock::Type type);
FdEntity* GetExistFdEntity(const char* path, int existfd = -1); FdEntity* GetExistFdEntity(const char* path, int existfd = -1);
FdEntity* OpenExistFdEntity(const char* path, int& fd, int flags = O_RDONLY); FdEntity* OpenExistFdEntity(const char* path, int& fd, int flags = O_RDONLY);
void Rename(const std::string &from, const std::string &to); void Rename(const std::string &from, const std::string &to);

View File

@ -98,11 +98,11 @@ bool AutoFdEntity::Attach(const char* path, int existfd)
return true; return true;
} }
FdEntity* AutoFdEntity::Open(const char* path, headers_t* pmeta, off_t size, time_t time, int flags, bool force_tmpfile, bool is_create, bool no_fd_lock_wait) FdEntity* AutoFdEntity::Open(const char* path, headers_t* pmeta, off_t size, time_t time, int flags, bool force_tmpfile, bool is_create, AutoLock::Type type)
{ {
Close(); Close();
if(NULL == (pFdEntity = FdManager::get()->Open(pseudo_fd, path, pmeta, size, time, flags, force_tmpfile, is_create, no_fd_lock_wait))){ if(NULL == (pFdEntity = FdManager::get()->Open(pseudo_fd, path, pmeta, size, time, flags, force_tmpfile, is_create, type))){
pseudo_fd = -1; pseudo_fd = -1;
return NULL; return NULL;
} }

View File

@ -21,6 +21,7 @@
#ifndef S3FS_FDCACHE_AUTO_H_ #ifndef S3FS_FDCACHE_AUTO_H_
#define S3FS_FDCACHE_AUTO_H_ #define S3FS_FDCACHE_AUTO_H_
#include "autolock.h"
#include "fdcache_entity.h" #include "fdcache_entity.h"
//------------------------------------------------ //------------------------------------------------
@ -50,7 +51,7 @@ class AutoFdEntity
bool Attach(const char* path, int existfd); bool Attach(const char* path, int existfd);
int GetPseudoFd() const { return pseudo_fd; } int GetPseudoFd() const { return pseudo_fd; }
FdEntity* Open(const char* path, headers_t* pmeta = NULL, off_t size = -1, time_t time = -1, int flags = O_RDONLY, bool force_tmpfile = false, bool is_create = true, bool no_fd_lock_wait = false); FdEntity* Open(const char* path, headers_t* pmeta, off_t size, time_t time, int flags, bool force_tmpfile, bool is_create, AutoLock::Type type);
FdEntity* GetExistFdEntity(const char* path, int existfd = -1); FdEntity* GetExistFdEntity(const char* path, int existfd = -1);
FdEntity* OpenExistFdEntity(const char* path, int flags = O_RDONLY); FdEntity* OpenExistFdEntity(const char* path, int flags = O_RDONLY);
}; };

View File

@ -663,7 +663,7 @@ bool FdEntity::LoadAll(int fd, headers_t* pmeta, off_t* size, bool force_load)
// TODO: possibly do background for delay loading // TODO: possibly do background for delay loading
// //
int result; int result;
if(0 != (result = Load(/*start=*/ 0, /*size=*/ 0, /*lock_already_held=*/ true))){ if(0 != (result = Load(/*start=*/ 0, /*size=*/ 0, AutoLock::ALREADY_LOCKED))){
S3FS_PRN_ERR("could not download, result(%d)", result); S3FS_PRN_ERR("could not download, result(%d)", result);
return false; return false;
} }
@ -996,16 +996,16 @@ bool FdEntity::SetAllStatus(bool is_loaded)
return true; return true;
} }
int FdEntity::Load(off_t start, off_t size, bool lock_already_held, bool is_modified_flag) int FdEntity::Load(off_t start, off_t size, AutoLock::Type type, bool is_modified_flag)
{ {
AutoLock auto_lock(&fdent_lock, lock_already_held ? AutoLock::ALREADY_LOCKED : AutoLock::NONE); AutoLock auto_lock(&fdent_lock, type);
S3FS_PRN_DBG("[path=%s][physical_fd=%d][offset=%lld][size=%lld]", path.c_str(), physical_fd, static_cast<long long int>(start), static_cast<long long int>(size)); S3FS_PRN_DBG("[path=%s][physical_fd=%d][offset=%lld][size=%lld]", path.c_str(), physical_fd, static_cast<long long int>(start), static_cast<long long int>(size));
if(-1 == physical_fd){ if(-1 == physical_fd){
return -EBADF; return -EBADF;
} }
AutoLock auto_data_lock(&fdent_data_lock, lock_already_held ? AutoLock::ALREADY_LOCKED : AutoLock::NONE); AutoLock auto_data_lock(&fdent_data_lock, type);
int result = 0; int result = 0;
@ -1354,7 +1354,7 @@ int FdEntity::RowFlush(int fd, const char* tpath, bool force_sync)
// enough disk space // enough disk space
// Load all uninitialized area(no mix multipart uploading) // Load all uninitialized area(no mix multipart uploading)
if(!FdEntity::mixmultipart){ if(!FdEntity::mixmultipart){
result = Load(/*start=*/ 0, /*size=*/ 0, /*lock_already_held=*/ true); result = Load(/*start=*/ 0, /*size=*/ 0, AutoLock::ALREADY_LOCKED);
} }
FdManager::FreeReservedDiskSpace(restsize); FdManager::FreeReservedDiskSpace(restsize);
if(0 != result){ if(0 != result){
@ -1432,7 +1432,7 @@ int FdEntity::RowFlush(int fd, const char* tpath, bool force_sync)
// [TODO] should use parallel downloading // [TODO] should use parallel downloading
// //
for(fdpage_list_t::const_iterator iter = dlpages.begin(); iter != dlpages.end(); ++iter){ for(fdpage_list_t::const_iterator iter = dlpages.begin(); iter != dlpages.end(); ++iter){
if(0 != (result = Load(iter->offset, iter->bytes, /*lock_already_held=*/ true, /*is_modified_flag=*/ true))){ // set loaded and modified flag if(0 != (result = Load(iter->offset, iter->bytes, AutoLock::ALREADY_LOCKED, /*is_modified_flag=*/ true))){ // set loaded and modified flag
S3FS_PRN_ERR("failed to get parts(start=%lld, size=%lld) before uploading.", static_cast<long long int>(iter->offset), static_cast<long long int>(iter->bytes)); S3FS_PRN_ERR("failed to get parts(start=%lld, size=%lld) before uploading.", static_cast<long long int>(iter->offset), static_cast<long long int>(iter->bytes));
return result; return result;
} }
@ -1447,7 +1447,7 @@ int FdEntity::RowFlush(int fd, const char* tpath, bool force_sync)
} }
}else{ }else{
// If there are unloaded pages, they are loaded at here. // If there are unloaded pages, they are loaded at here.
if(0 != (result = Load(/*start=*/ 0, /*size=*/ 0, /*lock_already_held=*/ true))){ if(0 != (result = Load(/*start=*/ 0, /*size=*/ 0, AutoLock::ALREADY_LOCKED))){
S3FS_PRN_ERR("failed to load parts before uploading object(%d)", result); S3FS_PRN_ERR("failed to load parts before uploading object(%d)", result);
return result; return result;
} }
@ -1570,7 +1570,7 @@ ssize_t FdEntity::Read(int fd, char* bytes, off_t start, size_t size, bool force
// Loading // Loading
int result = 0; int result = 0;
if(0 < size){ if(0 < size){
result = Load(start, load_size, /*lock_already_held=*/ true); result = Load(start, load_size, AutoLock::ALREADY_LOCKED);
} }
FdManager::FreeReservedDiskSpace(load_size); FdManager::FreeReservedDiskSpace(load_size);
@ -1629,7 +1629,7 @@ ssize_t FdEntity::Write(int fd, const char* bytes, off_t start, size_t size)
// Load uninitialized area which starts from 0 to (start + size) before writing. // Load uninitialized area which starts from 0 to (start + size) before writing.
if(!FdEntity::mixmultipart){ if(!FdEntity::mixmultipart){
if(0 < start){ if(0 < start){
result = Load(0, start, /*lock_already_held=*/ true); result = Load(0, start, AutoLock::ALREADY_LOCKED);
} }
} }
@ -1675,7 +1675,7 @@ ssize_t FdEntity::Write(int fd, const char* bytes, off_t start, size_t size)
// Load uninitialized area which starts from (start + size) to EOF after writing. // Load uninitialized area which starts from (start + size) to EOF after writing.
if(!FdEntity::mixmultipart){ if(!FdEntity::mixmultipart){
if(pagelist.Size() > start + static_cast<off_t>(size)){ if(pagelist.Size() > start + static_cast<off_t>(size)){
result = Load(start + size, pagelist.Size(), /*lock_already_held=*/ true); result = Load(start + size, pagelist.Size(), AutoLock::ALREADY_LOCKED);
if(0 != result){ if(0 != result){
S3FS_PRN_ERR("failed to load uninitialized area after writing(errno=%d)", result); S3FS_PRN_ERR("failed to load uninitialized area after writing(errno=%d)", result);
return result; return result;

View File

@ -108,7 +108,7 @@ class FdEntity
bool SetGId(gid_t gid); bool SetGId(gid_t gid);
bool SetContentType(const char* path); bool SetContentType(const char* path);
int Load(off_t start = 0, off_t size = 0, bool lock_already_held = false, bool is_modified_flag = false); // size=0 means loading to end int Load(off_t start, off_t size, AutoLock::Type type, bool is_modified_flag = false); // size=0 means loading to end
off_t BytesModified(); off_t BytesModified();
int RowFlush(int fd, const char* tpath, bool force_sync = false); int RowFlush(int fd, const char* tpath, bool force_sync = false);

View File

@ -717,7 +717,7 @@ static int get_local_fent(AutoFdEntity& autoent, FdEntity **entity, const char*
time_t mtime = (!S_ISREG(stobj.st_mode) && !S_ISLNK(stobj.st_mode)) ? -1 : stobj.st_mtime; time_t mtime = (!S_ISREG(stobj.st_mode) && !S_ISLNK(stobj.st_mode)) ? -1 : stobj.st_mtime;
bool force_tmpfile = S_ISREG(stobj.st_mode) ? false : true; bool force_tmpfile = S_ISREG(stobj.st_mode) ? false : true;
if(NULL == (ent = autoent.Open(path, &meta, stobj.st_size, mtime, flags, force_tmpfile, true))){ if(NULL == (ent = autoent.Open(path, &meta, stobj.st_size, mtime, flags, force_tmpfile, true, AutoLock::NONE))){
S3FS_PRN_ERR("Could not open file. errno(%d)", errno); S3FS_PRN_ERR("Could not open file. errno(%d)", errno);
return -EIO; return -EIO;
} }
@ -1001,7 +1001,7 @@ static int s3fs_create(const char* _path, mode_t mode, struct fuse_file_info* fi
AutoFdEntity autoent; AutoFdEntity autoent;
FdEntity* ent; FdEntity* ent;
if(NULL == (ent = autoent.Open(path, &meta, 0, -1, fi->flags, false, true))){ if(NULL == (ent = autoent.Open(path, &meta, 0, -1, fi->flags, false, true, AutoLock::NONE))){
StatCache::getStatCacheData()->DelStat(path); StatCache::getStatCacheData()->DelStat(path);
return -EIO; return -EIO;
} }
@ -1197,7 +1197,7 @@ static int s3fs_symlink(const char* _from, const char* _to)
{ // scope for AutoFdEntity { // scope for AutoFdEntity
AutoFdEntity autoent; AutoFdEntity autoent;
FdEntity* ent; FdEntity* ent;
if(NULL == (ent = autoent.Open(to, &headers, 0, -1, O_RDWR, true, true))){ if(NULL == (ent = autoent.Open(to, &headers, 0, -1, O_RDWR, true, true, AutoLock::NONE))){
S3FS_PRN_ERR("could not open tmpfile(errno=%d)", errno); S3FS_PRN_ERR("could not open tmpfile(errno=%d)", errno);
return -errno; return -errno;
} }
@ -1270,7 +1270,7 @@ static int rename_object(const char* from, const char* to, bool update_ctime)
// no opened fd // no opened fd
if(FdManager::IsCacheDir()){ if(FdManager::IsCacheDir()){
// create cache file if be needed // create cache file if be needed
ent = autoent.Open(from, &meta, buf.st_size, -1, O_RDONLY, false, true); ent = autoent.Open(from, &meta, buf.st_size, -1, O_RDONLY, false, true, AutoLock::NONE);
} }
if(ent){ if(ent){
struct timespec mtime = get_mtime(meta); struct timespec mtime = get_mtime(meta);
@ -2196,11 +2196,11 @@ static int s3fs_truncate(const char* _path, off_t size)
// Get file information // Get file information
if(0 == (result = get_object_attribute(path, NULL, &meta))){ if(0 == (result = get_object_attribute(path, NULL, &meta))){
// Exists -> Get file(with size) // Exists -> Get file(with size)
if(NULL == (ent = autoent.Open(path, &meta, size, -1, O_RDWR, false, true))){ if(NULL == (ent = autoent.Open(path, &meta, size, -1, O_RDWR, false, true, AutoLock::NONE))){
S3FS_PRN_ERR("could not open file(%s): errno=%d", path, errno); S3FS_PRN_ERR("could not open file(%s): errno=%d", path, errno);
return -EIO; return -EIO;
} }
if(0 != (result = ent->Load(0, size))){ if(0 != (result = ent->Load(0, size, AutoLock::NONE))){
S3FS_PRN_ERR("could not download file(%s): result=%d", path, result); S3FS_PRN_ERR("could not download file(%s): result=%d", path, result);
return result; return result;
} }
@ -2221,7 +2221,7 @@ static int s3fs_truncate(const char* _path, off_t size)
meta["x-amz-meta-uid"] = str(pcxt->uid); meta["x-amz-meta-uid"] = str(pcxt->uid);
meta["x-amz-meta-gid"] = str(pcxt->gid); meta["x-amz-meta-gid"] = str(pcxt->gid);
if(NULL == (ent = autoent.Open(path, &meta, size, -1, O_RDWR, true, true))){ if(NULL == (ent = autoent.Open(path, &meta, size, -1, O_RDWR, true, true, AutoLock::NONE))){
S3FS_PRN_ERR("could not open file(%s): errno=%d", path, errno); S3FS_PRN_ERR("could not open file(%s): errno=%d", path, errno);
return -EIO; return -EIO;
} }
@ -2292,7 +2292,7 @@ static int s3fs_open(const char* _path, struct fuse_file_info* fi)
FdEntity* ent; FdEntity* ent;
headers_t meta; headers_t meta;
get_object_attribute(path, NULL, &meta, true, NULL, true); // no truncate cache get_object_attribute(path, NULL, &meta, true, NULL, true); // no truncate cache
if(NULL == (ent = autoent.Open(path, &meta, st.st_size, st.st_mtime, fi->flags, false, true))){ if(NULL == (ent = autoent.Open(path, &meta, st.st_size, st.st_mtime, fi->flags, false, true, AutoLock::NONE))){
StatCache::getStatCacheData()->DelStat(path); StatCache::getStatCacheData()->DelStat(path);
return -EIO; return -EIO;
} }