redis-activesupport 5.0.7 → 5.2.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +11 -2
- data/lib/active_support/cache/redis_store.rb +59 -37
- data/lib/redis/active_support/version.rb +1 -1
- data/test/active_support/cache/redis_store_test.rb +3 -3
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e2dae1b761efefc450f3d0058ac0e4079b7e3cc
|
4
|
+
data.tar.gz: 066cc4f56fa42e97f9b0d83c04cdc5bb70062dd3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94636bbc45b68dfa930864d90d090d9bef4e7bd2bb59e114f5efe06bd3f3f18cfdf474e34fe9e7f4bf9b15ab5b51c42aad4a3ad12b9a374fe6311e0c78c661da
|
7
|
+
data.tar.gz: c1ebf00acb907f9d5047d8cab835c0d76e78e91a01355e0fe25f2e754b294d83118398db3c4b690b5c3194b25875182cf1e4b2c2ef5e0c27a5f49744682f6f4e
|
data/.travis.yml
CHANGED
@@ -14,10 +14,19 @@ matrix:
|
|
14
14
|
allow_failures:
|
15
15
|
- rvm: jruby-head
|
16
16
|
- rvm: ruby-head
|
17
|
+
exclude:
|
17
18
|
- rvm: 2.0
|
18
|
-
gemfile: gemfiles/
|
19
|
+
gemfile: gemfiles/activesupport_50.gemfile
|
19
20
|
- rvm: 2.1
|
20
|
-
gemfile: gemfiles/
|
21
|
+
gemfile: gemfiles/activesupport_50.gemfile
|
22
|
+
- rvm: 2.0
|
23
|
+
gemfile: gemfiles/activesupport_51.gemfile
|
24
|
+
- rvm: 2.1
|
25
|
+
gemfile: gemfiles/activesupport_51.gemfile
|
26
|
+
- rvm: 2.0
|
27
|
+
gemfile: gemfiles/activesupport_52.gemfile
|
28
|
+
- rvm: 2.1
|
29
|
+
gemfile: gemfiles/activesupport_52.gemfile
|
21
30
|
notifications:
|
22
31
|
webhooks: https://www.travisbuddy.com/
|
23
32
|
on_success: never
|
@@ -13,6 +13,12 @@ module ActiveSupport
|
|
13
13
|
Redis::BaseConnectionError
|
14
14
|
].freeze
|
15
15
|
|
16
|
+
DEFAULT_ERROR_HANDLER = -> (method: nil, returning: nil, exception: nil) do
|
17
|
+
if logger
|
18
|
+
logger.error { "RedisStore: #{method} failed, returned #{returning.inspect}: #{exception.class}: #{exception.message}" }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
16
22
|
attr_reader :data
|
17
23
|
|
18
24
|
# Instantiate the store.
|
@@ -65,16 +71,18 @@ module ActiveSupport
|
|
65
71
|
::Redis::Store::Factory.create(*addresses, @options)
|
66
72
|
end
|
67
73
|
|
74
|
+
@error_handler = @options[:error_handler] || DEFAULT_ERROR_HANDLER
|
75
|
+
|
68
76
|
super(@options)
|
69
77
|
end
|
70
78
|
|
71
79
|
def write(name, value, options = nil)
|
72
80
|
options = merged_options(options)
|
73
81
|
instrument(:write, name, options) do |payload|
|
74
|
-
entry = options[:raw].present? ? value : Entry.new(value, options)
|
75
82
|
if options[:expires_in].present? && options[:race_condition_ttl].present? && options[:raw].blank?
|
76
83
|
options[:expires_in] = options[:expires_in].to_f + options[:race_condition_ttl].to_f
|
77
84
|
end
|
85
|
+
entry = options[:raw].present? ? value : Entry.new(value, options)
|
78
86
|
write_entry(normalize_key(name, options), entry, options)
|
79
87
|
end
|
80
88
|
end
|
@@ -91,14 +99,13 @@ module ActiveSupport
|
|
91
99
|
def delete_matched(matcher, options = nil)
|
92
100
|
options = merged_options(options)
|
93
101
|
instrument(:delete_matched, matcher.inspect) do
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
102
|
+
failsafe(:read_multi, returning: false) do
|
103
|
+
matcher = key_matcher(matcher, options)
|
104
|
+
begin
|
105
|
+
with do |store|
|
106
|
+
!(keys = store.keys(matcher)).empty? && store.del(*keys)
|
107
|
+
end
|
98
108
|
end
|
99
|
-
rescue *ERRORS_TO_RESCUE
|
100
|
-
raise if raise_errors?
|
101
|
-
false
|
102
109
|
end
|
103
110
|
end
|
104
111
|
end
|
@@ -118,16 +125,15 @@ module ActiveSupport
|
|
118
125
|
args.flatten!
|
119
126
|
|
120
127
|
instrument(:read_multi, names) do |payload|
|
121
|
-
|
122
|
-
|
128
|
+
failsafe(:read_multi, returning: {}) do
|
129
|
+
values = with { |c| c.mget(*args) }
|
130
|
+
values.map! { |v| v.is_a?(ActiveSupport::Cache::Entry) ? v.value : v }
|
123
131
|
|
124
|
-
|
125
|
-
|
132
|
+
Hash[names.zip(values)].reject{|k,v| v.nil?}.tap do |result|
|
133
|
+
payload[:hits] = result.keys if payload
|
134
|
+
end
|
126
135
|
end
|
127
136
|
end
|
128
|
-
rescue *ERRORS_TO_RESCUE
|
129
|
-
raise if raise_errors?
|
130
|
-
{}
|
131
137
|
end
|
132
138
|
|
133
139
|
def fetch_multi(*names)
|
@@ -147,7 +153,7 @@ module ActiveSupport
|
|
147
153
|
memo
|
148
154
|
end
|
149
155
|
|
150
|
-
|
156
|
+
failsafe(:fetch_multi_write) do
|
151
157
|
with do |c|
|
152
158
|
c.multi do
|
153
159
|
need_writes.each do |name, value|
|
@@ -155,8 +161,6 @@ module ActiveSupport
|
|
155
161
|
end
|
156
162
|
end
|
157
163
|
end
|
158
|
-
rescue *ERRORS_TO_RESCUE
|
159
|
-
raise if raise_errors?
|
160
164
|
end
|
161
165
|
|
162
166
|
fetched
|
@@ -186,7 +190,9 @@ module ActiveSupport
|
|
186
190
|
def increment(key, amount = 1, options = {})
|
187
191
|
options = merged_options(options)
|
188
192
|
instrument(:increment, key, :amount => amount) do
|
189
|
-
|
193
|
+
failsafe(:increment) do
|
194
|
+
with{|c| c.incrby normalize_key(key, options), amount}
|
195
|
+
end
|
190
196
|
end
|
191
197
|
end
|
192
198
|
|
@@ -214,7 +220,9 @@ module ActiveSupport
|
|
214
220
|
def decrement(key, amount = 1, options = {})
|
215
221
|
options = merged_options(options)
|
216
222
|
instrument(:decrement, key, :amount => amount) do
|
217
|
-
|
223
|
+
failsafe(:decrement) do
|
224
|
+
with{|c| c.decrby normalize_key(key, options), amount}
|
225
|
+
end
|
218
226
|
end
|
219
227
|
end
|
220
228
|
|
@@ -226,7 +234,9 @@ module ActiveSupport
|
|
226
234
|
# Clear all the data from the store.
|
227
235
|
def clear
|
228
236
|
instrument(:clear, nil, nil) do
|
229
|
-
|
237
|
+
failsafe(:clear) do
|
238
|
+
with(&:flushdb)
|
239
|
+
end
|
230
240
|
end
|
231
241
|
end
|
232
242
|
|
@@ -255,20 +265,18 @@ module ActiveSupport
|
|
255
265
|
|
256
266
|
protected
|
257
267
|
def write_entry(key, entry, options)
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
false
|
268
|
+
failsafe(:write_entry, returning: false) do
|
269
|
+
method = options && options[:unless_exist] ? :setnx : :set
|
270
|
+
with { |client| client.send method, key, entry, options }
|
271
|
+
end
|
263
272
|
end
|
264
273
|
|
265
274
|
def read_entry(key, options)
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
nil
|
275
|
+
failsafe(:read_entry) do
|
276
|
+
entry = with { |c| c.get key, options }
|
277
|
+
return unless entry
|
278
|
+
entry.is_a?(Entry) ? entry : Entry.new(entry)
|
279
|
+
end
|
272
280
|
end
|
273
281
|
|
274
282
|
##
|
@@ -277,10 +285,9 @@ module ActiveSupport
|
|
277
285
|
# It's really needed and use
|
278
286
|
#
|
279
287
|
def delete_entry(key, options)
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
false
|
288
|
+
failsafe(:delete_entry, returning: false) do
|
289
|
+
with { |c| c.del key }
|
290
|
+
end
|
284
291
|
end
|
285
292
|
|
286
293
|
def raise_errors?
|
@@ -305,12 +312,27 @@ module ActiveSupport
|
|
305
312
|
end
|
306
313
|
|
307
314
|
private
|
308
|
-
|
309
315
|
if ActiveSupport::VERSION::MAJOR < 5
|
310
316
|
def normalize_key(*args)
|
311
317
|
namespaced_key(*args)
|
312
318
|
end
|
313
319
|
end
|
320
|
+
|
321
|
+
def failsafe(method, returning: nil)
|
322
|
+
yield
|
323
|
+
rescue ::Redis::BaseConnectionError => e
|
324
|
+
raise if raise_errors?
|
325
|
+
handle_exception(exception: e, method: method, returning: returning)
|
326
|
+
returning
|
327
|
+
end
|
328
|
+
|
329
|
+
def handle_exception(exception: nil, method: nil, returning: nil)
|
330
|
+
if @error_handler
|
331
|
+
@error_handler.(method: method, exception: exception, returning: returning)
|
332
|
+
end
|
333
|
+
rescue => failsafe
|
334
|
+
warn("RedisStore ignored exception in handle_exception: #{failsafe.class}: #{failsafe.message}\n #{failsafe.backtrace.join("\n ")}")
|
335
|
+
end
|
314
336
|
end
|
315
337
|
end
|
316
338
|
end
|
@@ -377,7 +377,7 @@ describe ActiveSupport::Cache::RedisStore do
|
|
377
377
|
|
378
378
|
describe "race_condition_ttl on fetch" do
|
379
379
|
it "persist entry for longer than given ttl" do
|
380
|
-
options = { force: true, expires_in: 1.second, race_condition_ttl: 2.seconds }
|
380
|
+
options = { force: true, expires_in: 1.second, race_condition_ttl: 2.seconds, version: Time.now.to_i }
|
381
381
|
@store.fetch("rabbit", options) { @rabbit }
|
382
382
|
sleep 1.1
|
383
383
|
@store.delete("rabbit").must_equal(1)
|
@@ -385,12 +385,12 @@ describe ActiveSupport::Cache::RedisStore do
|
|
385
385
|
|
386
386
|
it "limits stampede time to read-write duration" do
|
387
387
|
first_rabbit = second_rabbit = nil
|
388
|
-
options = { force: true, expires_in: 1.second, race_condition_ttl: 2.seconds }
|
388
|
+
options = { force: true, expires_in: 1.second, race_condition_ttl: 2.seconds, version: Time.now.to_i }
|
389
389
|
@store.fetch("rabbit", options) { @rabbit }
|
390
390
|
sleep 1
|
391
391
|
|
392
392
|
th1 = Thread.new do
|
393
|
-
first_rabbit = @store.fetch("rabbit",
|
393
|
+
first_rabbit = @store.fetch("rabbit", options) do
|
394
394
|
sleep 1
|
395
395
|
@white_rabbit
|
396
396
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-activesupport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.2.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-08-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis-store
|
@@ -196,9 +196,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
196
196
|
version: '0'
|
197
197
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
198
198
|
requirements:
|
199
|
-
- - "
|
199
|
+
- - ">"
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version:
|
201
|
+
version: 1.3.1
|
202
202
|
requirements: []
|
203
203
|
rubyforge_project: redis-activesupport
|
204
204
|
rubygems_version: 2.6.14
|