diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2020-02-02 03:11:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-01 19:11:32 +0000 |
commit | ce7062a422777c00aadf43ad67a90cc8aae689a5 (patch) | |
tree | 1648064ddb7f8d9e5c6b889bed9147db295cb658 /modules/cache | |
parent | 046bb05979b2476d4eef85f2d156ac42310f1a3f (diff) | |
download | gitea-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.go | 26 | ||||
-rw-r--r-- | modules/cache/last_commit.go | 64 |
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) +} |