From 08c5c8bfdde5be7360731e8a3a4a7857215ced9b Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 7 Dec 2017 10:28:40 +0100 Subject: dashboard/app: fix manager failed build reset Only reset manager failed build if it uploaded _new_ successful build. On manager restart it uploads its _old_ working build, and it should not reset a later failed build. --- dashboard/app/api.go | 41 ++++++++++++++++++++++------------------- dashboard/app/jobs.go | 4 +++- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/dashboard/app/api.go b/dashboard/app/api.go index 6cf47e1ff..a7b52b629 100644 --- a/dashboard/app/api.go +++ b/dashboard/app/api.go @@ -197,7 +197,8 @@ func apiUploadBuild(c context.Context, ns string, r *http.Request) (interface{}, if err := json.NewDecoder(r.Body).Decode(req); err != nil { return nil, fmt.Errorf("failed to unmarshal request: %v", err) } - if err := uploadBuild(c, ns, req, BuildNormal); err != nil { + isNewBuild, err := uploadBuild(c, ns, req, BuildNormal) + if err != nil { return nil, err } if len(req.Commits) != 0 { @@ -205,18 +206,20 @@ func apiUploadBuild(c context.Context, ns string, r *http.Request) (interface{}, return nil, err } } - if err := updateManager(c, ns, req.Manager, func(mgr *Manager, stats *ManagerStats) { - mgr.CurrentBuild = req.ID - mgr.FailedBuildBug = "" - }); err != nil { - return nil, err + if isNewBuild { + if err := updateManager(c, ns, req.Manager, func(mgr *Manager, stats *ManagerStats) { + mgr.CurrentBuild = req.ID + mgr.FailedBuildBug = "" + }); err != nil { + return nil, err + } } return nil, nil } -func uploadBuild(c context.Context, ns string, req *dashapi.Build, typ BuildType) error { +func uploadBuild(c context.Context, ns string, req *dashapi.Build, typ BuildType) (bool, error) { if _, err := loadBuild(c, ns, req.ID); err == nil { - return nil + return false, nil } checkStrLen := func(str, name string, maxLen int) error { @@ -229,29 +232,29 @@ func uploadBuild(c context.Context, ns string, req *dashapi.Build, typ BuildType return nil } if err := checkStrLen(req.Manager, "Build.Manager", MaxStringLen); err != nil { - return err + return false, err } if err := checkStrLen(req.ID, "Build.ID", MaxStringLen); err != nil { - return err + return false, err } if err := checkStrLen(req.KernelRepo, "Build.KernelRepo", MaxStringLen); err != nil { - return err + return false, err } if err := checkStrLen(req.KernelBranch, "Build.KernelBranch", MaxStringLen); err != nil { - return err + return false, err } if err := checkStrLen(req.SyzkallerCommit, "Build.SyzkallerCommit", MaxStringLen); err != nil { - return err + return false, err } if err := checkStrLen(req.CompilerID, "Build.CompilerID", MaxStringLen); err != nil { - return err + return false, err } if err := checkStrLen(req.KernelCommit, "Build.KernelCommit", MaxStringLen); err != nil { - return err + return false, err } configID, err := putText(c, ns, "KernelConfig", req.KernelConfig, true) if err != nil { - return err + return false, err } build := &Build{ Namespace: ns, @@ -270,9 +273,9 @@ func uploadBuild(c context.Context, ns string, req *dashapi.Build, typ BuildType KernelConfig: configID, } if _, err := datastore.Put(c, buildKey(c, ns, req.ID), build); err != nil { - return err + return false, err } - return nil + return true, nil } func addCommitsToBugs(c context.Context, ns, manager string, commits []string) error { @@ -378,7 +381,7 @@ func apiReportBuildError(c context.Context, ns string, r *http.Request) (interfa if err := json.NewDecoder(r.Body).Decode(req); err != nil { return nil, fmt.Errorf("failed to unmarshal request: %v", err) } - if err := uploadBuild(c, ns, &req.Build, BuildFailed); err != nil { + if _, err := uploadBuild(c, ns, &req.Build, BuildFailed); err != nil { return nil, err } req.Crash.BuildID = req.Build.ID diff --git a/dashboard/app/jobs.go b/dashboard/app/jobs.go index 42743c78d..e26e3a75d 100644 --- a/dashboard/app/jobs.go +++ b/dashboard/app/jobs.go @@ -244,8 +244,10 @@ func doneJob(c context.Context, req *dashapi.JobDoneReq) error { return fmt.Errorf("job %v: already finished", jobID) } ns := job.Namespace - if err := uploadBuild(c, ns, &req.Build, BuildJob); err != nil { + if isNewBuild, err := uploadBuild(c, ns, &req.Build, BuildJob); err != nil { return err + } else if !isNewBuild { + log.Warningf(c, "job %v: duplicate build %v", jobID, req.Build.ID) } if job.Error, err = putText(c, ns, "Error", req.Error, false); err != nil { return err -- cgit mrf-deployment