aboutsummaryrefslogtreecommitdiffstats
path: root/dashboard/app
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2023-10-25 15:32:15 +0200
committerTaras Madan <tarasmadan@google.com>2023-10-25 13:57:32 +0000
commit72e794c46fcfe059006cd6efdf2f6f315a71ff56 (patch)
tree1706ce350770aeae4f3940d9384698d7220c1876 /dashboard/app
parent17e6d52686f8a56935991f1b066798279f76504a (diff)
dashboard: cache per-ns manager lists
The query may take up to 100ms in some cases, while the result changes on quite rare occasions. Let's use a cached version of the data when rendering UI pages. We don't need extra tests because it's already excercised in existing tests that trigger web endpoints.
Diffstat (limited to 'dashboard/app')
-rw-r--r--dashboard/app/api.go1
-rw-r--r--dashboard/app/cache.go28
-rw-r--r--dashboard/app/main.go8
3 files changed, 33 insertions, 4 deletions
diff --git a/dashboard/app/api.go b/dashboard/app/api.go
index a51a2328e..2dce92d55 100644
--- a/dashboard/app/api.go
+++ b/dashboard/app/api.go
@@ -642,6 +642,7 @@ func bugNeedsCommitUpdate(c context.Context, bug *Bug, manager string, fixCommit
return true
}
+// Note: if you do not need the latest data, prefer CachedManagersList().
func managerList(c context.Context, ns string) ([]string, error) {
var builds []*Build
_, err := db.NewQuery("Build").
diff --git a/dashboard/app/cache.go b/dashboard/app/cache.go
index 4e77d55cf..f52cf5d11 100644
--- a/dashboard/app/cache.go
+++ b/dashboard/app/cache.go
@@ -206,3 +206,31 @@ func minuteCacheNsUpdate(c context.Context, ns string) error {
}
return nil
}
+
+func CachedManagerList(c context.Context, ns string) ([]string, error) {
+ key := fmt.Sprintf("%s-managers-list", ns)
+
+ // Check if the object is in cache.
+ list := []string{}
+ _, err := memcache.Gob.Get(c, key, &list)
+ if err == nil {
+ return list, nil
+ } else if err != memcache.ErrCacheMiss {
+ return nil, err
+ }
+
+ // Update cache.
+ list, err = managerList(c, ns)
+ if err != nil {
+ return nil, err
+ }
+ item := &memcache.Item{
+ Key: key,
+ Object: list,
+ Expiration: time.Minute,
+ }
+ if err := memcache.Gob.Set(c, item); err != nil {
+ return nil, err
+ }
+ return list, nil
+}
diff --git a/dashboard/app/main.go b/dashboard/app/main.go
index 18e43a897..4b525b694 100644
--- a/dashboard/app/main.go
+++ b/dashboard/app/main.go
@@ -958,7 +958,7 @@ func handleBug(c context.Context, w http.ResponseWriter, r *http.Request) error
if err != nil {
return err
}
- managers, err := managerList(c, bug.Namespace)
+ managers, err := CachedManagerList(c, bug.Namespace)
if err != nil {
return err
}
@@ -1517,7 +1517,7 @@ func fetchNamespaceBugs(c context.Context, accessLevel AccessLevel, ns string,
if err != nil {
return nil, err
}
- managers, err := managerList(c, ns)
+ managers, err := CachedManagerList(c, ns)
if err != nil {
return nil, err
}
@@ -1652,7 +1652,7 @@ func fetchTerminalBugs(c context.Context, accessLevel AccessLevel,
if err != nil {
return nil, nil, err
}
- managers, err := managerList(c, ns)
+ managers, err := CachedManagerList(c, ns)
if err != nil {
return nil, nil, err
}
@@ -1744,7 +1744,7 @@ func loadSimilarBugsUI(c context.Context, r *http.Request, bug *Bug, state *Repo
continue
}
if managers[similar.Namespace] == nil {
- mgrs, err := managerList(c, similar.Namespace)
+ mgrs, err := CachedManagerList(c, similar.Namespace)
if err != nil {
return nil, err
}