aboutsummaryrefslogtreecommitdiffstats
path: root/modules/cache
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2020-02-02 03:11:32 +0800
committerGitHub <noreply@github.com>2020-02-01 19:11:32 +0000
commitce7062a422777c00aadf43ad67a90cc8aae689a5 (patch)
tree1648064ddb7f8d9e5c6b889bed9147db295cb658 /modules/cache
parent046bb05979b2476d4eef85f2d156ac42310f1a3f (diff)
downloadgitea-ce7062a422777c00aadf43ad67a90cc8aae689a5.tar.gz
gitea-ce7062a422777c00aadf43ad67a90cc8aae689a5.zip
Cache last commit to accelerate the repository directory page visit (#10069)
* Cache last commit to accelerate the repository directory page visit * Default use default cache configuration * add tests for last commit cache * Simplify last commit cache * Revert Enabled back * Change the last commit cache default ttl to 8760h * Fix test
Diffstat (limited to 'modules/cache')
-rw-r--r--modules/cache/cache.go26
-rw-r--r--modules/cache/last_commit.go64
2 files changed, 81 insertions, 9 deletions
diff --git a/modules/cache/cache.go b/modules/cache/cache.go
index 20d23f3b5b..e3a905e3fa 100644
--- a/modules/cache/cache.go
+++ b/modules/cache/cache.go
@@ -16,20 +16,28 @@ import (
_ "gitea.com/macaron/cache/redis"
)
-var conn mc.Cache
+var (
+ conn mc.Cache
+)
+
+func newCache(cacheConfig setting.Cache) (mc.Cache, error) {
+ return mc.NewCacher(cacheConfig.Adapter, mc.Options{
+ Adapter: cacheConfig.Adapter,
+ AdapterConfig: cacheConfig.Conn,
+ Interval: cacheConfig.Interval,
+ })
+}
// NewContext start cache service
func NewContext() error {
- if setting.CacheService == nil || conn != nil {
- return nil
+ var err error
+
+ if conn == nil && setting.CacheService.Enabled {
+ if conn, err = newCache(setting.CacheService.Cache); err != nil {
+ return err
+ }
}
- var err error
- conn, err = mc.NewCacher(setting.CacheService.Adapter, mc.Options{
- Adapter: setting.CacheService.Adapter,
- AdapterConfig: setting.CacheService.Conn,
- Interval: setting.CacheService.Interval,
- })
return err
}
diff --git a/modules/cache/last_commit.go b/modules/cache/last_commit.go
new file mode 100644
index 0000000000..2fd9313bd1
--- /dev/null
+++ b/modules/cache/last_commit.go
@@ -0,0 +1,64 @@
+// Copyright 2020 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package cache
+
+import (
+ "fmt"
+
+ "code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/log"
+
+ mc "gitea.com/macaron/cache"
+ "gopkg.in/src-d/go-git.v4/plumbing/object"
+)
+
+// LastCommitCache represents a cache to store last commit
+type LastCommitCache struct {
+ repoPath string
+ ttl int64
+ repo *git.Repository
+ commitCache map[string]*object.Commit
+ mc.Cache
+}
+
+// NewLastCommitCache creates a new last commit cache for repo
+func NewLastCommitCache(repoPath string, gitRepo *git.Repository, ttl int64) *LastCommitCache {
+ return &LastCommitCache{
+ repoPath: repoPath,
+ repo: gitRepo,
+ commitCache: make(map[string]*object.Commit),
+ ttl: ttl,
+ Cache: conn,
+ }
+}
+
+// Get get the last commit information by commit id and entry path
+func (c LastCommitCache) Get(ref, entryPath string) (*object.Commit, error) {
+ v := c.Cache.Get(fmt.Sprintf("last_commit:%s:%s:%s", c.repoPath, ref, entryPath))
+ if vs, ok := v.(string); ok {
+ log.Trace("LastCommitCache hit level 1: [%s:%s:%s]", ref, entryPath, vs)
+ if commit, ok := c.commitCache[vs]; ok {
+ log.Trace("LastCommitCache hit level 2: [%s:%s:%s]", ref, entryPath, vs)
+ return commit, nil
+ }
+ id, err := c.repo.ConvertToSHA1(vs)
+ if err != nil {
+ return nil, err
+ }
+ commit, err := c.repo.GoGitRepo().CommitObject(id)
+ if err != nil {
+ return nil, err
+ }
+ c.commitCache[vs] = commit
+ return commit, nil
+ }
+ return nil, nil
+}
+
+// Put put the last commit id with commit and entry path
+func (c LastCommitCache) Put(ref, entryPath, commitID string) error {
+ log.Trace("LastCommitCache save: [%s:%s:%s]", ref, entryPath, commitID)
+ return c.Cache.Put(fmt.Sprintf("last_commit:%s:%s:%s", c.repoPath, ref, entryPath), commitID, c.ttl)
+}