Skip to content

Commit

Permalink
use instance caching instead of memcache
Browse files Browse the repository at this point in the history
  • Loading branch information
adg committed Jun 14, 2012
1 parent 623027a commit 24c9e98
Showing 1 changed file with 37 additions and 26 deletions.
63 changes: 37 additions & 26 deletions dash/ui.go
Expand Up @@ -18,16 +18,18 @@ import (
"html/template"
"net/http"
"sort"
"sync"
"time"

"appengine"
"appengine/datastore"
"appengine/memcache"
)

const (
packageCacheKey = "packages"
var (
packageCache []*Package
packageCacheTime time.Time
packageCacheExpiry = 1 * time.Hour
packageCacheMu sync.RWMutex
)

func init() {
Expand All @@ -36,6 +38,7 @@ func init() {

func ui(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
d := uiData{Add: r.FormValue("add") == "ok"}

if path := r.FormValue("path"); path != "" && r.Method == "POST" {
if pathOK(path) {
Expand All @@ -45,18 +48,18 @@ func ui(w http.ResponseWriter, r *http.Request) {
return
}

doCache := r.FormValue("nocache") == ""
p, err := packages(c, doCache)
var err error
if r.FormValue("nocache") == "" {
d.Packages, err = cachedPackages(c)
} else {
d.Packages, err = packages(c)
}
if err != nil {
http.Error(w, "error fetching package list", 500)
c.Errorf("packages: %v", err)
return
}

d := uiData{
Add: r.FormValue("add") == "ok",
Packages: p,
}
if err := uiTemplate.Execute(w, d); err != nil {
c.Errorf("uiTemplate: %v", err)
}
Expand All @@ -69,29 +72,37 @@ type uiData struct {

var uiTemplate = template.Must(template.ParseFiles("dash/ui.html"))

func packages(c appengine.Context, doCache bool) ([]*Package, error) {
func cachedPackages(c appengine.Context) ([]*Package, error) {
var load bool
var pkgs []*Package
err := memcache.ErrCacheMiss
if doCache {
_, err = memcache.Gob.Get(c, packageCacheKey, &pkgs)
packageCacheMu.RLock()
if packageCache == nil || time.Since(packageCacheTime) > packageCacheExpiry {
load = true
} else {
pkgs = packageCache
}
if err == memcache.ErrCacheMiss {
_, err = datastore.NewQuery("Package").GetAll(c, &pkgs)
if err != nil {
return nil, err
}
sort.Sort(packageList(pkgs))
if doCache {
err = memcache.Gob.Set(c, &memcache.Item{
Key: packageCacheKey,
Object: pkgs,
Expiration: packageCacheExpiry,
})
}
packageCacheMu.RUnlock()
if !load {
return pkgs, nil
}
packageCacheMu.Lock()
defer packageCacheMu.Unlock()
pkgs, err := packages(c)
if err != nil {
return nil, err
}
packageCache = pkgs
packageCacheTime = time.Now()
return pkgs, nil
}

func packages(c appengine.Context) ([]*Package, error) {
var pkgs []*Package
_, err := datastore.NewQuery("Package").GetAll(c, &pkgs)
if err != nil {
return nil, err
}
sort.Sort(packageList(pkgs))
return pkgs, nil
}

Expand Down

0 comments on commit 24c9e98

Please sign in to comment.