aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2023-02-21 14:28:24 +0100
committerAleksandr Nogikh <wp32pw@gmail.com>2023-02-21 14:56:46 +0100
commitec0a9fe91df711eb1b071764328fe746492f0d9e (patch)
tree84f4cb7e878d64471bb63ec071b7123bfadf7602
parent47536162e02e8ba9aadd6e06184cb044f2eb069b (diff)
dashboard: speed up the subsystem filter
Add a new index and give it preference in loadVisibleBugs().
-rw-r--r--dashboard/app/index.yaml6
-rw-r--r--dashboard/app/main.go49
2 files changed, 34 insertions, 21 deletions
diff --git a/dashboard/app/index.yaml b/dashboard/app/index.yaml
index 7382e4bb4..bcadc37e8 100644
--- a/dashboard/app/index.yaml
+++ b/dashboard/app/index.yaml
@@ -112,6 +112,12 @@ indexes:
- name: Status
- name: SubsystemsRev
+- kind: Bug
+ properties:
+ - name: Namespace
+ - name: Tags.Subsystems.Name
+ - name: Status
+
- kind: Build
properties:
- name: Namespace
diff --git a/dashboard/app/main.go b/dashboard/app/main.go
index cbe3ca7df..8fb6ad75b 100644
--- a/dashboard/app/main.go
+++ b/dashboard/app/main.go
@@ -991,7 +991,7 @@ func fetchFixPendingBugs(c context.Context, ns, manager string) ([]*Bug, error)
func fetchNamespaceBugs(c context.Context, accessLevel AccessLevel, ns string,
filter *userBugFilter) ([]*uiBugGroup, error) {
- bugs, err := loadVisibleBugs(c, accessLevel, ns, filter.ManagerName())
+ bugs, err := loadVisibleBugs(c, accessLevel, ns, filter)
if err != nil {
return nil, err
}
@@ -1070,7 +1070,8 @@ func fetchNamespaceBugs(c context.Context, accessLevel AccessLevel, ns string,
return uiGroups, nil
}
-func loadVisibleBugs(c context.Context, accessLevel AccessLevel, ns, manager string) ([]*Bug, error) {
+func loadVisibleBugs(c context.Context, accessLevel AccessLevel, ns string,
+ bugFilter *userBugFilter) ([]*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).
@@ -1081,24 +1082,22 @@ func loadVisibleBugs(c context.Context, accessLevel AccessLevel, ns, manager str
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
+ return applyBugFilter(
+ query.Filter("Namespace=", ns).
+ Filter("Status=", BugStatusDup),
+ bugFilter,
+ )
}
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
+ return applyBugFilter(
+ query.Filter("Namespace=", ns).
+ Filter("Status<", BugStatusFixed),
+ bugFilter,
+ )
}
bugs, _, err := loadAllBugs(c, filter)
if err != nil {
@@ -1113,13 +1112,10 @@ func loadVisibleBugs(c context.Context, accessLevel AccessLevel, ns, manager str
func fetchTerminalBugs(c context.Context, accessLevel AccessLevel,
ns string, typ *TerminalBug, extraBugs []*Bug) (*uiBugGroup, *uiBugStats, error) {
bugs, _, err := loadAllBugs(c, func(query *db.Query) *db.Query {
- query = query.Filter("Namespace=", ns).
- Filter("Status=", typ.Status)
- manager := typ.Filter.ManagerName()
- if manager != "" {
- query = query.Filter("HappenedOn=", manager)
- }
- return query
+ return applyBugFilter(
+ query.Filter("Namespace=", ns).Filter("Status=", typ.Status),
+ typ.Filter,
+ )
})
if err != nil {
return nil, nil, err
@@ -1163,6 +1159,17 @@ func fetchTerminalBugs(c context.Context, accessLevel AccessLevel,
return res, stats, nil
}
+func applyBugFilter(query *db.Query, filter *userBugFilter) *db.Query {
+ manager, subsystem := filter.ManagerName(), filter.Subsystem
+ if subsystem != "" {
+ // Subsystem filter is more granular, so give it priority.
+ query = query.Filter("Tags.Subsystems.Name=", subsystem)
+ } else if manager != "" {
+ query = query.Filter("HappenedOn=", manager)
+ }
+ return query
+}
+
func loadDupsForBug(c context.Context, r *http.Request, bug *Bug, state *ReportingState, managers []string) (
*uiBugGroup, error) {
bugHash := bug.keyHash()