Commit f1c409b9 authored by Dave Cheney's avatar Dave Cheney

misc/dashboard/app: trim old builds from the history

The dashboard is currently failing to store results of new builds for some keys, notable the go.codereview sub repository. This is causing the builders to mark the entire triggering commit as failed. With the help of David Symonds we think it is because the results value has breached the 1mb datastore limit on AppEngine.

R=dsymonds, adg
CC=golang-dev
https://golang.org/cl/6858094
parent 6b1b613d
...@@ -119,19 +119,35 @@ func (c *Commit) Valid() error { ...@@ -119,19 +119,35 @@ func (c *Commit) Valid() error {
return nil return nil
} }
// each result line is approx 105 bytes. This constant is a tradeoff between
// build history and the AppEngine datastore limit of 1mb.
const maxResults = 1000
// AddResult adds the denormalized Reuslt data to the Commit's Result field. // AddResult adds the denormalized Reuslt data to the Commit's Result field.
// It must be called from inside a datastore transaction. // It must be called from inside a datastore transaction.
func (com *Commit) AddResult(c appengine.Context, r *Result) error { func (com *Commit) AddResult(c appengine.Context, r *Result) error {
if err := datastore.Get(c, com.Key(c), com); err != nil { if err := datastore.Get(c, com.Key(c), com); err != nil {
return fmt.Errorf("getting Commit: %v", err) return fmt.Errorf("getting Commit: %v", err)
} }
com.ResultData = append(com.ResultData, r.Data()) com.ResultData = trim(append(com.ResultData, r.Data()), maxResults)
if _, err := datastore.Put(c, com.Key(c), com); err != nil { if _, err := datastore.Put(c, com.Key(c), com); err != nil {
return fmt.Errorf("putting Commit: %v", err) return fmt.Errorf("putting Commit: %v", err)
} }
return nil return nil
} }
func trim(s []string, n int) []string {
l := min(len(s), n)
return s[len(s)-l:]
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
// Result returns the build Result for this Commit for the given builder/goHash. // Result returns the build Result for this Commit for the given builder/goHash.
func (c *Commit) Result(builder, goHash string) *Result { func (c *Commit) Result(builder, goHash string) *Result {
for _, r := range c.ResultData { for _, r := range c.ResultData {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment