redis-activesupport 5.0.7 → 5.2.0.pre
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/.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
|