github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/tools/dashboard/app/build/update.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build appengine 6 7 package build 8 9 import ( 10 "encoding/json" 11 "fmt" 12 "net/http" 13 14 "appengine" 15 "appengine/datastore" 16 ) 17 18 func init() { 19 handleFunc("/updatebenchmark", updateBenchmark) 20 } 21 22 func updateBenchmark(w http.ResponseWriter, r *http.Request) { 23 if !appengine.IsDevAppServer() { 24 fmt.Fprint(w, "Update must not run on real server.") 25 return 26 } 27 28 if r.Method != "POST" { 29 fmt.Fprintf(w, "bad request method") 30 return 31 } 32 33 c := contextForRequest(r) 34 if !validKey(c, r.FormValue("key"), r.FormValue("builder")) { 35 fmt.Fprintf(w, "bad builder/key") 36 return 37 } 38 39 defer r.Body.Close() 40 var hashes []string 41 if err := json.NewDecoder(r.Body).Decode(&hashes); err != nil { 42 fmt.Fprintf(w, "failed to decode request: %v", err) 43 return 44 } 45 46 ncommit := 0 47 nrun := 0 48 tx := func(c appengine.Context) error { 49 var cr *CommitRun 50 for _, hash := range hashes { 51 // Update Commit. 52 com := &Commit{Hash: hash} 53 err := datastore.Get(c, com.Key(c), com) 54 if err != nil && err != datastore.ErrNoSuchEntity { 55 return fmt.Errorf("fetching Commit: %v", err) 56 } 57 if err == datastore.ErrNoSuchEntity { 58 continue 59 } 60 com.NeedsBenchmarking = true 61 com.PerfResults = nil 62 if err := putCommit(c, com); err != nil { 63 return err 64 } 65 ncommit++ 66 67 // create PerfResult 68 res := &PerfResult{CommitHash: com.Hash, CommitNum: com.Num} 69 err = datastore.Get(c, res.Key(c), res) 70 if err != nil && err != datastore.ErrNoSuchEntity { 71 return fmt.Errorf("fetching PerfResult: %v", err) 72 } 73 if err == datastore.ErrNoSuchEntity { 74 if _, err := datastore.Put(c, res.Key(c), res); err != nil { 75 return fmt.Errorf("putting PerfResult: %v", err) 76 } 77 } 78 79 // Update CommitRun. 80 if cr != nil && cr.StartCommitNum != com.Num/PerfRunLength*PerfRunLength { 81 if _, err := datastore.Put(c, cr.Key(c), cr); err != nil { 82 return fmt.Errorf("putting CommitRun: %v", err) 83 } 84 nrun++ 85 cr = nil 86 } 87 if cr == nil { 88 var err error 89 cr, err = GetCommitRun(c, com.Num) 90 if err != nil { 91 return fmt.Errorf("getting CommitRun: %v", err) 92 } 93 } 94 if com.Num < cr.StartCommitNum || com.Num >= cr.StartCommitNum+PerfRunLength { 95 return fmt.Errorf("commit num %v out of range [%v, %v)", com.Num, cr.StartCommitNum, cr.StartCommitNum+PerfRunLength) 96 } 97 idx := com.Num - cr.StartCommitNum 98 cr.Hash[idx] = com.Hash 99 cr.User[idx] = shortDesc(com.User) 100 cr.Desc[idx] = shortDesc(com.Desc) 101 cr.Time[idx] = com.Time 102 cr.NeedsBenchmarking[idx] = com.NeedsBenchmarking 103 } 104 if cr != nil { 105 if _, err := datastore.Put(c, cr.Key(c), cr); err != nil { 106 return fmt.Errorf("putting CommitRun: %v", err) 107 } 108 nrun++ 109 } 110 return nil 111 } 112 if err := datastore.RunInTransaction(c, tx, nil); err != nil { 113 fmt.Fprintf(w, "failed to execute tx: %v", err) 114 return 115 } 116 fmt.Fprintf(w, "OK (updated %v commits and %v commit runs)", ncommit, nrun) 117 }