aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-12-07 10:28:40 +0100
committerDmitry Vyukov <dvyukov@google.com>2017-12-07 10:28:40 +0100
commit08c5c8bfdde5be7360731e8a3a4a7857215ced9b (patch)
tree7112b64fe9887653afb41cf0c0e8f32ca77edcf6
parent5d643f8e7060be125e00bbe3e8a154fc2d9928bf (diff)
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.
-rw-r--r--dashboard/app/api.go41
-rw-r--r--dashboard/app/jobs.go4
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