X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/8d2dd8003b6e865033e372b5db76fc2244378964..79ba997c9bc1f97514dcc6f1d6016ba7524a0ae1:/sdk/python/arvados/cache.py diff --git a/sdk/python/arvados/cache.py b/sdk/python/arvados/cache.py index c4e4c09c62..85f2b89ea2 100644 --- a/sdk/python/arvados/cache.py +++ b/sdk/python/arvados/cache.py @@ -1,24 +1,50 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +from builtins import object import errno -import md5 +import hashlib import os import tempfile +import time class SafeHTTPCache(object): - def __init__(self, path=None): + """Thread-safe replacement for httplib2.FileCache""" + + def __init__(self, path=None, max_age=None): self._dir = path + if max_age is not None: + try: + self._clean(threshold=time.time() - max_age) + except: + pass + + def _clean(self, threshold=0): + for ent in os.listdir(self._dir): + fnm = os.path.join(self._dir, ent) + if os.path.isdir(fnm) or not fnm.endswith('.tmp'): + continue + stat = os.lstat(fnm) + if stat.st_mtime < threshold: + try: + os.unlink(fnm) + except OSError as err: + if err.errno != errno.ENOENT: + raise def __str__(self): return self._dir def _filename(self, url): - return os.path.join(self._dir, md5.new(url).hexdigest()) + return os.path.join(self._dir, hashlib.md5(url.encode('utf-8')).hexdigest()+'.tmp') def get(self, url): filename = self._filename(url) try: with open(filename, 'rb') as f: return f.read() - except IOError, OSError: + except (IOError, OSError): return None def set(self, url, content): @@ -28,7 +54,7 @@ class SafeHTTPCache(object): return None try: try: - f = os.fdopen(fd, 'w') + f = os.fdopen(fd, 'wb') except: os.close(fd) raise