Skip to content

Commit 363c123

Browse files
6543delvhsilverwind
authored
1 parent 4b6eb46 commit 363c123

File tree

8 files changed

+119
-27
lines changed

8 files changed

+119
-27
lines changed

modules/cache/cache.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package cache
55

66
import (
7+
"fmt"
78
"strconv"
89
"time"
910

@@ -35,6 +36,37 @@ func Init() error {
3536
return nil
3637
}
3738

39+
const (
40+
testCacheKey = "DefaultCache.TestKey"
41+
SlowCacheThreshold = 100 * time.Microsecond
42+
)
43+
44+
func Test() (time.Duration, error) {
45+
if defaultCache == nil {
46+
return 0, fmt.Errorf("default cache not initialized")
47+
}
48+
49+
testData := fmt.Sprintf("%x", make([]byte, 500))
50+
51+
start := time.Now()
52+
53+
if err := defaultCache.Delete(testCacheKey); err != nil {
54+
return 0, fmt.Errorf("expect cache to delete data based on key if exist but got: %w", err)
55+
}
56+
if err := defaultCache.Put(testCacheKey, testData, 10); err != nil {
57+
return 0, fmt.Errorf("expect cache to store data but got: %w", err)
58+
}
59+
testVal, hit := defaultCache.Get(testCacheKey)
60+
if !hit {
61+
return 0, fmt.Errorf("expect cache hit but got none")
62+
}
63+
if testVal != testData {
64+
return 0, fmt.Errorf("expect cache to return same value as stored but got other")
65+
}
66+
67+
return time.Since(start), nil
68+
}
69+
3870
// GetCache returns the currently configured cache
3971
func GetCache() StringCache {
4072
return defaultCache

modules/cache/cache_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ func TestNewContext(t *testing.T) {
3434
assert.Nil(t, con)
3535
}
3636

37+
func TestTest(t *testing.T) {
38+
defaultCache = nil
39+
_, err := Test()
40+
assert.Error(t, err)
41+
42+
createTestCache()
43+
elapsed, err := Test()
44+
assert.NoError(t, err)
45+
// mem cache should take from 300ns up to 1ms on modern hardware ...
46+
assert.Less(t, elapsed, SlowCacheThreshold)
47+
}
48+
3749
func TestGetCache(t *testing.T) {
3850
createTestCache()
3951

options/locale/locale_en-US.ini

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ remove_all = Remove All
9393
remove_label_str = Remove item "%s"
9494
edit = Edit
9595
view = View
96+
test = Test
9697

9798
enabled = Enabled
9899
disabled = Disabled
@@ -3225,6 +3226,10 @@ config.cache_adapter = Cache Adapter
32253226
config.cache_interval = Cache Interval
32263227
config.cache_conn = Cache Connection
32273228
config.cache_item_ttl = Cache Item TTL
3229+
config.cache_test = Test Cache
3230+
config.cache_test_failed = Failed to probe the cache: %v.
3231+
config.cache_test_slow = Cache test successful, but response is slow: %s.
3232+
config.cache_test_succeeded = Cache test successful, got a response in %s.
32283233

32293234
config.session_config = Session Configuration
32303235
config.session_provider = Session Provider

routers/web/admin/admin.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
activities_model "code.gitea.io/gitea/models/activities"
1616
"code.gitea.io/gitea/models/db"
1717
"code.gitea.io/gitea/modules/base"
18+
"code.gitea.io/gitea/modules/cache"
1819
"code.gitea.io/gitea/modules/graceful"
1920
"code.gitea.io/gitea/modules/httplib"
2021
"code.gitea.io/gitea/modules/json"
@@ -222,6 +223,14 @@ func SelfCheck(ctx *context.Context) {
222223

223224
ctx.Data["DatabaseCheckHasProblems"] = hasProblem
224225
}
226+
227+
elapsed, err := cache.Test()
228+
if err != nil {
229+
ctx.Data["CacheError"] = err
230+
} else if elapsed > cache.SlowCacheThreshold {
231+
ctx.Data["CacheSlow"] = fmt.Sprint(elapsed)
232+
}
233+
225234
ctx.HTML(http.StatusOK, tplSelfCheck)
226235
}
227236

routers/web/admin/config.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
system_model "code.gitea.io/gitea/models/system"
1414
"code.gitea.io/gitea/modules/base"
15+
"code.gitea.io/gitea/modules/cache"
1516
"code.gitea.io/gitea/modules/git"
1617
"code.gitea.io/gitea/modules/json"
1718
"code.gitea.io/gitea/modules/log"
@@ -42,6 +43,22 @@ func SendTestMail(ctx *context.Context) {
4243
ctx.Redirect(setting.AppSubURL + "/admin/config")
4344
}
4445

46+
// TestCache test the cache settings
47+
func TestCache(ctx *context.Context) {
48+
elapsed, err := cache.Test()
49+
if err != nil {
50+
ctx.Flash.Error(ctx.Tr("admin.config.cache_test_failed", err))
51+
} else {
52+
if elapsed > cache.SlowCacheThreshold {
53+
ctx.Flash.Warning(ctx.Tr("admin.config.cache_test_slow", elapsed))
54+
} else {
55+
ctx.Flash.Info(ctx.Tr("admin.config.cache_test_succeeded", elapsed))
56+
}
57+
}
58+
59+
ctx.Redirect(setting.AppSubURL + "/admin/config")
60+
}
61+
4562
func shadowPasswordKV(cfgItem, splitter string) string {
4663
fields := strings.Split(cfgItem, splitter)
4764
for i := 0; i < len(fields); i++ {

routers/web/web.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,7 @@ func registerRoutes(m *web.Route) {
692692
m.Get("", admin.Config)
693693
m.Post("", admin.ChangeConfig)
694694
m.Post("/test_mail", admin.SendTestMail)
695+
m.Post("/test_cache", admin.TestCache)
695696
m.Get("/settings", admin.ConfigSettings)
696697
})
697698

templates/admin/config.tmpl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@
229229
<dt>{{ctx.Locale.Tr "admin.config.mailer_user"}}</dt>
230230
<dd>{{if .Mailer.User}}{{.Mailer.User}}{{else}}(empty){{end}}</dd>
231231
<div class="divider"></div>
232-
<dt class="tw-py-1">{{ctx.Locale.Tr "admin.config.send_test_mail"}}</dt>
233-
<dd>
232+
<dt class="tw-py-1 tw-flex tw-items-center">{{ctx.Locale.Tr "admin.config.send_test_mail"}}</dt>
233+
<dd class="tw-py-0">
234234
<form class="ui form ignore-dirty" action="{{AppSubUrl}}/admin/config/test_mail" method="post">
235235
{{.CsrfTokenHtml}}
236236
<div class="ui tiny input">
@@ -260,6 +260,14 @@
260260
<dt>{{ctx.Locale.Tr "admin.config.cache_item_ttl"}}</dt>
261261
<dd><code>{{.CacheItemTTL}}</code></dd>
262262
{{end}}
263+
<div class="divider"></div>
264+
<dt class="tw-py-1 tw-flex tw-items-center">{{ctx.Locale.Tr "admin.config.cache_test"}}</dt>
265+
<dd class="tw-py-0">
266+
<form class="ui form ignore-dirty" action="{{AppSubUrl}}/admin/config/test_cache" method="post">
267+
{{.CsrfTokenHtml}}
268+
<button class="ui tiny primary button">{{ctx.Locale.Tr "test"}}</button>
269+
</form>
270+
</dd>
263271
</dl>
264272
</div>
265273

templates/admin/self_check.tmpl

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,40 @@
1717
<div class="ui attached segment tw-hidden self-check-problem" id="self-check-by-frontend"></div>
1818

1919
{{if .DatabaseCheckHasProblems}}
20-
<div class="ui attached segment self-check-problem">
21-
{{if .DatabaseType.IsMySQL}}
22-
<div class="tw-p-2">{{ctx.Locale.Tr "admin.self_check.database_fix_mysql"}}</div>
23-
{{else if .DatabaseType.IsMSSQL}}
24-
<div class="tw-p-2">{{ctx.Locale.Tr "admin.self_check.database_fix_mssql"}}</div>
25-
{{end}}
26-
{{if .DatabaseCheckCollationMismatch}}
27-
<div class="ui red message">{{ctx.Locale.Tr "admin.self_check.database_collation_mismatch" .DatabaseCheckResult.ExpectedCollation}}</div>
28-
{{end}}
29-
{{if .DatabaseCheckCollationCaseInsensitive}}
30-
<div class="ui warning message">{{ctx.Locale.Tr "admin.self_check.database_collation_case_insensitive" .DatabaseCheckResult.DatabaseCollation}}</div>
31-
{{end}}
32-
{{if .DatabaseCheckInconsistentCollationColumns}}
33-
<div class="ui red message">
34-
<details>
35-
<summary>{{ctx.Locale.Tr "admin.self_check.database_inconsistent_collation_columns" .DatabaseCheckResult.DatabaseCollation}}</summary>
36-
<ul class="tw-w-full">
37-
{{range .DatabaseCheckInconsistentCollationColumns}}
38-
<li>{{.}}</li>
39-
{{end}}
40-
</ul>
41-
</details>
42-
</div>
43-
{{end}}
44-
</div>
20+
<div class="ui attached segment self-check-problem">
21+
{{if .DatabaseType.IsMySQL}}
22+
<div class="tw-p-2">{{ctx.Locale.Tr "admin.self_check.database_fix_mysql"}}</div>
23+
{{else if .DatabaseType.IsMSSQL}}
24+
<div class="tw-p-2">{{ctx.Locale.Tr "admin.self_check.database_fix_mssql"}}</div>
25+
{{end}}
26+
{{if .DatabaseCheckCollationMismatch}}
27+
<div class="ui red message">{{ctx.Locale.Tr "admin.self_check.database_collation_mismatch" .DatabaseCheckResult.ExpectedCollation}}</div>
28+
{{end}}
29+
{{if .DatabaseCheckCollationCaseInsensitive}}
30+
<div class="ui warning message">{{ctx.Locale.Tr "admin.self_check.database_collation_case_insensitive" .DatabaseCheckResult.DatabaseCollation}}</div>
31+
{{end}}
32+
{{if .DatabaseCheckInconsistentCollationColumns}}
33+
<div class="ui red message">
34+
<details>
35+
<summary>{{ctx.Locale.Tr "admin.self_check.database_inconsistent_collation_columns" .DatabaseCheckResult.DatabaseCollation}}</summary>
36+
<ul class="tw-w-full">
37+
{{range .DatabaseCheckInconsistentCollationColumns}}
38+
<li>{{.}}</li>
39+
{{end}}
40+
</ul>
41+
</details>
42+
</div>
43+
{{end}}
44+
</div>
4545
{{end}}
46+
47+
{{if .CacheError}}
48+
<div class="ui red message">{{ctx.Locale.Tr "admin.config.cache_test_failed" .CacheError}}</div>
49+
{{end}}
50+
{{if .CacheSlow}}
51+
<div class="ui warning message">{{ctx.Locale.Tr "admin.config.cache_test_slow" .CacheSlow}}</div>
52+
{{end}}
53+
4654
{{/* only shown when there is no visible "self-check-problem" */}}
4755
<div class="ui attached segment tw-hidden self-check-no-problem">
4856
{{ctx.Locale.Tr "admin.self_check.no_problem_found"}}

0 commit comments

Comments
 (0)