From 5f4d428379484ab299b6849587455c3e0eef73fc Mon Sep 17 00:00:00 2001 From: Andrii V Date: Fri, 8 Aug 2025 18:07:27 +0200 Subject: [PATCH] fix: invalidate request level cache on settings update instead of turning off cache for requests --- rhodecode/apps/admin/tests/test_admin_settings.py | 6 ++++-- rhodecode/apps/admin/views/settings.py | 3 ++- rhodecode/model/settings.py | 6 ++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/rhodecode/apps/admin/tests/test_admin_settings.py b/rhodecode/apps/admin/tests/test_admin_settings.py index 53da9754..738dc9ea 100644 --- a/rhodecode/apps/admin/tests/test_admin_settings.py +++ b/rhodecode/apps/admin/tests/test_admin_settings.py @@ -341,8 +341,9 @@ class TestAdminSettingsVcs(object): form_defaults["csrf_token"] = csrf_token - # Submit the form - self.app.post(route_path("admin_settings_vcs_update"), params=form_defaults, status=302) + # Submit the form - this should trigger proper cache invalidation + response = self.app.post(route_path("admin_settings_vcs_update"), params=form_defaults, status=302) + response = response.follow() # Check db has correct values for setting_key, expected_value in settings_to_test.items(): @@ -350,6 +351,7 @@ class TestAdminSettingsVcs(object): assert setting.app_settings_value is expected_value # Check form defaults should show fresh values (not cached stale ones) + # This tests that our cache invalidation properly clears both database and request cache fresh_defaults = AdminSettingsView._form_defaults() for setting_key, expected_value in settings_to_test.items(): form_key = f"rhodecode_{setting_key}" diff --git a/rhodecode/apps/admin/views/settings.py b/rhodecode/apps/admin/views/settings.py index 94bddec7..28c02bad 100644 --- a/rhodecode/apps/admin/views/settings.py +++ b/rhodecode/apps/admin/views/settings.py @@ -106,7 +106,7 @@ class AdminSettingsView(BaseAppView): @classmethod def _form_defaults(cls): - defaults = SettingsModel().get_all_settings(from_request=False) + defaults = SettingsModel().get_all_settings() defaults.update(cls._get_ui_settings()) defaults.update( @@ -178,6 +178,7 @@ class AdminSettingsView(BaseAppView): h.flash(_("Error occurred during updating application settings"), category="error") else: Session().commit() + SettingsModel().invalidate_settings_cache() h.flash(_("Updated VCS settings"), category="success") raise HTTPFound(h.route_path("admin_settings_vcs")) diff --git a/rhodecode/model/settings.py b/rhodecode/model/settings.py index 3e1099ff..3d773a30 100644 --- a/rhodecode/model/settings.py +++ b/rhodecode/model/settings.py @@ -222,6 +222,12 @@ class SettingsModel(BaseModel): # we use hard cleanup if invalidation is sent rc_cache.clear_cache_namespace(region, namespace_key, method=rc_cache.CLEAR_DELETE) + # Also clear request-level cache + request = get_current_request() + if request and hasattr(request, "call_context") and hasattr(request.call_context, "rc_config"): + log.debug("Clearing request-level settings cache") + delattr(request.call_context, "rc_config") + def get_cache_call_method(self, cache=True): region, cache_key = self.get_cache_region()