Skip to content

Commit 4a51f16

Browse files
committed
added asyc lock and cache tests
1 parent edd1e3d commit 4a51f16

File tree

3 files changed

+23
-14
lines changed

3 files changed

+23
-14
lines changed

splitio/storage/adapters/cache_trait.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import threading
44
import time
55
from functools import update_wrapper
6-
6+
from splitio.optional.loaders import asyncio
77

88
DEFAULT_MAX_AGE = 5
99
DEFAULT_MAX_SIZE = 100
@@ -84,7 +84,7 @@ def get(self, *args, **kwargs):
8484
self._rollover()
8585
return node.value
8686

87-
def get_key(self, key):
87+
async def get_key(self, key):
8888
"""
8989
Fetch an item from the cache, return None if does not exist
9090
@@ -94,7 +94,7 @@ def get_key(self, key):
9494
:return: Cached/Fetched object
9595
:rtype: object
9696
"""
97-
with self._lock:
97+
async with asyncio.Lock():
9898
node = self._data.get(key)
9999
if node is not None:
100100
if self._is_expired(node):
@@ -104,7 +104,7 @@ def get_key(self, key):
104104
node = self._bubble_up(node)
105105
return node.value
106106

107-
def add_key(self, key, value):
107+
async def add_key(self, key, value):
108108
"""
109109
Add an item from the cache.
110110
@@ -114,7 +114,7 @@ def add_key(self, key, value):
114114
:param value: key value
115115
:type value: str
116116
"""
117-
with self._lock:
117+
async with asyncio.Lock():
118118
node = LocalMemoryCache._Node(key, value, time.time(), None, None)
119119
node = self._bubble_up(node)
120120
self._data[key] = node

splitio/storage/redis.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -289,12 +289,12 @@ async def get(self, split_name): # pylint: disable=method-hidden
289289
:rtype: splitio.models.splits.Split
290290
"""
291291
try:
292-
if self._enable_caching and self._cache.get_key(split_name) is not None:
293-
raw = self._cache.get_key(split_name)
292+
if self._enable_caching and await self._cache.get_key(split_name) is not None:
293+
raw = await self._cache.get_key(split_name)
294294
else:
295295
raw = await self._redis.get(self._get_key(split_name))
296296
if self._enable_caching:
297-
self._cache.add_key(split_name, raw)
297+
await self._cache.add_key(split_name, raw)
298298
_LOGGER.debug("Fetchting Split [%s] from redis" % split_name)
299299
_LOGGER.debug(raw)
300300
return splits.from_raw(json.loads(raw)) if raw is not None else None
@@ -315,13 +315,13 @@ async def fetch_many(self, split_names):
315315
"""
316316
to_return = dict()
317317
try:
318-
if self._enable_caching and self._cache.get_key(frozenset(split_names)) is not None:
319-
raw_splits = self._cache.get_key(frozenset(split_names))
318+
if self._enable_caching and await self._cache.get_key(frozenset(split_names)) is not None:
319+
raw_splits = await self._cache.get_key(frozenset(split_names))
320320
else:
321321
keys = [self._get_key(split_name) for split_name in split_names]
322322
raw_splits = await self._redis.mget(keys)
323323
if self._enable_caching:
324-
self._cache.add_key(frozenset(split_names), raw_splits)
324+
await self._cache.add_key(frozenset(split_names), raw_splits)
325325
for i in range(len(split_names)):
326326
split = None
327327
try:
@@ -346,12 +346,12 @@ async def is_valid_traffic_type(self, traffic_type_name): # pylint: disable=met
346346
:rtype: bool
347347
"""
348348
try:
349-
if self._enable_caching and self._cache.get_key(traffic_type_name) is not None:
350-
raw = self._cache.get_key(traffic_type_name)
349+
if self._enable_caching and await self._cache.get_key(traffic_type_name) is not None:
350+
raw = await self._cache.get_key(traffic_type_name)
351351
else:
352352
raw = await self._redis.get(self._get_traffic_type_key(traffic_type_name))
353353
if self._enable_caching:
354-
self._cache.add_key(traffic_type_name, raw)
354+
await self._cache.add_key(traffic_type_name, raw)
355355
count = json.loads(raw) if raw else 0
356356
return count > 0
357357
except RedisAdapterException:

tests/storage/adapters/test_cache_trait.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import pytest
77

88
from splitio.storage.adapters import cache_trait
9+
from splitio.optional.loaders import asyncio
910

1011
class CacheTraitTests(object):
1112
"""Cache trait test cases."""
@@ -130,3 +131,11 @@ def test_decorate(self, mocker):
130131
assert cache_trait.decorate(key_func, 0, 10)(user_func) is user_func
131132
assert cache_trait.decorate(key_func, 10, 0)(user_func) is user_func
132133
assert cache_trait.decorate(key_func, 0, 0)(user_func) is user_func
134+
135+
@pytest.mark.asyncio
136+
async def test_async_add_and_get_key(self, mocker):
137+
cache = cache_trait.LocalMemoryCache(None, None, 1, 1)
138+
await cache.add_key('split', {'split_name': 'split'})
139+
assert await cache.get_key('split') == {'split_name': 'split'}
140+
await asyncio.sleep(1)
141+
assert await cache.get_key('split') == None

0 commit comments

Comments
 (0)