From a320df9926d304718ba1ca3f9a51ce813b0219a2 Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Fri, 23 Jan 2026 18:02:02 +0100 Subject: [PATCH] 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 --- netbox/netbox/views/misc.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/views/misc.py b/netbox/netbox/views/misc.py index 4537f14c9..9e4f7e8d2 100644 --- a/netbox/netbox/views/misc.py +++ b/netbox/netbox/views/misc.py @@ -1,5 +1,6 @@ import re from collections import namedtuple +import logging from django.conf import settings from django.contrib import messages @@ -28,6 +29,8 @@ __all__ = ( 'SearchView', ) +logger = logging.getLogger(f'netbox.{__name__}') + 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.) new_release = None if request.user.is_superuser: - latest_release = cache.get('latest_release') + # cache.get() can raise 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: release_version, release_url = latest_release if release_version > version.parse(settings.RELEASE.version):