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:
commit
9a67f0f0b8
3 changed files with 50 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue