aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2021-03-25 20:01:09 +0100
committerDmitry Vyukov <dvyukov@google.com>2021-03-26 10:07:20 +0100
commita8529b82fb3bb45832b08a099e7eb51707da9b37 (patch)
tree02c85ad9c7b81ccfbb8afeecb4993e16fd494053
parent5f50b260efb9a858ad1a6c5041a8de08fac0f911 (diff)
dashboard/app: speed up main page
We have too many bugs in total now, loading them is very slow. We don't show fixed/invalid bugs on the main page, so don't load them. This requires issuing two separate queries, but it's still much faster than loading all bugs.
-rw-r--r--dashboard/app/index.yaml5
-rw-r--r--dashboard/app/main.go52
2 files changed, 46 insertions, 11 deletions
diff --git a/dashboard/app/index.yaml b/dashboard/app/index.yaml
index eef631a55..607611bc7 100644
--- a/dashboard/app/index.yaml
+++ b/dashboard/app/index.yaml
@@ -21,6 +21,11 @@ indexes:
- kind: Bug
properties:
+ - name: HappenedOn
+ - name: Status
+
+- kind: Bug
+ properties:
- name: Namespace
- name: Title
- name: Seq
diff --git a/dashboard/app/main.go b/dashboard/app/main.go
index a7681c55b..e531b808a 100644
--- a/dashboard/app/main.go
+++ b/dashboard/app/main.go
@@ -553,14 +553,7 @@ func textFilename(tag string) string {
}
func fetchNamespaceBugs(c context.Context, accessLevel AccessLevel, ns, manager string) ([]*uiBugGroup, error) {
- filter := func(query *db.Query) *db.Query {
- query = query.Filter("Namespace=", ns)
- if manager != "" {
- query = query.Filter("HappenedOn=", manager)
- }
- return query
- }
- bugs, _, err := loadAllBugs(c, filter)
+ bugs, err := loadVisibleBugs(c, accessLevel, ns, manager)
if err != nil {
return nil, err
}
@@ -576,9 +569,6 @@ func fetchNamespaceBugs(c context.Context, accessLevel AccessLevel, ns, manager
bugMap := make(map[string]*uiBug)
var dups []*Bug
for _, bug := range bugs {
- if bug.Status == BugStatusFixed || bug.Status == BugStatusInvalid {
- continue
- }
if accessLevel < bug.sanitizeAccess(accessLevel) {
continue
}
@@ -642,6 +632,46 @@ func fetchNamespaceBugs(c context.Context, accessLevel AccessLevel, ns, manager
return uiGroups, nil
}
+func loadVisibleBugs(c context.Context, accessLevel AccessLevel, ns, manager string) ([]*Bug, error) {
+ // Load open and dup bugs in in 2 separate queries.
+ // Ideally we load them in one query with a suitable filter,
+ // but unfortunately status values don't allow one query (<BugStatusFixed || >BugStatusInvalid).
+ // Ideally we also have separate status for "dup of a closed bug" as we don't need to fetch them.
+ // Potentially changing "dup" to "dup of a closed bug" can be done in background.
+ // But 2 queries is still much faster than fetching all bugs and we can do this in parallel.
+ errc := make(chan error)
+ var dups []*Bug
+ go func() {
+ filter := func(query *db.Query) *db.Query {
+ query = query.Filter("Namespace=", ns).
+ Filter("Status=", BugStatusDup)
+ if manager != "" {
+ query = query.Filter("HappenedOn=", manager)
+ }
+ return query
+ }
+ var err error
+ dups, _, err = loadAllBugs(c, filter)
+ errc <- err
+ }()
+ filter := func(query *db.Query) *db.Query {
+ query = query.Filter("Namespace=", ns).
+ Filter("Status<", BugStatusFixed)
+ if manager != "" {
+ query = query.Filter("HappenedOn=", manager)
+ }
+ return query
+ }
+ bugs, _, err := loadAllBugs(c, filter)
+ if err != nil {
+ return nil, err
+ }
+ if err := <-errc; err != nil {
+ return nil, err
+ }
+ return append(bugs, dups...), nil
+}
+
func fetchTerminalBugs(c context.Context, accessLevel AccessLevel,
ns, manager string, typ *TerminalBug) (*uiBugGroup, error) {
bugs, _, err := loadAllBugs(c, func(query *db.Query) *db.Query {