go.tools/dashboard/app: update commit in transaction on perf regression

The sendPerfFailMail function populated a dummy commit value and
then calls commonNotify, which then updated and stored that dummy
commit, hosing the original commit entity.

LGTM=rsc
R=rsc, bradfitz, dvyukov
CC=golang-codereviews
https://golang.org/cl/164960043
This commit is contained in:
Andrew Gerrand 2014-10-28 11:25:09 +11:00
parent 11451553df
commit 113eb67ee0
1 changed files with 19 additions and 12 deletions

View File

@ -201,7 +201,11 @@ var (
) )
func sendPerfFailMail(c appengine.Context, builder string, res *PerfResult) error { func sendPerfFailMail(c appengine.Context, builder string, res *PerfResult) error {
return datastore.RunInTransaction(c, func(c appengine.Context) error {
com := &Commit{Hash: res.CommitHash} com := &Commit{Hash: res.CommitHash}
if err := datastore.Get(c, com.Key(c), com); err != nil {
return err
}
logHash := "" logHash := ""
parsed := res.ParseData() parsed := res.ParseData()
for _, data := range parsed[builder] { for _, data := range parsed[builder] {
@ -214,8 +218,11 @@ func sendPerfFailMail(c appengine.Context, builder string, res *PerfResult) erro
return fmt.Errorf("can not find failed result for commit %v on builder %v", com.Hash, builder) return fmt.Errorf("can not find failed result for commit %v on builder %v", com.Hash, builder)
} }
return commonNotify(c, com, builder, logHash) return commonNotify(c, com, builder, logHash)
}, nil)
} }
// commonNotify MUST!!! be called from within a transaction inside which
// the provided Commit entity was retrieved from the datastore.
func commonNotify(c appengine.Context, com *Commit, builder, logHash string) error { func commonNotify(c appengine.Context, com *Commit, builder, logHash string) error {
if com.Num == 0 || com.Desc == "" { if com.Num == 0 || com.Desc == "" {
stk := make([]byte, 10000) stk := make([]byte, 10000)