OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 package dscache | |
6 | |
7 import ( | |
8 "bytes" | |
9 "crypto/sha1" | |
10 "encoding/base64" | |
11 "fmt" | |
12 | |
13 ds "github.com/luci/gae/service/datastore" | |
14 ) | |
15 | |
16 var ( | |
17 // LockTimeSeconds is the number of seconds that a "lock" memcache entry will | |
18 // have its expiration set to. It's set to just over half of the fronten d | |
19 // request handler timeout (currently 60 seconds). | |
20 LockTimeSeconds = 31 | |
21 | |
22 // CacheTimeSeconds is the default number of seconds that a positively c ached | |
23 // entity will be retained (memcache contention notwithstanding). A valu e of | |
24 // 0 is infinite. | |
25 CacheTimeSeconds int64 = 0 | |
Vadim Sh.
2015/08/06 01:23:34
I vote for "1 day" or something. To keep memcache
iannucci
2015/08/06 02:37:33
Sure. Done.
| |
26 | |
27 // CompressionThreshold is the number of bytes of entity value after whi ch | |
28 // compression kicks in. | |
29 CompressionThreshold = 860 | |
30 | |
31 // DefaultShards is the default number of key sharding to do. | |
32 DefaultShards int = 1 | |
33 | |
34 // DefaultEnable indicates whether or not caching is globally enabled or | |
35 // disabled by default. Can still be overridden by CacheEnableMeta. | |
36 DefaultEnabled = true | |
37 ) | |
38 | |
39 const ( | |
40 MemcacheVersion = "1" | |
dnj
2015/08/05 18:32:18
Do all of these need to be exported?
iannucci
2015/08/06 01:54:01
no :D but I like them to be :P
| |
41 | |
42 // KeyFormat is the format string used to generate memcache keys. It's | |
43 // gae:<version>:<shard#>:<base64_std_nopad(sha1(datastore.Key))> | |
44 KeyFormat = "gae:" + MemcacheVersion + ":%x:%s" | |
45 Sha1B64Padding = 1 | |
46 Sha1B64Size = 28 - Sha1B64Padding | |
47 | |
48 MaxShards = 256 | |
49 MaxShardsLen = len("ff") | |
50 InternalGAEPadding = 96 | |
51 ValueSizeLimit = (1000 * 1000) - InternalGAEPadding - MaxShardsLen | |
52 | |
53 CacheEnableMeta = "dscache.enable" | |
54 CacheExpirationMeta = "dscache.expiration" | |
55 | |
56 // NonceUint32s is the number of 32 bit uints to use in the 'lock' nonce . | |
57 NonceUint32s = 2 | |
58 ) | |
59 | |
60 // internalValueSizeLimit is a var for testing purposes. | |
61 var internalValueSizeLimit = ValueSizeLimit | |
62 | |
63 type CompressionType byte | |
64 | |
65 const ( | |
66 NoCompression CompressionType = iota | |
67 ZlibCompression | |
68 ) | |
69 | |
70 func (c CompressionType) String() string { | |
71 switch c { | |
72 case NoCompression: | |
73 return "NoCompression" | |
74 case ZlibCompression: | |
75 return "ZlibCompression" | |
76 default: | |
77 return fmt.Sprintf("UNKNOWN_CompressionType(%d)", c) | |
78 } | |
79 } | |
80 | |
81 // FlagValue is used to indicate if a memcache entry currently contains an | |
82 // item or a lock. | |
83 type FlagValue uint32 | |
84 | |
85 const ( | |
86 ItemUKNONWN FlagValue = iota | |
87 ItemHasData | |
88 ItemHasLock | |
89 ) | |
90 | |
91 func MakeMemcacheKey(shard int, k ds.Key) string { | |
92 return fmt.Sprintf(KeyFormat, shard, HashKey(k)) | |
93 } | |
94 | |
95 func HashKey(k ds.Key) string { | |
96 // errs can't happen, since we're using a byte buffer. | |
97 buf := bytes.Buffer{} | |
98 _ = ds.WriteKey(&buf, ds.WithoutContext, k) | |
99 dgst := sha1.Sum(buf.Bytes()) | |
100 buf.Reset() | |
101 enc := base64.NewEncoder(base64.StdEncoding, &buf) | |
102 _, _ = enc.Write(dgst[:]) | |
103 enc.Close() | |
104 return buf.String()[:buf.Len()-Sha1B64Padding] | |
105 } | |
106 | |
107 // TODO(riannucci): Should there be a way to purge the cache entries for a range | |
108 // of datastore keys? | |
Vadim Sh.
2015/08/06 01:23:34
why?
iannucci
2015/08/06 02:37:33
Not sure... that's why a todo question :D
The tho
| |
OLD | NEW |