fix: invalidate request level cache on settings update instead of turning off cache for requests

This commit is contained in:
Andrii V 2025-08-08 18:07:27 +02:00
parent ae72335b5d
commit 5f4d428379
3 changed files with 12 additions and 3 deletions

View file

@ -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}"

View file

@ -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"))

View file

@ -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()