From ec0a9fe91df711eb1b071764328fe746492f0d9e Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Tue, 21 Feb 2023 14:28:24 +0100 Subject: dashboard: speed up the subsystem filter Add a new index and give it preference in loadVisibleBugs(). --- dashboard/app/index.yaml | 6 ++++++ dashboard/app/main.go | 49 +++++++++++++++++++++++++++--------------------- 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 (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() -- cgit mrf-deployment