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:
Jennifer Richards 2023-06-06 16:35:41 -03:00 committed by GitHub
parent 8401291e34
commit edd72826e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 3 deletions

View file

@ -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
View 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