diff options
| -rw-r--r-- | netfs/fuse/fuse.cpp | 4 | ||||
| -rw-r--r-- | netfs/fuse/fuse.h | 4 | ||||
| -rw-r--r-- | netfs/fuse/fuseDirs.cpp | 13 | ||||
| -rw-r--r-- | netfs/fuse/fuseMisc.cpp | 8 | 
4 files changed, 27 insertions, 2 deletions
diff --git a/netfs/fuse/fuse.cpp b/netfs/fuse/fuse.cpp index d9d49fc..3d14d1c 100644 --- a/netfs/fuse/fuse.cpp +++ b/netfs/fuse/fuse.cpp @@ -3,6 +3,10 @@  #include <boost/foreach.hpp>  #include "fuse.h"  #include "lockHelpers.h" +#include "cache.impl.h" + +template class Cache<struct stat, std::string, IceUtil::Shared, IceUtil::Handle<Cacheable<struct stat, std::string, IceUtil::Shared>>>; +template class OptimisticCallCacheable<struct stat, std::string, IceUtil::Shared>;  NetFS::FuseApp::FuseApp(int & argc, char ** argv) :  	_argc(argc), diff --git a/netfs/fuse/fuse.h b/netfs/fuse/fuse.h index a271630..d95dec4 100644 --- a/netfs/fuse/fuse.h +++ b/netfs/fuse/fuse.h @@ -7,6 +7,7 @@  #include "fuseapp.h"  #include "fuseConfig.h"  #include "entCache.h" +#include "cache.h"  namespace NetFS {  	class FuseApp : public FuseAppBase { @@ -107,6 +108,9 @@ namespace NetFS {  			int openDirID;  			OpenFiles openFiles;  			int openFileID; + +			typedef Cache<struct stat, std::string, IceUtil::Shared, IceUtil::Handle<Cacheable<struct stat, std::string, IceUtil::Shared>>> StatCache; +			StatCache statCache;  	};  } diff --git a/netfs/fuse/fuseDirs.cpp b/netfs/fuse/fuseDirs.cpp index e09b68b..35aad94 100644 --- a/netfs/fuse/fuseDirs.cpp +++ b/netfs/fuse/fuseDirs.cpp @@ -2,6 +2,7 @@  #include "fuse.h"  #include "misc.h"  #include "lockHelpers.h" +#include <typeConvert.h>  NetFS::FuseApp::OpenDir::OpenDir(DirectoryPrx r, const std::string & p) :  	remote(r), @@ -63,13 +64,23 @@ NetFS::FuseApp::releasedir(const char *, struct fuse_file_info * fi)  }  int -NetFS::FuseApp::readdir(const char *, void * buf, fuse_fill_dir_t filler, off_t, struct fuse_file_info * fi) +NetFS::FuseApp::readdir(const char * p, void * buf, fuse_fill_dir_t filler, off_t, struct fuse_file_info * fi)  {  	try {  		auto remote = getDirProxy(fi->fh)->remote;  		NetFS::NameList ds = remote->readdir(); +		std::string path(p); +		NetFS::VolumePrx vc = volume;  		BOOST_FOREACH(const auto & e, ds) {  			filler(buf, e.c_str(), NULL, 0); +			std::string epath = path + "/" + e; +			auto asga = volume->begin_getattr(reqEnv(), epath); +			statCache.Add(new OptimisticCallCacheable<struct stat, std::string, IceUtil::Shared>( +						[asga,this]() { +							struct stat s; +							s << AttrSource { volume->end_getattr(asga), boost::bind(&UserEntCache::getID, &uentries, _1), boost::bind(&GroupEntCache::getID, &gentries, _1) }; +							return s; +						}, epath, time_t(NULL) + 2));  		}  		return 0;  	} diff --git a/netfs/fuse/fuseMisc.cpp b/netfs/fuse/fuseMisc.cpp index 568cf52..1eecdd4 100644 --- a/netfs/fuse/fuseMisc.cpp +++ b/netfs/fuse/fuseMisc.cpp @@ -13,7 +13,13 @@ int  NetFS::FuseApp::getattr(const char * p, struct stat * s)  {  	try { -		*s << AttrSource { volume->getattr(reqEnv(), p), boost::bind(&UserEntCache::getID, &uentries, _1), boost::bind(&GroupEntCache::getID, &gentries, _1) }; +		auto cacehedStat = statCache.Get(p); +		if (cacehedStat) { +			*s = *cacehedStat; +		} +		else { +			*s << AttrSource { volume->getattr(reqEnv(), p), boost::bind(&UserEntCache::getID, &uentries, _1), boost::bind(&GroupEntCache::getID, &gentries, _1) }; +		}  		return 0;  	}  	catch (NetFS::SystemError & e) {  | 
