summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2012-04-25 18:43:27 +0000
committerrandomdan <randomdan@localhost>2012-04-25 18:43:27 +0000
commitf22d0bee86b17b3553e63509f89e49329e3ac030 (patch)
tree440c0779e3db9083e4ecfea68eb402d6c7fe627c
parentHandy little lazy pointer class for last minute default initialisation (diff)
downloadproject2-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.cpp13
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"),