aboutsummaryrefslogtreecommitdiffstats
path: root/models/user
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2022-11-10 14:43:53 +0800
committerGitHub <noreply@github.com>2022-11-10 14:43:53 +0800
commit385462d36c75e809ee082d3432941f938cbdffc9 (patch)
tree938946297d1c0fa736852e1054f732ed2b0db686 /models/user
parentce5aafbc698de72d8acf03851dc5db057b3cc01f (diff)
downloadgitea-385462d36c75e809ee082d3432941f938cbdffc9.tar.gz
gitea-385462d36c75e809ee082d3432941f938cbdffc9.zip
Fix dashboard ignored system setting cache (#21621)
This is a performance regression from #18058 Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: Andrew Thornton <art27@cantab.net>
Diffstat (limited to 'models/user')
-rw-r--r--models/user/avatar.go6
-rw-r--r--models/user/setting.go36
-rw-r--r--models/user/setting_test.go2
3 files changed, 34 insertions, 10 deletions
diff --git a/models/user/avatar.go b/models/user/avatar.go
index f73ac56c5e..102206f3a2 100644
--- a/models/user/avatar.go
+++ b/models/user/avatar.go
@@ -68,11 +68,9 @@ func (u *User) AvatarLinkWithSize(size int) string {
useLocalAvatar := false
autoGenerateAvatar := false
- var disableGravatar bool
disableGravatarSetting, _ := system_model.GetSetting(system_model.KeyPictureDisableGravatar)
- if disableGravatarSetting != nil {
- disableGravatar = disableGravatarSetting.GetValueBool()
- }
+
+ disableGravatar := disableGravatarSetting.GetValueBool()
switch {
case u.UseCustomAvatar:
diff --git a/models/user/setting.go b/models/user/setting.go
index 5fe7c2ec23..896f3c8da1 100644
--- a/models/user/setting.go
+++ b/models/user/setting.go
@@ -10,6 +10,7 @@ import (
"strings"
"code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/modules/cache"
"xorm.io/builder"
)
@@ -47,9 +48,25 @@ func IsErrUserSettingIsNotExist(err error) bool {
return ok
}
-// GetSetting returns specific setting
+// genSettingCacheKey returns the cache key for some configuration
+func genSettingCacheKey(userID int64, key string) string {
+ return fmt.Sprintf("user_%d.setting.%s", userID, key)
+}
+
+// GetSetting returns the setting value via the key
func GetSetting(uid int64, key string) (*Setting, error) {
- v, err := GetUserSettings(uid, []string{key})
+ return cache.Get(genSettingCacheKey(uid, key), func() (*Setting, error) {
+ res, err := GetSettingNoCache(uid, key)
+ if err != nil {
+ return nil, err
+ }
+ return res, nil
+ })
+}
+
+// GetSettingNoCache returns specific setting without using the cache
+func GetSettingNoCache(uid int64, key string) (*Setting, error) {
+ v, err := GetSettings(uid, []string{key})
if err != nil {
return nil, err
}
@@ -59,8 +76,8 @@ func GetSetting(uid int64, key string) (*Setting, error) {
return v[key], nil
}
-// GetUserSettings returns specific settings from user
-func GetUserSettings(uid int64, keys []string) (map[string]*Setting, error) {
+// GetSettings returns specific settings from user
+func GetSettings(uid int64, keys []string) (map[string]*Setting, error) {
settings := make([]*Setting, 0, len(keys))
if err := db.GetEngine(db.DefaultContext).
Where("user_id=?", uid).
@@ -105,6 +122,7 @@ func GetUserSetting(userID int64, key string, def ...string) (string, error) {
if err := validateUserSettingKey(key); err != nil {
return "", err
}
+
setting := &Setting{UserID: userID, SettingKey: key}
has, err := db.GetEngine(db.DefaultContext).Get(setting)
if err != nil {
@@ -124,7 +142,10 @@ func DeleteUserSetting(userID int64, key string) error {
if err := validateUserSettingKey(key); err != nil {
return err
}
+
+ cache.Remove(genSettingCacheKey(userID, key))
_, err := db.GetEngine(db.DefaultContext).Delete(&Setting{UserID: userID, SettingKey: key})
+
return err
}
@@ -133,7 +154,12 @@ func SetUserSetting(userID int64, key, value string) error {
if err := validateUserSettingKey(key); err != nil {
return err
}
- return upsertUserSettingValue(userID, key, value)
+
+ _, err := cache.Set(genSettingCacheKey(userID, key), func() (string, error) {
+ return value, upsertUserSettingValue(userID, key, value)
+ })
+
+ return err
}
func upsertUserSettingValue(userID int64, key, value string) error {
diff --git a/models/user/setting_test.go b/models/user/setting_test.go
index f0083038df..5a772a8ce7 100644
--- a/models/user/setting_test.go
+++ b/models/user/setting_test.go
@@ -27,7 +27,7 @@ func TestSettings(t *testing.T) {
assert.NoError(t, err)
// get specific setting
- settings, err := user_model.GetUserSettings(99, []string{keyName})
+ settings, err := user_model.GetSettings(99, []string{keyName})
assert.NoError(t, err)
assert.Len(t, settings, 1)
assert.EqualValues(t, newSetting.SettingValue, settings[keyName].SettingValue)