Merge pull request !2798 from rhodecode-enterprise-ce fix/vcs-settings-cache-bug-1

fix: cache issue with vcs settings not updating correctly to reflect db values
This commit is contained in:
Andrii Verbytskyi 2025-08-08 17:39:27 +00:00
commit 9a67f0f0b8
3 changed files with 50 additions and 0 deletions

View file

@ -315,6 +315,49 @@ class TestAdminSettingsVcs(object):
setting = SettingsModel().get_setting_by_name(setting_key)
assert setting.app_settings_value is new_value
def test_vcs_settings_cache_invalidation(self, form_defaults, csrf_token):
from rhodecode.apps.admin.views.settings import AdminSettingsView
# Test settings that were bugged
settings_to_test = {
"pr_merge_enabled": False,
"diff_cache": True,
"auto_merge_enabled": False,
}
# Also test some UI setting for comparison, those worked fine
ui_settings_to_test = {
"hooks_changegroup_repo_size": True,
}
# Update form with new values
for setting_key, new_value in settings_to_test.items():
form_defaults[f"rhodecode_{setting_key}"] = str(new_value).lower()
for ui_key, new_value in ui_settings_to_test.items():
form_defaults[ui_key] = str(new_value).lower()
form_defaults["csrf_token"] = csrf_token
# Submit the form and follow redirect
response = self.app.post(route_path("admin_settings_vcs_update"), params=form_defaults, status=302)
_ = response.follow()
# Check db has correct values
for setting_key, expected_value in settings_to_test.items():
setting = SettingsModel().get_setting_by_name(setting_key)
assert setting.app_settings_value is expected_value
# Make sure cache invalidation 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}"
actual_value = fresh_defaults.get(form_key)
assert actual_value is expected_value
for ui_key, expected_value in ui_settings_to_test.items():
actual_value = fresh_defaults.get(ui_key)
assert actual_value is expected_value
@pytest.fixture()
def disable_sql_cache(self, request):
# patch _do_orm_execute so it returns None similar like if we don't use a cached query

View file

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