mirror of
https://github.com/quay/quay.git
synced 2026-01-27 18:42:52 +03:00
Remove GlobalLock from Redis model cache implementation in favor of 'nx=True' when setting the key. Signed-off-by: Alec Merdler <alecmerdler@gmail.com>
90 lines
2.3 KiB
Python
90 lines
2.3 KiB
Python
import pytest
|
|
|
|
from mock import patch
|
|
|
|
from data.cache import (
|
|
InMemoryDataModelCache,
|
|
NoopDataModelCache,
|
|
MemcachedModelCache,
|
|
RedisDataModelCache,
|
|
)
|
|
from data.cache.cache_key import CacheKey
|
|
|
|
|
|
DATA = {}
|
|
|
|
|
|
class MockClient(object):
|
|
def __init__(self, **kwargs):
|
|
pass
|
|
|
|
def get(self, key, default=None):
|
|
return DATA.get(key, default)
|
|
|
|
def set(self, key, value, expire=None):
|
|
DATA[key] = value
|
|
|
|
def close(self):
|
|
pass
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"cache_type",
|
|
[
|
|
(NoopDataModelCache),
|
|
(InMemoryDataModelCache),
|
|
],
|
|
)
|
|
def test_caching(cache_type):
|
|
key = CacheKey("foo", "60m")
|
|
cache = cache_type()
|
|
|
|
# Perform two retrievals, and make sure both return.
|
|
assert cache.retrieve(key, lambda: {"a": 1234}) == {"a": 1234}
|
|
assert cache.retrieve(key, lambda: {"a": 1234}) == {"a": 1234}
|
|
|
|
|
|
def test_memcache():
|
|
global DATA
|
|
DATA = {}
|
|
|
|
key = CacheKey("foo", "60m")
|
|
with patch("data.cache.impl.PooledClient", MockClient):
|
|
cache = MemcachedModelCache(("127.0.0.1", "-1"))
|
|
assert cache.retrieve(key, lambda: {"a": 1234}) == {"a": 1234}
|
|
assert cache.retrieve(key, lambda: {"a": 1234}) == {"a": 1234}
|
|
|
|
|
|
def test_memcache_should_cache():
|
|
global DATA
|
|
DATA = {}
|
|
|
|
key = CacheKey("foo", None)
|
|
|
|
def sc(value):
|
|
return value["a"] != 1234
|
|
|
|
with patch("data.cache.impl.PooledClient", MockClient):
|
|
cache = MemcachedModelCache(("127.0.0.1", "-1"))
|
|
assert cache.retrieve(key, lambda: {"a": 1234}, should_cache=sc) == {"a": 1234}
|
|
|
|
# Ensure not cached since it was `1234`.
|
|
assert cache._get_client_pool().get(key.key) is None
|
|
|
|
# Ensure cached.
|
|
assert cache.retrieve(key, lambda: {"a": 2345}, should_cache=sc) == {"a": 2345}
|
|
assert cache._get_client_pool().get(key.key) is not None
|
|
assert cache.retrieve(key, lambda: {"a": 2345}, should_cache=sc) == {"a": 2345}
|
|
|
|
|
|
def test_redis_cache():
|
|
global DATA
|
|
DATA = {}
|
|
|
|
key = CacheKey("foo", "60m")
|
|
with patch("data.cache.impl.StrictRedis", MockClient):
|
|
cache = RedisDataModelCache("127.0.0.1")
|
|
|
|
assert cache.retrieve(key, lambda: {"a": 1234}) == {"a": 1234}
|
|
assert cache.retrieve(key, lambda: {"a": 1234}) == {"a": 1234}
|