aboutsummaryrefslogtreecommitdiffstats
path: root/dashboard
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2021-03-01 19:58:43 +0100
committerDmitry Vyukov <dvyukov@google.com>2021-03-01 20:24:58 +0100
commitad8757692b20b95fec397f8fe27d94cdaa83c66d (patch)
tree31465fcfc11daf86a94bdf38796c877486b953bd /dashboard
parent4c37c133e4bf703d023995535f1e264d8658e08e (diff)
dashboard/app: add helper function to update bug titles
updateBugTitles adds missing MergedTitles/AltTitles to bugs. This can be used to migrate datastore to the new scheme introduced: by commit fd1036219797 ("dashboard/app: merge duplicate crashes"). Update #1575
Diffstat (limited to 'dashboard')
-rw-r--r--dashboard/app/admin.go80
1 files changed, 53 insertions, 27 deletions
diff --git a/dashboard/app/admin.go b/dashboard/app/admin.go
index 8062d1881..052599805 100644
--- a/dashboard/app/admin.go
+++ b/dashboard/app/admin.go
@@ -142,50 +142,76 @@ func updateBugReporting(c context.Context, w http.ResponseWriter, r *http.Reques
}
log.Warningf(c, "fetched %v bugs for namespce %v", len(bugs), ns)
cfg := config.Namespaces[ns]
- transform := func(bug *Bug, index int) {
- createBugReporting(bug, cfg)
- }
- var batchKeys []*db.Key
- const batchSize = 20
+ var update []*db.Key
for i, bug := range bugs {
if len(bug.Reporting) >= len(cfg.Reporting) {
continue
}
- batchKeys = append(batchKeys, keys[i])
- if len(batchKeys) == batchSize {
- if err := updateBugBatch(c, batchKeys, transform); err != nil {
- return err
- }
- batchKeys = nil
- }
+ update = append(update, keys[i])
}
- if len(batchKeys) != 0 {
- if err := updateBugBatch(c, batchKeys, transform); err != nil {
- return err
+ return updateBugBatch(c, update, func(bug *Bug) {
+ createBugReporting(bug, cfg)
+ })
+}
+
+// updateBugTitles adds missing MergedTitles/AltTitles to bugs.
+// This can be used to migrate datastore to the new scheme introduced:
+// by commit fd1036219797 ("dashboard/app: merge duplicate crashes").
+func updateBugTitles(c context.Context, w http.ResponseWriter, r *http.Request) error {
+ if accessLevel(c, r) != AccessAdmin {
+ return fmt.Errorf("admin only")
+ }
+ var keys []*db.Key
+ if err := foreachBug(c, nil, func(bug *Bug, key *db.Key) error {
+ if len(bug.MergedTitles) == 0 || len(bug.AltTitles) == 0 {
+ keys = append(keys, key)
}
+ return nil
+ }); err != nil {
+ return err
}
- return nil
+ log.Warningf(c, "fetched %v bugs for update", len(keys))
+ return updateBugBatch(c, keys, func(bug *Bug) {
+ if len(bug.MergedTitles) == 0 {
+ bug.MergedTitles = []string{bug.Title}
+ }
+ if len(bug.AltTitles) == 0 {
+ bug.AltTitles = []string{bug.Title}
+ }
+ })
}
-func updateBugBatch(c context.Context, keys []*db.Key, transform func(bug *Bug, index int)) error {
- tx := func(c context.Context) error {
- bugs := make([]*Bug, len(keys))
- if err := db.GetMulti(c, keys, bugs); err != nil {
+func updateBugBatch(c context.Context, keys []*db.Key, transform func(bug *Bug)) error {
+ for len(keys) != 0 {
+ batchSize := 20
+ if batchSize > len(keys) {
+ batchSize = len(keys)
+ }
+ batchKeys := keys[:batchSize]
+ keys = keys[batchSize:]
+
+ tx := func(c context.Context) error {
+ bugs := make([]*Bug, len(batchKeys))
+ if err := db.GetMulti(c, batchKeys, bugs); err != nil {
+ return err
+ }
+ for _, bug := range bugs {
+ transform(bug)
+ }
+ _, err := db.PutMulti(c, batchKeys, bugs)
return err
}
- for i, bug := range bugs {
- transform(bug, i)
+ if err := db.RunInTransaction(c, tx, &db.TransactionOptions{XG: true}); err != nil {
+ return err
}
- _, err := db.PutMulti(c, keys, bugs)
- return err
+ log.Warningf(c, "updated %v bugs", len(batchKeys))
}
- err := db.RunInTransaction(c, tx, &db.TransactionOptions{XG: true})
- log.Warningf(c, "updated %v bugs: %v", len(keys), err)
- return err
+ return nil
}
// Prevent warnings about dead code.
var (
_ = dropNamespace
_ = updateBugReporting
+ _ = updateBugTitles
)