Просмотр исходного кода

Fixes #21254: Fix release check failure when stale `latest_release` cache can't be unpickled (#21282)

* fix(misc): Handle cache unpickling failure in release check

Guard `cache.get('latest_release')` during release checks to prevent a
500 when stale cached data can't be unpickled after dependency upgrades.
On failure, log at debug level and delete the affected cache key.

Fixes #21254

* Correct comment

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
Martin Hauser 2 недель назад
Родитель
Сommit
2a0f26623b
1 измененных файлов с 11 добавлено и 1 удалено
  1. 11 1
      netbox/netbox/views/misc.py

+ 11 - 1
netbox/netbox/views/misc.py

@@ -1,5 +1,6 @@
 import re
 import re
 from collections import namedtuple
 from collections import namedtuple
+import logging
 
 
 from django.conf import settings
 from django.conf import settings
 from django.contrib import messages
 from django.contrib import messages
@@ -28,6 +29,8 @@ __all__ = (
     'SearchView',
     'SearchView',
 )
 )
 
 
+logger = logging.getLogger(f'netbox.{__name__}')
+
 Link = namedtuple('Link', ('label', 'viewname', 'permission', 'count'))
 Link = namedtuple('Link', ('label', 'viewname', 'permission', 'count'))
 
 
 
 
@@ -50,7 +53,14 @@ class HomeView(ConditionalLoginRequiredMixin, View):
         # Check whether a new release is available. (Only for superusers.)
         # Check whether a new release is available. (Only for superusers.)
         new_release = None
         new_release = None
         if request.user.is_superuser:
         if request.user.is_superuser:
-            latest_release = cache.get('latest_release')
+            # cache.get() can raise an exception if the cached value can't be unpickled after dependency upgrades
+            try:
+                latest_release = cache.get('latest_release')
+            except Exception:
+                logger.debug("Failed to read 'latest_release' from cache; deleting key", exc_info=True)
+                cache.delete('latest_release')
+                latest_release = None
+
             if latest_release:
             if latest_release:
                 release_version, release_url = latest_release
                 release_version, release_url = latest_release
                 if release_version > version.parse(settings.RELEASE.version):
                 if release_version > version.parse(settings.RELEASE.version):