arvados.cache
1# Copyright (C) The Arvados Authors. All rights reserved. 2# 3# SPDX-License-Identifier: Apache-2.0 4 5from builtins import object 6import errno 7import hashlib 8import os 9import tempfile 10import time 11 12class SafeHTTPCache(object): 13 """Thread-safe replacement for httplib2.FileCache""" 14 15 def __init__(self, path=None, max_age=None): 16 self._dir = path 17 if max_age is not None: 18 try: 19 self._clean(threshold=time.time() - max_age) 20 except: 21 pass 22 23 def _clean(self, threshold=0): 24 for ent in os.listdir(self._dir): 25 fnm = os.path.join(self._dir, ent) 26 if os.path.isdir(fnm) or not fnm.endswith('.tmp'): 27 continue 28 stat = os.lstat(fnm) 29 if stat.st_mtime < threshold: 30 try: 31 os.unlink(fnm) 32 except OSError as err: 33 if err.errno != errno.ENOENT: 34 raise 35 36 def __str__(self): 37 return self._dir 38 39 def _filename(self, url): 40 return os.path.join(self._dir, hashlib.md5(url.encode('utf-8')).hexdigest()+'.tmp') 41 42 def get(self, url): 43 filename = self._filename(url) 44 try: 45 with open(filename, 'rb') as f: 46 return f.read() 47 except (IOError, OSError): 48 return None 49 50 def set(self, url, content): 51 try: 52 fd, tempname = tempfile.mkstemp(dir=self._dir) 53 except: 54 return None 55 try: 56 try: 57 f = os.fdopen(fd, 'wb') 58 except: 59 os.close(fd) 60 raise 61 try: 62 f.write(content) 63 finally: 64 f.close() 65 os.rename(tempname, self._filename(url)) 66 tempname = None 67 finally: 68 if tempname: 69 os.unlink(tempname) 70 71 def delete(self, url): 72 try: 73 os.unlink(self._filename(url)) 74 except OSError as err: 75 if err.errno != errno.ENOENT: 76 raise
class
SafeHTTPCache:
13class SafeHTTPCache(object): 14 """Thread-safe replacement for httplib2.FileCache""" 15 16 def __init__(self, path=None, max_age=None): 17 self._dir = path 18 if max_age is not None: 19 try: 20 self._clean(threshold=time.time() - max_age) 21 except: 22 pass 23 24 def _clean(self, threshold=0): 25 for ent in os.listdir(self._dir): 26 fnm = os.path.join(self._dir, ent) 27 if os.path.isdir(fnm) or not fnm.endswith('.tmp'): 28 continue 29 stat = os.lstat(fnm) 30 if stat.st_mtime < threshold: 31 try: 32 os.unlink(fnm) 33 except OSError as err: 34 if err.errno != errno.ENOENT: 35 raise 36 37 def __str__(self): 38 return self._dir 39 40 def _filename(self, url): 41 return os.path.join(self._dir, hashlib.md5(url.encode('utf-8')).hexdigest()+'.tmp') 42 43 def get(self, url): 44 filename = self._filename(url) 45 try: 46 with open(filename, 'rb') as f: 47 return f.read() 48 except (IOError, OSError): 49 return None 50 51 def set(self, url, content): 52 try: 53 fd, tempname = tempfile.mkstemp(dir=self._dir) 54 except: 55 return None 56 try: 57 try: 58 f = os.fdopen(fd, 'wb') 59 except: 60 os.close(fd) 61 raise 62 try: 63 f.write(content) 64 finally: 65 f.close() 66 os.rename(tempname, self._filename(url)) 67 tempname = None 68 finally: 69 if tempname: 70 os.unlink(tempname) 71 72 def delete(self, url): 73 try: 74 os.unlink(self._filename(url)) 75 except OSError as err: 76 if err.errno != errno.ENOENT: 77 raise
Thread-safe replacement for httplib2.FileCache
def
set(self, url, content):
51 def set(self, url, content): 52 try: 53 fd, tempname = tempfile.mkstemp(dir=self._dir) 54 except: 55 return None 56 try: 57 try: 58 f = os.fdopen(fd, 'wb') 59 except: 60 os.close(fd) 61 raise 62 try: 63 f.write(content) 64 finally: 65 f.close() 66 os.rename(tempname, self._filename(url)) 67 tempname = None 68 finally: 69 if tempname: 70 os.unlink(tempname)