fix: Prevent errors when memcached object size is exceeded (#5769)
* feat: Subclass PyMemcacheCache to tolerate too-large object errors * fix: Use LenientMemcacheCache to prevent search errors * fix: Re-raise errors other than "object too large"
This commit is contained in:
parent
8401291e34
commit
edd72826e6
|
@ -729,13 +729,13 @@ CACHE_MIDDLEWARE_KEY_PREFIX = ''
|
|||
# This setting is possibly overridden further down, after the import of settings_local
|
||||
CACHES = {
|
||||
'default': {
|
||||
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
|
||||
'BACKEND': 'ietf.utils.cache.LenientMemcacheCache',
|
||||
'LOCATION': '127.0.0.1:11211',
|
||||
'VERSION': __version__,
|
||||
'KEY_PREFIX': 'ietf:dt',
|
||||
},
|
||||
'sessions': {
|
||||
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
|
||||
'BACKEND': 'ietf.utils.cache.LenientMemcacheCache',
|
||||
'LOCATION': '127.0.0.1:11211',
|
||||
# No release-specific VERSION setting.
|
||||
'KEY_PREFIX': 'ietf:dt',
|
||||
|
@ -1242,7 +1242,7 @@ if SERVER_MODE != 'production':
|
|||
CACHES = {
|
||||
'default': {
|
||||
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
|
||||
#'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
|
||||
#'BACKEND': 'ietf.utils.cache.LenientMemcacheCache',
|
||||
#'LOCATION': '127.0.0.1:11211',
|
||||
#'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
|
||||
'VERSION': __version__,
|
||||
|
|
19
ietf/utils/cache.py
Normal file
19
ietf/utils/cache.py
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Copyright The IETF Trust 2023, All Rights Reserved
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.core.cache.backends.memcached import PyMemcacheCache
|
||||
from pymemcache.exceptions import MemcacheServerError
|
||||
|
||||
from .log import log
|
||||
|
||||
|
||||
class LenientMemcacheCache(PyMemcacheCache):
|
||||
"""PyMemcacheCache backend that tolerates failed inserts due to object size"""
|
||||
def set(self, key, value, timeout=None, version=None):
|
||||
try:
|
||||
super().set(key, value, timeout, version)
|
||||
except MemcacheServerError as err:
|
||||
if "object too large for cache" in str(err):
|
||||
log(f"Memcache failed to cache large object for {key}")
|
||||
else:
|
||||
raise
|
Loading…
Reference in a new issue