from strato.racktest.infra.seed import memorycache from strato.racktest.infra.seed import filecache from strato.racktest.infra.seed import cacheregistry class FileBackedByMemory(filecache.FileCache): def __init__(self, cacheDir): filecache.FileCache.__init__(self, cacheDir) self._memoryCache = memorycache.MemoryCache() def get(self, key): with self._memoryCache.lock(key): entry = self._memoryCache.get(key) if entry: return entry entry = filecache.FileCache.get(self, key) if entry is None: return None with self._memoryCache.lock(key): self._memoryCache.install(key, {'code': entry}) return entry def install(self, seedKey, seedEntry): filecache.FileCache.install(self, seedKey, seedEntry) with self._memoryCache.lock(seedKey): self._memoryCache.install(seedKey, seedEntry) cacheregistry.register('filecached', lambda: FileBackedByMemory(filecache.fileCacheDir()))
from contextlib import contextmanager import multiprocessing import logging class MemoryCache(object): def __init__(self): self._lock = multiprocessing.Lock() self._manager = multiprocessing.Manager() self._cache = self._manager.dict() @contextmanager def lock(self, key): self._lock.acquire(timeout=60) try: yield finally: self._lock.release() def get(self, key): return self._cache.get(key.hash, None) def install(self, seedKey, seedEntry): logging.debug('Adding seed for key %(key)s to cache', dict(key=seedKey)) self._cache[seedKey.hash] = seedEntry['code'] from strato.racktest.infra.seed import cacheregistry cacheregistry.register('memory', MemoryCache.__init__)
from strato.racktest.infra.seed import memorycache from strato.racktest.infra.seed import filecache from strato.racktest.infra.seed import cacheregistry class FileBackedByMemory(filecache.FileCache): def __init__(self, cacheDir): filecache.FileCache.__init__(self, cacheDir) self._memoryCache = memorycache.MemoryCache() def get(self, key): with self._memoryCache.lock(key): entry = self._memoryCache.get(key) if entry: return entry entry = filecache.FileCache.get(self, key) if entry is None: return None with self._memoryCache.lock(key): self._memoryCache.install(key, {"code": entry}) return entry def install(self, seedKey, seedEntry): filecache.FileCache.install(self, seedKey, seedEntry) with self._memoryCache.lock(seedKey): self._memoryCache.install(seedKey, seedEntry) cacheregistry.register("filecached", lambda: FileBackedByMemory(filecache.fileCacheDir()))