diff options
author | Johan Dahlin <jdahlin@async.com.br> | 2008-11-07 14:09:02 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2008-11-07 14:09:02 +0000 |
commit | b2155cf1d785e50f021a48c44224dec3d70e6301 (patch) | |
tree | a5270867cd76449d3f52d3860aa7e25c09219e31 /giscanner/cachestore.py | |
parent | f85ee225ce85a0dd6e8da008af6eea5c8ea736ce (diff) | |
download | gobject-introspection-b2155cf1d785e50f021a48c44224dec3d70e6301.tar.gz |
Handle broken cache entries, write only filesystems and running out of
2008-11-07 Johan Dahlin <jdahlin@async.com.br>
* giscanner/cachestore.py:
Handle broken cache entries, write only filesystems and
running out of diskspace.
svn path=/trunk/; revision=867
Diffstat (limited to 'giscanner/cachestore.py')
-rw-r--r-- | giscanner/cachestore.py | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/giscanner/cachestore.py b/giscanner/cachestore.py index 809e1501..264ccee4 100644 --- a/giscanner/cachestore.py +++ b/giscanner/cachestore.py @@ -61,6 +61,19 @@ class CacheStore(object): return (os.stat(store_filename).st_mtime >= os.stat(filename).st_mtime) + def _purge_cache(self, filename): + try: + os.unlink(filename) + except IOError, e: + # Permission denied + if e.errno == errno.EACCES: + return + # File does not exist + elif e.errno == errno.ENOENT: + return + else: + raise + def store(self, filename, data): store_filename = self._get_filename(filename) if store_filename is None: @@ -69,7 +82,14 @@ class CacheStore(object): self._cache_is_valid(store_filename, filename)): return None fd = open(store_filename, 'w') - cPickle.dump(data, fd) + try: + cPickle.dump(data, fd) + except IOError, e: + # No space left on device + if e.errno == e.ENOSPC: + return + else: + raise def load(self, filename): store_filename = self._get_filename(filename) @@ -80,8 +100,14 @@ class CacheStore(object): except IOError, e: if e.errno == errno.ENOENT: return None - raise + else: + raise if not self._cache_is_valid(store_filename, filename): return None - data = cPickle.load(fd) + try: + data = cPickle.load(fd) + except EOFError: + # Broken cache entry, remove it + self._purge_cache(store_filename) + data = None return data |