| Index: filter/dscache/dscache.go
|
| diff --git a/filter/dscache/dscache.go b/filter/dscache/dscache.go
|
| index dd52c0ba69a2d7cb20b2e8fb3dccaba9bb1aa6f8..71afc4d70d44de93316259dbb2d95822b1ab85ae 100644
|
| --- a/filter/dscache/dscache.go
|
| +++ b/filter/dscache/dscache.go
|
| @@ -38,28 +38,49 @@ var (
|
| CompressionThreshold = 860
|
|
|
| // DefaultShards is the default number of key sharding to do.
|
| - DefaultShards int = 1
|
| + DefaultShards = 1
|
|
|
| - // DefaultEnable indicates whether or not caching is globally enabled or
|
| + // DefaultEnabled indicates whether or not caching is globally enabled or
|
| // disabled by default. Can still be overridden by CacheEnableMeta.
|
| DefaultEnabled = true
|
| )
|
|
|
| const (
|
| + // MemcacheVersion will be incremented in the event that the in-memcache
|
| + // representation of the cache data is modified.
|
| MemcacheVersion = "1"
|
|
|
| // KeyFormat is the format string used to generate memcache keys. It's
|
| // gae:<version>:<shard#>:<base64_std_nopad(sha1(datastore.Key))>
|
| - KeyFormat = "gae:" + MemcacheVersion + ":%x:%s"
|
| + KeyFormat = "gae:" + MemcacheVersion + ":%x:%s"
|
| +
|
| + // Sha1B64Padding is the number of padding characters a base64 encoding of
|
| + // a sha1 has.
|
| Sha1B64Padding = 1
|
| - Sha1B64Size = 28 - Sha1B64Padding
|
|
|
| - MaxShards = 256
|
| - MaxShardsLen = len("ff")
|
| + // MaxShards is the maximum number of shards a single entity can have.
|
| + MaxShards = 256
|
| +
|
| + // MaxShardsLen is the number of characters in the key the shard field
|
| + // occupies.
|
| + MaxShardsLen = len("ff")
|
| +
|
| + // InternalGAEPadding is the estimated internal padding size that GAE takes
|
| + // per memcache line.
|
| + // https://cloud.google.com/appengine/docs/go/memcache/#Go_Limits
|
| InternalGAEPadding = 96
|
| - ValueSizeLimit = (1000 * 1000) - InternalGAEPadding - MaxShardsLen
|
|
|
| - CacheEnableMeta = "dscache.enable"
|
| + // ValueSizeLimit is the maximum encoded size a datastore key+entry may
|
| + // occupy. If a datastore entity is too large, it will have an indefinite
|
| + // lock which will cause all clients to fetch it from the datastore.
|
| + ValueSizeLimit = (1000 * 1000) - InternalGAEPadding - MaxShardsLen
|
| +
|
| + // CacheEnableMeta is the gae metadata key name for whether or not dscache
|
| + // is enabled for an entity type at all.
|
| + CacheEnableMeta = "dscache.enable"
|
| +
|
| + // CacheExpirationMeta is the gae metadata key name for the default
|
| + // expiration time (in seconds) for an entity type.
|
| CacheExpirationMeta = "dscache.expiration"
|
|
|
| // NonceUint32s is the number of 32 bit uints to use in the 'lock' nonce.
|
| @@ -73,8 +94,10 @@ const (
|
| // internalValueSizeLimit is a var for testing purposes.
|
| var internalValueSizeLimit = ValueSizeLimit
|
|
|
| +// CompressionType is the type of compression a single memcache entry has.
|
| type CompressionType byte
|
|
|
| +// Types of compression. ZlibCompression uses "compress/zlib".
|
| const (
|
| NoCompression CompressionType = iota
|
| ZlibCompression
|
| @@ -95,17 +118,22 @@ func (c CompressionType) String() string {
|
| // item or a lock.
|
| type FlagValue uint32
|
|
|
| +// States for a memcache entry. ItemUNKNOWN exists to distinguish the default
|
| +// zero state from a valid state, but shouldn't ever be observed in memcache. .
|
| const (
|
| ItemUKNONWN FlagValue = iota
|
| ItemHasData
|
| ItemHasLock
|
| )
|
|
|
| -func MakeMemcacheKey(shard int, k datastore.Key) string {
|
| +// MakeMemcacheKey generates a memcache key for the given datastore Key. This
|
| +// is useful for debugging.
|
| +func MakeMemcacheKey(shard int, k *datastore.Key) string {
|
| return fmt.Sprintf(KeyFormat, shard, HashKey(k))
|
| }
|
|
|
| -func HashKey(k datastore.Key) string {
|
| +// HashKey generates just the hashed portion of the MemcacheKey.
|
| +func HashKey(k *datastore.Key) string {
|
| dgst := sha1.Sum(serialize.ToBytes(k))
|
| buf := bytes.Buffer{}
|
| enc := base64.NewEncoder(base64.StdEncoding, &buf)
|
|
|