| Index: impl/prod/info.go
|
| diff --git a/impl/prod/info.go b/impl/prod/info.go
|
| index f513f3b04458cbc70720058561634d0b532a34da..8611c9095e8f707681211004fd9ddf07de0eaf51 100644
|
| --- a/impl/prod/info.go
|
| +++ b/impl/prod/info.go
|
| @@ -10,17 +10,21 @@ import (
|
| "github.com/luci/gae/service/info"
|
| "golang.org/x/net/context"
|
| "google.golang.org/appengine"
|
| + "google.golang.org/appengine/datastore"
|
| )
|
|
|
| type key int
|
|
|
| -var namespaceCopyKey key
|
| +var probeCacheKey key
|
|
|
| // useGI adds a gae.GlobalInfo implementation to context, accessible
|
| // by gae.GetGI(c)
|
| func useGI(c context.Context) context.Context {
|
| - // TODO(iannucci): make a better way to get the initial namespace?
|
| - c = context.WithValue(c, namespaceCopyKey, "")
|
| + probeCache := getProbeCache(c)
|
| + if probeCache == nil {
|
| + c = withProbeCache(c, probe(c))
|
| + }
|
| +
|
| return info.SetFactory(c, func(ci context.Context) info.Interface {
|
| return giImpl{ci}
|
| })
|
| @@ -34,8 +38,11 @@ func (g giImpl) AccessToken(scopes ...string) (token string, expiry time.Time, e
|
| func (g giImpl) AppID() string {
|
| return appengine.AppID(g)
|
| }
|
| +func (g giImpl) FullyQualifiedAppID() string {
|
| + return getProbeCache(g).fqaid
|
| +}
|
| func (g giImpl) GetNamespace() string {
|
| - return g.Value(namespaceCopyKey).(string)
|
| + return getProbeCache(g).namespace
|
| }
|
| func (g giImpl) Datacenter() string {
|
| return appengine.Datacenter(g)
|
| @@ -66,7 +73,9 @@ func (g giImpl) Namespace(namespace string) (context.Context, error) {
|
| if err != nil {
|
| return c, err
|
| }
|
| - return context.WithValue(c, namespaceCopyKey, namespace), nil
|
| + pc := *getProbeCache(g)
|
| + pc.namespace = namespace
|
| + return withProbeCache(c, &pc), nil
|
| }
|
| func (g giImpl) PublicCertificates() ([]info.Certificate, error) {
|
| certs, err := appengine.PublicCertificates(g)
|
| @@ -94,3 +103,27 @@ func (g giImpl) SignBytes(bytes []byte) (keyName string, signature []byte, err e
|
| func (g giImpl) VersionID() string {
|
| return appengine.VersionID(g)
|
| }
|
| +
|
| +type infoProbeCache struct {
|
| + namespace string
|
| + fqaid string
|
| +}
|
| +
|
| +func probe(c context.Context) *infoProbeCache {
|
| + probeKey := datastore.NewKey(c, "Kind", "id", 0, nil)
|
| + return &infoProbeCache{
|
| + namespace: probeKey.Namespace(),
|
| + fqaid: probeKey.AppID(),
|
| + }
|
| +}
|
| +
|
| +func getProbeCache(c context.Context) *infoProbeCache {
|
| + if pc, ok := c.Value(probeCacheKey).(*infoProbeCache); ok {
|
| + return pc
|
| + }
|
| + return nil
|
| +}
|
| +
|
| +func withProbeCache(c context.Context, pc *infoProbeCache) context.Context {
|
| + return context.WithValue(c, probeCacheKey, pc)
|
| +}
|
|
|