예제 #1
0
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()))
예제 #2
0
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__)
예제 #3
0
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()))