Skip to content

Commit f2b05ad

Browse files
committed
fix: handle cache issues with more grace
1 parent 5f9702b commit f2b05ad

File tree

1 file changed

+39
-30
lines changed

1 file changed

+39
-30
lines changed

application/cache.py

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,25 @@
1111
logger = logging.getLogger(__name__)
1212

1313
_redis_instance = None
14+
_redis_creation_failed = False
1415
_instance_lock = Lock()
1516

16-
1717
def get_redis_instance():
18-
global _redis_instance
19-
if _redis_instance is None:
18+
global _redis_instance, _redis_creation_failed
19+
if _redis_instance is None and not _redis_creation_failed:
2020
with _instance_lock:
21-
if _redis_instance is None:
21+
if _redis_instance is None and not _redis_creation_failed:
2222
try:
2323
_redis_instance = redis.Redis.from_url(
2424
settings.CACHE_REDIS_URL, socket_connect_timeout=2
2525
)
26+
except ValueError as e:
27+
logger.error(f"Invalid Redis URL: {e}")
28+
_redis_creation_failed = True # Stop future attempts
29+
_redis_instance = None
2630
except redis.ConnectionError as e:
2731
logger.error(f"Redis connection error: {e}")
28-
_redis_instance = None
32+
_redis_instance = None # Keep trying for connection errors
2933
return _redis_instance
3034

3135

@@ -43,34 +47,39 @@ def gen_cache(func):
4347
def wrapper(self, model, messages, stream, tools=None, *args, **kwargs):
4448
try:
4549
cache_key = gen_cache_key(messages, model, tools)
46-
redis_client = get_redis_instance()
47-
if redis_client:
48-
try:
49-
cached_response = redis_client.get(cache_key)
50-
if cached_response:
51-
return cached_response.decode("utf-8")
52-
except redis.ConnectionError as e:
53-
logger.error(f"Redis connection error: {e}")
50+
except ValueError as e:
51+
logger.error(f"Cache key generation failed: {e}")
52+
return func(self, model, messages, stream, tools, *args, **kwargs)
5453

55-
result = func(self, model, messages, stream, tools, *args, **kwargs)
56-
if redis_client and isinstance(result, str):
57-
try:
58-
redis_client.set(cache_key, result, ex=1800)
59-
except redis.ConnectionError as e:
60-
logger.error(f"Redis connection error: {e}")
54+
redis_client = get_redis_instance()
55+
if redis_client:
56+
try:
57+
cached_response = redis_client.get(cache_key)
58+
if cached_response:
59+
return cached_response.decode("utf-8")
60+
except Exception as e:
61+
logger.error(f"Error getting cached response: {e}")
6162

62-
return result
63-
except ValueError as e:
64-
logger.error(e)
65-
return "Error: No user message found in the conversation to generate a cache key."
63+
result = func(self, model, messages, stream, tools, *args, **kwargs)
64+
if redis_client and isinstance(result, str):
65+
try:
66+
redis_client.set(cache_key, result, ex=1800)
67+
except Exception as e:
68+
logger.error(f"Error setting cache: {e}")
69+
70+
return result
6671

6772
return wrapper
6873

6974

7075
def stream_cache(func):
7176
def wrapper(self, model, messages, stream, tools=None, *args, **kwargs):
72-
cache_key = gen_cache_key(messages, model, tools)
73-
logger.info(f"Stream cache key: {cache_key}")
77+
try:
78+
cache_key = gen_cache_key(messages, model, tools)
79+
except ValueError as e:
80+
logger.error(f"Cache key generation failed: {e}")
81+
result = func(self, model, messages, stream, tools=tools, *args, **kwargs)
82+
return result
7483

7584
redis_client = get_redis_instance()
7685
if redis_client:
@@ -83,21 +92,21 @@ def wrapper(self, model, messages, stream, tools=None, *args, **kwargs):
8392
yield chunk
8493
time.sleep(0.03)
8594
return
86-
except redis.ConnectionError as e:
87-
logger.error(f"Redis connection error: {e}")
95+
except Exception as e:
96+
logger.error(f"Error getting cached stream: {e}")
8897

8998
result = func(self, model, messages, stream, tools=tools, *args, **kwargs)
9099
stream_cache_data = []
91100

92101
for chunk in result:
93-
stream_cache_data.append(chunk)
94102
yield chunk
103+
stream_cache_data.append(str(chunk))
95104

96105
if redis_client:
97106
try:
98107
redis_client.set(cache_key, json.dumps(stream_cache_data), ex=1800)
99108
logger.info(f"Stream cache saved for key: {cache_key}")
100-
except redis.ConnectionError as e:
101-
logger.error(f"Redis connection error: {e}")
109+
except Exception as e:
110+
logger.error(f"Error setting stream cache: {e}")
102111

103112
return wrapper

0 commit comments

Comments
 (0)