| Index: impl/prod/info.go
|
| diff --git a/impl/prod/info.go b/impl/prod/info.go
|
| index 691f08186e6ab75d70a263a03c09c1ea337c4a83..94c8ba3501bb047f307142a77eefaf3b638b1947 100644
|
| --- a/impl/prod/info.go
|
| +++ b/impl/prod/info.go
|
| @@ -40,12 +40,8 @@ func (g giImpl) AppID() string {
|
| func (g giImpl) FullyQualifiedAppID() string {
|
| return getProbeCache(g.usrCtx).fqaid
|
| }
|
| -func (g giImpl) GetNamespace() (string, bool) {
|
| - pc := getProbeCache(g.usrCtx)
|
| - if ns := pc.namespace; ns != nil {
|
| - return *ns, true
|
| - }
|
| - return "", false
|
| +func (g giImpl) GetNamespace() string {
|
| + return getProbeCache(g.usrCtx).namespace
|
| }
|
| func (g giImpl) Datacenter() string {
|
| return appengine.Datacenter(g.aeCtx)
|
| @@ -72,14 +68,35 @@ func (g giImpl) ModuleName() (name string) {
|
| return appengine.ModuleName(g.aeCtx)
|
| }
|
| func (g giImpl) Namespace(namespace string) (context.Context, error) {
|
| - aeCtx, err := appengine.Namespace(g.aeCtx, namespace)
|
| + c := g.usrCtx
|
| +
|
| + pc := *getProbeCache(c)
|
| + if pc.namespace == namespace {
|
| + // Already using this namespace.
|
| + return c, nil
|
| + }
|
| + pc.namespace = namespace
|
| +
|
| + // Apply the namespace to our retained GAE Contexts.
|
| + var err error
|
| + ps := getProdState(c)
|
| +
|
| + // Apply to current GAE Context.
|
| + if ps.ctx, err = appengine.Namespace(ps.ctx, namespace); err != nil {
|
| + return c, err
|
| + }
|
| +
|
| + // Apply to non-transactional Context. Since the previous one applied
|
| + // successfully, this must succeed.
|
| + ps.noTxnCtx, err = appengine.Namespace(ps.noTxnCtx, namespace)
|
| if err != nil {
|
| - return g.usrCtx, err
|
| + panic(err)
|
| }
|
| - usrCtx := context.WithValue(g.usrCtx, prodContextKey, aeCtx)
|
| - pc := *getProbeCache(usrCtx)
|
| - pc.namespace = &namespace
|
| - return withProbeCache(usrCtx, &pc), nil
|
| +
|
| + // Update our user Context with the new namespace-imbued objects.
|
| + c = withProbeCache(c, &pc)
|
| + c = withProdState(c, ps)
|
| + return c, nil
|
| }
|
| func (g giImpl) PublicCertificates() ([]info.Certificate, error) {
|
| certs, err := appengine.PublicCertificates(g.aeCtx)
|
| @@ -113,34 +130,29 @@ func (g giImpl) VersionID() string {
|
| return appengine.VersionID(g.aeCtx)
|
| }
|
|
|
| -func (g giImpl) Testable() info.Testable {
|
| - return nil
|
| -}
|
| +func (g giImpl) GetTestable() info.Testable { return nil }
|
|
|
| type infoProbeCache struct {
|
| - namespace *string
|
| + namespace string
|
| fqaid string
|
| }
|
|
|
| func probe(aeCtx context.Context) *infoProbeCache {
|
| probeKey := datastore.NewKey(aeCtx, "Kind", "id", 0, nil)
|
| - namespace := probeKey.Namespace()
|
| ipb := infoProbeCache{
|
| - fqaid: probeKey.AppID(),
|
| - }
|
| - if namespace != "" {
|
| - ipb.namespace = &namespace
|
| + fqaid: probeKey.AppID(),
|
| + namespace: probeKey.Namespace(),
|
| }
|
| return &ipb
|
| }
|
|
|
| func getProbeCache(c context.Context) *infoProbeCache {
|
| - if pc, ok := c.Value(probeCacheKey).(*infoProbeCache); ok {
|
| + 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)
|
| + return context.WithValue(c, &probeCacheKey, pc)
|
| }
|
|
|