cachext 0.4.2.pre.alpha1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -22
- data/cachext.gemspec +5 -2
- data/lib/cachext.rb +1 -5
- data/lib/cachext/breaker.rb +10 -10
- data/lib/cachext/client.rb +1 -1
- data/lib/cachext/configuration.rb +3 -3
- data/lib/cachext/features/circuit_breaker.rb +1 -3
- data/lib/cachext/features/lock.rb +3 -3
- data/lib/cachext/key.rb +1 -5
- data/lib/cachext/multi.rb +1 -1
- data/lib/cachext/version.rb +1 -1
- metadata +25 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e419955af90b08b1ace8f3cf427e0405ae0bb3a3
|
4
|
+
data.tar.gz: 5fd6b8a4944d03bc0250e758f51cba8cacab2e5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6d23554e9c0ae9a0dbf18c19658e9164f9d580cc40ade0c0e85e67bc69df5e6d5713b959f8c0a68c54812249b6538eef8c96472c56ef16a95ea21c1623961b9
|
7
|
+
data.tar.gz: d34ca43dd664e490f4aae01d4c0e683185a632532445ce45c7495978922bd24fa5910f8d5e64454e2593865cd4d209dedd9e2177aff4d292e6a2ff10575e59c7
|
data/README.md
CHANGED
@@ -8,7 +8,6 @@ Extensions to normal Rails caching:
|
|
8
8
|
|
9
9
|
* Lock (inspired by https://github.com/seamusabshere/lock_and_cache)
|
10
10
|
* Backup
|
11
|
-
* Circuit breaker
|
12
11
|
|
13
12
|
## Quickstart
|
14
13
|
|
@@ -120,19 +119,6 @@ Cachext.config.error_logger = nil
|
|
120
119
|
|
121
120
|
If set to an object that responds to call, will `call` with any errors caught.
|
122
121
|
|
123
|
-
```ruby
|
124
|
-
Cachext.config.failure_threshold = 3
|
125
|
-
```
|
126
|
-
|
127
|
-
Number of tries before tripping circuit breaker.
|
128
|
-
|
129
|
-
```ruby
|
130
|
-
Cachext.config.breaker_timeout = 60
|
131
|
-
```
|
132
|
-
|
133
|
-
Time in seconds to wait before switching breaker to half-open.
|
134
|
-
|
135
|
-
|
136
122
|
## Usage
|
137
123
|
|
138
124
|
```ruby
|
@@ -143,14 +129,11 @@ Available options:
|
|
143
129
|
|
144
130
|
* `expires_in`: override for the `default_expires_in`, in seconds
|
145
131
|
* `default`: object or proc that will be used as the default if no backup is found
|
146
|
-
* `errors`: override for the `default_errors
|
147
|
-
* `reraise_errors`: default `true`, if set to `false` NotFound errors will not
|
148
|
-
|
149
|
-
* `
|
150
|
-
* `
|
151
|
-
* `breaker_timeout`: (override) time in seconds to wait before switching breaker to half-open
|
152
|
-
* `cache`: use the first-level cache, defaults to true. If set to false, will always call the
|
153
|
-
fallback, but if an error is raised, will use the last known good value.
|
132
|
+
* `errors`: override for the `default_errors` to be caught
|
133
|
+
* `reraise_errors`: default `true`, if set to `false` NotFound errors will not
|
134
|
+
be raised
|
135
|
+
* `not_found_error`: override for `not_found_errors`
|
136
|
+
* `heartbeat_expires`: override for `heartbeat_expires`
|
154
137
|
|
155
138
|
```ruby
|
156
139
|
Cachext.multi key_base, ids, options, &block
|
data/cachext.gemspec
CHANGED
@@ -15,14 +15,17 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
20
|
spec.require_paths = ["lib"]
|
19
21
|
|
20
|
-
spec.add_dependency "
|
22
|
+
spec.add_dependency "activesupport", "~> 4.2"
|
21
23
|
spec.add_dependency "redis"
|
24
|
+
spec.add_dependency "redis-namespace"
|
22
25
|
spec.add_dependency "redlock"
|
26
|
+
spec.add_dependency "faraday"
|
23
27
|
spec.add_dependency "dalli"
|
24
28
|
|
25
|
-
spec.add_development_dependency "activesupport"
|
26
29
|
spec.add_development_dependency "bundler", "~> 1.10"
|
27
30
|
spec.add_development_dependency "rake", "~> 10.0"
|
28
31
|
spec.add_development_dependency "rspec"
|
data/lib/cachext.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "cachext/version"
|
2
|
+
require "faraday/error"
|
2
3
|
|
3
4
|
module Cachext
|
4
5
|
autoload :Breaker, "cachext/breaker"
|
@@ -49,12 +50,7 @@ module Cachext
|
|
49
50
|
end
|
50
51
|
|
51
52
|
def self.configure &block
|
52
|
-
@config_block = block
|
53
53
|
@config = Configuration.setup(&block)
|
54
54
|
@client = Client.new @config
|
55
55
|
end
|
56
|
-
|
57
|
-
def self.forked!
|
58
|
-
configure(&@config_block)
|
59
|
-
end
|
60
56
|
end
|
data/lib/cachext/breaker.rb
CHANGED
@@ -21,9 +21,9 @@ module Cachext
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def increment_failure
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
redis.pipelined do
|
25
|
+
redis.set key_str(:last_failure), Time.now.to_f
|
26
|
+
redis.incr key_str(:monitor)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -38,7 +38,7 @@ module Cachext
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def reset!
|
41
|
-
|
41
|
+
redis.del key_str(:monitor),
|
42
42
|
key_str(:health_check),
|
43
43
|
key_str(:last_failure)
|
44
44
|
end
|
@@ -62,27 +62,27 @@ module Cachext
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def monitor
|
65
|
-
|
65
|
+
redis.get(key_str(:monitor)).to_i
|
66
66
|
end
|
67
67
|
|
68
68
|
def last_failure
|
69
|
-
lf =
|
69
|
+
lf = redis.get key_str(:last_failure)
|
70
70
|
lf.nil? ? nil : lf.to_f
|
71
71
|
end
|
72
72
|
|
73
73
|
def health_check
|
74
|
-
|
74
|
+
redis.get(key_str(:health_check)).to_i
|
75
75
|
end
|
76
76
|
|
77
77
|
def increment_health_check
|
78
|
-
|
78
|
+
redis.incr key_str(:health_check)
|
79
79
|
end
|
80
80
|
|
81
81
|
def key_str(name)
|
82
|
-
"
|
82
|
+
"#{name}:#{key.raw.map(&:to_s).join(":")}"
|
83
83
|
end
|
84
84
|
|
85
|
-
def
|
85
|
+
def redis
|
86
86
|
config.lock_redis
|
87
87
|
end
|
88
88
|
end
|
data/lib/cachext/client.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "redlock"
|
2
|
+
require "redis-namespace"
|
2
3
|
require "thread"
|
3
|
-
require "faraday/error"
|
4
4
|
|
5
5
|
module Cachext
|
6
6
|
class Configuration
|
@@ -59,7 +59,7 @@ module Cachext
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def lock_redis
|
62
|
-
redis
|
62
|
+
@lock_redis ||= Redis::Namespace.new :cachext, redis: redis
|
63
63
|
end
|
64
64
|
|
65
65
|
def log_errors?
|
@@ -69,7 +69,7 @@ module Cachext
|
|
69
69
|
def debug
|
70
70
|
if block_given?
|
71
71
|
if @debug
|
72
|
-
@
|
72
|
+
@mutex.synchronize do
|
73
73
|
yield
|
74
74
|
end
|
75
75
|
end
|
@@ -11,9 +11,7 @@ module Cachext
|
|
11
11
|
def read key, options
|
12
12
|
circuit = breaker.for(key)
|
13
13
|
if circuit.open?
|
14
|
-
|
15
|
-
debug_log { { m: :circuit_open, key: key, msg: "Circuit breaker open, reading from backup", val: val.inspect } }
|
16
|
-
val
|
14
|
+
key.read_backup
|
17
15
|
else
|
18
16
|
circuit.check_health
|
19
17
|
super
|
@@ -19,7 +19,7 @@ module Cachext
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def call_block key, options, &block
|
22
|
-
with_heartbeat_extender key.
|
22
|
+
with_heartbeat_extender key.digest, options.heartbeat_expires do
|
23
23
|
super
|
24
24
|
end
|
25
25
|
end
|
@@ -46,9 +46,9 @@ module Cachext
|
|
46
46
|
def obtain_lock key, options
|
47
47
|
start_time = Time.now
|
48
48
|
|
49
|
-
until lock_info ||= @config.lock_manager.lock(key.
|
49
|
+
until lock_info ||= @config.lock_manager.lock(key.digest, (options.heartbeat_expires * 1000).ceil)
|
50
50
|
if wait_for_lock(key, start_time) == :timeout
|
51
|
-
lock_info = @config.lock_manager.lock(key.
|
51
|
+
lock_info = @config.lock_manager.lock(key.digest, (options.heartbeat_expires * 1000).ceil)
|
52
52
|
raise TimeoutWaitingForLock unless lock_info
|
53
53
|
end
|
54
54
|
end
|
data/lib/cachext/key.rb
CHANGED
data/lib/cachext/multi.rb
CHANGED
data/lib/cachext/version.rb
CHANGED
metadata
CHANGED
@@ -1,17 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cachext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.2
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Donald Plummer
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: redis
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
@@ -25,7 +39,7 @@ dependencies:
|
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: redis
|
42
|
+
name: redis-namespace
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - ">="
|
@@ -53,7 +67,7 @@ dependencies:
|
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: faraday
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - ">="
|
@@ -67,13 +81,13 @@ dependencies:
|
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: dalli
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '0'
|
76
|
-
type: :
|
90
|
+
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
@@ -212,12 +226,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
212
226
|
version: '0'
|
213
227
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
228
|
requirements:
|
215
|
-
- - "
|
229
|
+
- - ">="
|
216
230
|
- !ruby/object:Gem::Version
|
217
|
-
version:
|
231
|
+
version: '0'
|
218
232
|
requirements: []
|
219
233
|
rubyforge_project:
|
220
|
-
rubygems_version: 2.
|
234
|
+
rubygems_version: 2.4.8
|
221
235
|
signing_key:
|
222
236
|
specification_version: 4
|
223
237
|
summary: Cache with lock and backup extensions
|