diff options
author | randomdan <randomdan@localhost> | 2012-04-25 18:43:27 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2012-04-25 18:43:27 +0000 |
commit | f22d0bee86b17b3553e63509f89e49329e3ac030 (patch) | |
tree | 440c0779e3db9083e4ecfea68eb402d6c7fe627c | |
parent | Handy little lazy pointer class for last minute default initialisation (diff) | |
download | project2-f22d0bee86b17b3553e63509f89e49329e3ac030.tar.bz2 project2-f22d0bee86b17b3553e63509f89e49329e3ac030.tar.xz project2-f22d0bee86b17b3553e63509f89e49329e3ac030.zip |
Unlinking cache file invalidates cache (bug18)
Fix possible race condition truncating cache file on update
Correct config section name
-rw-r--r-- | project2/files/presenterCache.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/project2/files/presenterCache.cpp b/project2/files/presenterCache.cpp index 8838568..e203fc4 100644 --- a/project2/files/presenterCache.cpp +++ b/project2/files/presenterCache.cpp @@ -16,6 +16,7 @@ SimpleSysCallException(OpenCacheFile); SimpleSysCallException(StatCacheFile); SimpleSysCallException(LockCacheFile); +SimpleSysCallException(TruncateCacheFile); SimpleSysCallException(CacheFileXAttr); template <class E> @@ -47,7 +48,12 @@ class FilePresenterCache : public PresenterCache, public StaticContent, public S readcachefd = safesys<OpenCacheFile>(-1, open(getCacheFile().string().c_str(), O_RDONLY)); } struct stat st; - safesys<CacheFileXAttr>(-1, fstat(readcachefd, &st)); + safesys<StatCacheFile>(-1, fstat(readcachefd, &st)); + if (st.st_nlink == 0) { + close(readcachefd); + readcachefd = 0; + readcachefd = safesys<OpenCacheFile>(-1, open(getCacheFile().string().c_str(), O_RDONLY)); + } if (st.st_mtime < time(NULL) - FilePresenterCache::CacheLife) { unlink(getCacheFile().string().c_str()); close(readcachefd); @@ -99,8 +105,9 @@ class FilePresenterCache : public PresenterCache, public StaticContent, public S std::ostream & writeCache(const std::string & ct, const std::string & enc) { int fd = safesys<OpenCacheFile>(-1, open(getCacheFile().string().c_str(), - O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)); + O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)); safesys<LockCacheFile>(-1, ::flock(fd, LOCK_EX)); + safesys<TruncateCacheFile>(-1, ::ftruncate(fd, 0)); safesys<CacheFileXAttr>(-1, fsetxattr(fd, "user.content-type", ct.c_str(), ct.length(), 0)); safesys<CacheFileXAttr>(-1, fsetxattr(fd, "user.encoding", enc.c_str(), enc.length(), 0)); writecache = new boost::iostreams::stream<boost::iostreams::file_descriptor_sink>(fd, boost::iostreams::close_handle); @@ -148,7 +155,7 @@ time_t FilePresenterCache::CacheLife; class FilePresenterCacheLoader : public ElementLoader::For<FilePresenterCache> { public: FilePresenterCacheLoader() : - opts("XML Cache options") + opts("File Presenter Cache options") { opts ("pcache.file.store", Options::value(&FilePresenterCache::Store, "/tmp/project2.pcache"), |