Index: impl/prod/context.go |
diff --git a/impl/prod/context.go b/impl/prod/context.go |
index 10ba7d1d36433213957863ea0fa3b309f8020563..343b683c41e763855e31a88875d9b7c4e76e3493 100644 |
--- a/impl/prod/context.go |
+++ b/impl/prod/context.go |
@@ -32,12 +32,13 @@ var ( |
probeCacheKey = "contains the current *infoProbeCache" |
) |
-// AEContext retrieves the raw "google.golang.org/appengine" compatible Context. |
+// getAEContext retrieves the raw "google.golang.org/appengine" compatible |
+// Context. |
// |
-// It also transfers deadline of `c` to AE context, since deadline is used for |
-// RPCs. Doesn't transfer cancelation ability though (since it's ignored by GAE |
-// anyway). |
-func AEContext(c context.Context) context.Context { |
+// This is an independent Context chain from `c`. In an attempt to maintain user |
+// expectations, the deadline of `c` is transferred to the returned Context, |
+// RPCs. Cancelation is not transferred. |
+func getAEContext(c context.Context) context.Context { |
ps := getProdState(c) |
return ps.context(c) |
} |
@@ -51,7 +52,8 @@ func setupAECtx(c, aeCtx context.Context) context.Context { |
} |
// Use adds production implementations for all the gae services to the |
-// context. |
+// context. The implementations are all backed by the real appengine SDK |
+// functionality. |
// |
// The services added are: |
// - github.com/luci-go/common/logging |
@@ -66,7 +68,13 @@ func setupAECtx(c, aeCtx context.Context) context.Context { |
// |
// These can be retrieved with the <service>.Get functions. |
// |
-// The implementations are all backed by the real appengine SDK functionality, |
+// It is important to note that this DOES NOT install the AppEngine SDK into the |
+// supplied Context. In general, using the raw AppEngine SDK to access a service |
+// that is covered by luci/gae is dangerous, leading to a number of potential |
+// pitfalls including inconsistent transaction management and data corruption. |
+// |
+// Users who wish to access the raw AppEngine SDK must derive their own |
+// AppEngine Context at their own risk. |
func Use(c context.Context, r *http.Request) context.Context { |
return setupAECtx(c, appengine.NewContext(r)) |
} |
@@ -94,9 +102,12 @@ func Use(c context.Context, r *http.Request) context.Context { |
// - "https://www.googleapis.com/auth/appengine.apis" |
// - "https://www.googleapis.com/auth/userinfo.email" |
// - "https://www.googleapis.com/auth/cloud.platform" |
+// |
+// It is important to note that this DOES NOT install the AppEngine SDK into the |
+// supplied Context. See the warning in Use for more information. |
func UseRemote(inOutCtx *context.Context, host string, client *http.Client) (err error) { |
if client == nil { |
- aeCtx := AEContext(*inOutCtx) |
+ aeCtx := getAEContext(*inOutCtx) |
if strings.HasPrefix(host, "localhost") { |
transp := http.DefaultTransport |