Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: filter/dscache/dscache.go

Issue 1269113005: A transparent cache for datastore, backed by memcache. (Closed) Base URL: https://github.com/luci/gae.git@add_meta
Patch Set: fix comments Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « filter/dscache/ds_txn_state.go ('k') | filter/dscache/dscache_test.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 "time"
13
14 "github.com/luci/gae/service/datastore"
15 )
16
17 var (
18 // InstanceEnabledStatic allows you to statically (e.g. in an init() fun ction)
19 // bypass this filter by setting it to false. This takes effect when the
20 // application calls IsGloballyEnabled.
21 InstanceEnabledStatic = true
22
23 // LockTimeSeconds is the number of seconds that a "lock" memcache entry will
24 // have its expiration set to. It's set to just over half of the fronten d
25 // request handler timeout (currently 60 seconds).
26 LockTimeSeconds = 31
27
28 // CacheTimeSeconds is the default number of seconds that a cached entit y will
29 // be retained (memcache contention notwithstanding). A value of 0 is
30 // infinite. This is #seconds instead of time.Duration, because memcache
31 // truncates expiration to the second, which means a sub-second amount w ould
32 // actually truncate to an infinite timeout.
33 CacheTimeSeconds = int64((time.Hour * 24).Seconds())
34
35 // CompressionThreshold is the number of bytes of entity value after whi ch
36 // compression kicks in.
37 CompressionThreshold = 860
38
39 // DefaultShards is the default number of key sharding to do.
40 DefaultShards int = 1
41
42 // DefaultEnable indicates whether or not caching is globally enabled or
43 // disabled by default. Can still be overridden by CacheEnableMeta.
44 DefaultEnabled = true
45 )
46
47 const (
48 MemcacheVersion = "1"
49
50 // KeyFormat is the format string used to generate memcache keys. It's
51 // gae:<version>:<shard#>:<base64_std_nopad(sha1(datastore.Key))>
52 KeyFormat = "gae:" + MemcacheVersion + ":%x:%s"
53 Sha1B64Padding = 1
54 Sha1B64Size = 28 - Sha1B64Padding
55
56 MaxShards = 256
57 MaxShardsLen = len("ff")
58 InternalGAEPadding = 96
59 ValueSizeLimit = (1000 * 1000) - InternalGAEPadding - MaxShardsLen
60
61 CacheEnableMeta = "dscache.enable"
62 CacheExpirationMeta = "dscache.expiration"
63
64 // NonceUint32s is the number of 32 bit uints to use in the 'lock' nonce .
65 NonceUint32s = 2
66
67 // GlobalEnabledCheckInterval is how frequently IsGloballyEnabled should check
68 // the globalEnabled datastore entry.
69 GlobalEnabledCheckInterval = 5 * time.Minute
70 )
71
72 // internalValueSizeLimit is a var for testing purposes.
73 var internalValueSizeLimit = ValueSizeLimit
74
75 type CompressionType byte
76
77 const (
78 NoCompression CompressionType = iota
79 ZlibCompression
80 )
81
82 func (c CompressionType) String() string {
83 switch c {
84 case NoCompression:
85 return "NoCompression"
86 case ZlibCompression:
87 return "ZlibCompression"
88 default:
89 return fmt.Sprintf("UNKNOWN_CompressionType(%d)", c)
90 }
91 }
92
93 // FlagValue is used to indicate if a memcache entry currently contains an
94 // item or a lock.
95 type FlagValue uint32
96
97 const (
98 ItemUKNONWN FlagValue = iota
99 ItemHasData
100 ItemHasLock
101 )
102
103 func MakeMemcacheKey(shard int, k datastore.Key) string {
104 return fmt.Sprintf(KeyFormat, shard, HashKey(k))
105 }
106
107 func HashKey(k datastore.Key) string {
108 // errs can't happen, since we're using a byte buffer.
109 buf := bytes.Buffer{}
110 _ = datastore.WriteKey(&buf, datastore.WithoutContext, k)
111 dgst := sha1.Sum(buf.Bytes())
112 buf.Reset()
113 enc := base64.NewEncoder(base64.StdEncoding, &buf)
114 _, _ = enc.Write(dgst[:])
115 enc.Close()
116 return buf.String()[:buf.Len()-Sha1B64Padding]
117 }
OLDNEW
« no previous file with comments | « filter/dscache/ds_txn_state.go ('k') | filter/dscache/dscache_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698