| OLD | NEW |
| 1 // Copyright 2015 The LUCI Authors. All rights reserved. | 1 // Copyright 2015 The LUCI Authors. All rights reserved. |
| 2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
| 3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
| 4 | 4 |
| 5 package dscache | 5 package dscache |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 ds "github.com/luci/gae/service/datastore" | 8 ds "github.com/luci/gae/service/datastore" |
| 9 » "github.com/luci/gae/service/info" | 9 |
| 10 » mc "github.com/luci/gae/service/memcache" | |
| 11 "github.com/luci/luci-go/common/data/rand/mathrand" | 10 "github.com/luci/luci-go/common/data/rand/mathrand" |
| 11 |
| 12 "golang.org/x/net/context" | 12 "golang.org/x/net/context" |
| 13 ) | 13 ) |
| 14 | 14 |
| 15 type key int | 15 type key int |
| 16 | 16 |
| 17 var dsTxnCacheKey key | 17 var dsTxnCacheKey key |
| 18 | 18 |
| 19 // FilterRDS installs a caching RawDatastore filter in the context. | 19 // FilterRDS installs a caching RawDatastore filter in the context. |
| 20 // | 20 // |
| 21 // It does nothing if IsGloballyEnabled returns false. That way it is possible | 21 // It does nothing if IsGloballyEnabled returns false. That way it is possible |
| (...skipping 15 matching lines...) Expand all Loading... |
| 37 return c | 37 return c |
| 38 } | 38 } |
| 39 return AlwaysFilterRDS(c, shardsForKey) | 39 return AlwaysFilterRDS(c, shardsForKey) |
| 40 } | 40 } |
| 41 | 41 |
| 42 // AlwaysFilterRDS installs a caching RawDatastore filter in the context. | 42 // AlwaysFilterRDS installs a caching RawDatastore filter in the context. |
| 43 // | 43 // |
| 44 // Unlike FilterRDS it doesn't check GlobalConfig via IsGloballyEnabled call, | 44 // Unlike FilterRDS it doesn't check GlobalConfig via IsGloballyEnabled call, |
| 45 // assuming caller already knows whether filter should be applied or not. | 45 // assuming caller already knows whether filter should be applied or not. |
| 46 func AlwaysFilterRDS(c context.Context, shardsForKey func(*ds.Key) int) context.
Context { | 46 func AlwaysFilterRDS(c context.Context, shardsForKey func(*ds.Key) int) context.
Context { |
| 47 » return ds.AddRawFilters(c, func(c context.Context, ds ds.RawInterface) d
s.RawInterface { | 47 » return ds.AddRawFilters(c, func(c context.Context, rds ds.RawInterface)
ds.RawInterface { |
| 48 » » i := info.Get(c) | 48 » » kc := ds.GetKeyContext(c) |
| 49 » » ns, _ := i.GetNamespace() | |
| 50 | 49 |
| 51 sc := &supportContext{ | 50 sc := &supportContext{ |
| 52 » » » i.AppID(), | 51 » » » kc.AppID, |
| 53 » » » ns, | 52 » » » kc.Namespace, |
| 54 c, | 53 c, |
| 55 mc.Get(c), | |
| 56 mathrand.Get(c), | 54 mathrand.Get(c), |
| 57 shardsForKey, | 55 shardsForKey, |
| 58 } | 56 } |
| 59 | 57 |
| 60 v := c.Value(dsTxnCacheKey) | 58 v := c.Value(dsTxnCacheKey) |
| 61 if v == nil { | 59 if v == nil { |
| 62 » » » return &dsCache{ds, sc} | 60 » » » return &dsCache{rds, sc} |
| 63 } | 61 } |
| 64 » » return &dsTxnCache{ds, v.(*dsTxnState), sc} | 62 » » return &dsTxnCache{rds, v.(*dsTxnState), sc} |
| 65 }) | 63 }) |
| 66 } | 64 } |
| OLD | NEW |