mirror of
https://github.com/golang/go
synced 2024-11-22 03:24:41 -07:00
dashboard: store front page in memcache
R=golang-dev, dsymonds CC=golang-dev https://golang.org/cl/5503056
This commit is contained in:
parent
4fe73ef40a
commit
494e52fe1c
@ -7,6 +7,7 @@ package build
|
|||||||
import (
|
import (
|
||||||
"appengine"
|
"appengine"
|
||||||
"appengine/datastore"
|
"appengine/datastore"
|
||||||
|
"appengine/memcache"
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
"fmt"
|
"fmt"
|
||||||
"http"
|
"http"
|
||||||
@ -58,6 +59,7 @@ func commitHandler(r *http.Request) (interface{}, os.Error) {
|
|||||||
if err := com.Valid(); err != nil {
|
if err := com.Valid(); err != nil {
|
||||||
return nil, fmt.Errorf("validating Commit: %v", err)
|
return nil, fmt.Errorf("validating Commit: %v", err)
|
||||||
}
|
}
|
||||||
|
defer invalidateCache(c)
|
||||||
tx := func(c appengine.Context) os.Error {
|
tx := func(c appengine.Context) os.Error {
|
||||||
return addCommit(c, com)
|
return addCommit(c, com)
|
||||||
}
|
}
|
||||||
@ -131,6 +133,7 @@ func tagHandler(r *http.Request) (interface{}, os.Error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
c := appengine.NewContext(r)
|
c := appengine.NewContext(r)
|
||||||
|
defer invalidateCache(c)
|
||||||
_, err := datastore.Put(c, t.Key(c), t)
|
_, err := datastore.Put(c, t.Key(c), t)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -226,6 +229,7 @@ func resultHandler(r *http.Request) (interface{}, os.Error) {
|
|||||||
if err := res.Valid(); err != nil {
|
if err := res.Valid(); err != nil {
|
||||||
return nil, fmt.Errorf("validating Result: %v", err)
|
return nil, fmt.Errorf("validating Result: %v", err)
|
||||||
}
|
}
|
||||||
|
defer invalidateCache(c)
|
||||||
// store the Log text if supplied
|
// store the Log text if supplied
|
||||||
if len(res.Log) > 0 {
|
if len(res.Log) > 0 {
|
||||||
hash, err := PutLog(c, res.Log)
|
hash, err := PutLog(c, res.Log)
|
||||||
@ -375,3 +379,11 @@ func logErr(w http.ResponseWriter, r *http.Request, err os.Error) {
|
|||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
fmt.Fprint(w, "Error: ", err)
|
fmt.Fprint(w, "Error: ", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// invalidateCache deletes the ui cache record from memcache.
|
||||||
|
func invalidateCache(c appengine.Context) {
|
||||||
|
err := memcache.Delete(c, uiCacheKey)
|
||||||
|
if err != nil && err != memcache.ErrCacheMiss {
|
||||||
|
c.Errorf("memcache.Delete(%q): %v", uiCacheKey, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -10,6 +10,8 @@ package build
|
|||||||
import (
|
import (
|
||||||
"appengine"
|
"appengine"
|
||||||
"appengine/datastore"
|
"appengine/datastore"
|
||||||
|
"appengine/memcache"
|
||||||
|
"bytes"
|
||||||
"exp/template/html"
|
"exp/template/html"
|
||||||
"http"
|
"http"
|
||||||
"os"
|
"os"
|
||||||
@ -20,6 +22,11 @@ import (
|
|||||||
"template"
|
"template"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
uiCacheKey = "build-ui"
|
||||||
|
uiCacheExpiry = 10 * 60 // 10 minutes in seconds
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
http.HandleFunc("/", uiHandler)
|
http.HandleFunc("/", uiHandler)
|
||||||
html.Escape(uiTemplate)
|
html.Escape(uiTemplate)
|
||||||
@ -27,7 +34,6 @@ func init() {
|
|||||||
|
|
||||||
// uiHandler draws the build status page.
|
// uiHandler draws the build status page.
|
||||||
func uiHandler(w http.ResponseWriter, r *http.Request) {
|
func uiHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
// TODO(adg): put the HTML in memcache and invalidate on updates
|
|
||||||
c := appengine.NewContext(r)
|
c := appengine.NewContext(r)
|
||||||
|
|
||||||
page, _ := strconv.Atoi(r.FormValue("page"))
|
page, _ := strconv.Atoi(r.FormValue("page"))
|
||||||
@ -35,6 +41,18 @@ func uiHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
page = 0
|
page = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used cached version of front page, if available.
|
||||||
|
if page == 0 {
|
||||||
|
t, err := memcache.Get(c, uiCacheKey)
|
||||||
|
if err == nil {
|
||||||
|
w.Write(t.Value)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err != memcache.ErrCacheMiss {
|
||||||
|
c.Errorf("get ui cache: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
commits, err := goCommits(c, page)
|
commits, err := goCommits(c, page)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logErr(w, r, err)
|
logErr(w, r, err)
|
||||||
@ -57,9 +75,26 @@ func uiHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
p.HasPrev = true
|
p.HasPrev = true
|
||||||
}
|
}
|
||||||
data := &uiTemplateData{commits, builders, tipState, p}
|
data := &uiTemplateData{commits, builders, tipState, p}
|
||||||
if err := uiTemplate.Execute(w, data); err != nil {
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err := uiTemplate.Execute(&buf, data); err != nil {
|
||||||
logErr(w, r, err)
|
logErr(w, r, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cache the front page.
|
||||||
|
if page == 0 {
|
||||||
|
t := &memcache.Item{
|
||||||
|
Key: uiCacheKey,
|
||||||
|
Value: buf.Bytes(),
|
||||||
|
Expiration: uiCacheExpiry,
|
||||||
|
}
|
||||||
|
if err := memcache.Set(c, t); err != nil {
|
||||||
|
c.Errorf("set ui cache: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.WriteTo(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Pagination struct {
|
type Pagination struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user