Skip to content

Commit

Permalink
Make the package cache resistant against deserialization errors
Browse files Browse the repository at this point in the history
Today I've been hitting zlib decoding errors and I'm 99% sure my
disk isn't failing (RAID 1 array). For now I'm inclined not to
dive too deep into this, because there's a very simple fix (see
first line :-). For future reference, here's the zlib error:

  File ".../deb_pkg_tools/cache.py", line 299, in control_fields
    return self.cache.decode(self['control_fields'])
  File ".../deb_pkg_tools/cache.py", line 249, in decode
    return pickle.loads(zlib.decompress(database_value))

  error: Error -5 while decompressing data
  • Loading branch information
xolox committed Jun 18, 2014
1 parent 3442b0e commit 8b04dfc
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 21 deletions.
4 changes: 2 additions & 2 deletions deb_pkg_tools/__init__.py
@@ -1,11 +1,11 @@
# Debian packaging tools.
#
# Author: Peter Odding <peter@peterodding.com>
# Last Change: June 16, 2014
# Last Change: June 19, 2014
# URL: https://github.com/xolox/python-deb-pkg-tools

# Semi-standard module versioning.
__version__ = '1.22.1'
__version__ = '1.22.2'

debian_package_dependencies = (
'apt', # apt-get
Expand Down
44 changes: 25 additions & 19 deletions deb_pkg_tools/cache.py
@@ -1,7 +1,7 @@
# Debian packaging tools: Caching of package metadata.
#
# Author: Peter Odding <peter@peterodding.com>
# Last Change: June 9, 2014
# Last Change: June 19, 2014
# URL: https://github.com/xolox/python-deb-pkg-tools

"""
Expand Down Expand Up @@ -296,12 +296,14 @@ def control_fields(self):
:py:func:`.inspect_package_fields()`.
"""
if self['control_fields']:
return self.cache.decode(self['control_fields'])
else:
control_fields = inspect_package_fields(self.pathname)
update_query = 'update package_cache set control_fields = ? where pathname = ?'
self.cache.execute(update_query, self.cache.encode(control_fields), self.pathname)
return control_fields
try:
return self.cache.decode(self['control_fields'])
except Exception, e:
logger.warning("Failed to load cached control fields of %s! (%s)", self.pathname, e)
control_fields = inspect_package_fields(self.pathname)
update_query = 'update package_cache set control_fields = ? where pathname = ?'
self.cache.execute(update_query, self.cache.encode(control_fields), self.pathname)
return control_fields

@cached_property
def package_fields(self):
Expand All @@ -312,12 +314,14 @@ def package_fields(self):
:py:func:`.get_packages_entry()`.
"""
if self['package_fields']:
return self.cache.decode(self['package_fields'])
else:
package_fields = get_packages_entry(self.pathname)
update_query = 'update package_cache set package_fields = ? where pathname = ?'
self.cache.execute(update_query, self.cache.encode(package_fields), self.pathname)
return package_fields
try:
return self.cache.decode(self['package_fields'])
except Exception, e:
logger.warning("Failed to load cached package fields of %s! (%s)", self.pathname, e)
package_fields = get_packages_entry(self.pathname)
update_query = 'update package_cache set package_fields = ? where pathname = ?'
self.cache.execute(update_query, self.cache.encode(package_fields), self.pathname)
return package_fields

@cached_property
def contents(self):
Expand All @@ -328,11 +332,13 @@ def contents(self):
by :py:func:`.inspect_package_contents()`.
"""
if self['contents']:
return self.cache.decode(self['contents'])
else:
contents = inspect_package_contents(self.pathname)
update_query = 'update package_cache set contents = ? where pathname = ?'
self.cache.execute(update_query, self.cache.encode(contents), self.pathname)
return contents
try:
return self.cache.decode(self['contents'])
except Exception, e:
logger.warning("Failed to load cached contents of %s! (%s)", self.pathname, e)
contents = inspect_package_contents(self.pathname)
update_query = 'update package_cache set contents = ? where pathname = ?'
self.cache.execute(update_query, self.cache.encode(contents), self.pathname)
return contents

# vim: ts=4 sw=4 et

0 comments on commit 8b04dfc

Please sign in to comment.