dalli 2.7.2 → 3.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/{History.md → CHANGELOG.md} +231 -0
  3. data/Gemfile +14 -5
  4. data/LICENSE +1 -1
  5. data/README.md +33 -201
  6. data/lib/dalli/cas/client.rb +2 -57
  7. data/lib/dalli/client.rb +259 -254
  8. data/lib/dalli/compressor.rb +13 -2
  9. data/lib/dalli/key_manager.rb +121 -0
  10. data/lib/dalli/options.rb +7 -7
  11. data/lib/dalli/pid_cache.rb +40 -0
  12. data/lib/dalli/pipelined_getter.rb +177 -0
  13. data/lib/dalli/protocol/base.rb +239 -0
  14. data/lib/dalli/protocol/binary/request_formatter.rb +117 -0
  15. data/lib/dalli/protocol/binary/response_header.rb +36 -0
  16. data/lib/dalli/protocol/binary/response_processor.rb +239 -0
  17. data/lib/dalli/protocol/binary/sasl_authentication.rb +60 -0
  18. data/lib/dalli/protocol/binary.rb +173 -0
  19. data/lib/dalli/protocol/connection_manager.rb +254 -0
  20. data/lib/dalli/protocol/meta/key_regularizer.rb +31 -0
  21. data/lib/dalli/protocol/meta/request_formatter.rb +121 -0
  22. data/lib/dalli/protocol/meta/response_processor.rb +211 -0
  23. data/lib/dalli/protocol/meta.rb +178 -0
  24. data/lib/dalli/protocol/response_buffer.rb +54 -0
  25. data/lib/dalli/protocol/server_config_parser.rb +86 -0
  26. data/lib/dalli/protocol/ttl_sanitizer.rb +45 -0
  27. data/lib/dalli/protocol/value_compressor.rb +85 -0
  28. data/lib/dalli/protocol/value_marshaller.rb +59 -0
  29. data/lib/dalli/protocol/value_serializer.rb +91 -0
  30. data/lib/dalli/protocol.rb +8 -0
  31. data/lib/dalli/ring.rb +97 -86
  32. data/lib/dalli/server.rb +4 -694
  33. data/lib/dalli/servers_arg_normalizer.rb +54 -0
  34. data/lib/dalli/socket.rb +122 -80
  35. data/lib/dalli/version.rb +5 -1
  36. data/lib/dalli.rb +45 -14
  37. data/lib/rack/session/dalli.rb +162 -42
  38. metadata +40 -96
  39. data/Performance.md +0 -42
  40. data/Rakefile +0 -42
  41. data/dalli.gemspec +0 -29
  42. data/lib/action_dispatch/middleware/session/dalli_store.rb +0 -81
  43. data/lib/active_support/cache/dalli_store.rb +0 -363
  44. data/lib/dalli/railtie.rb +0 -7
  45. data/test/benchmark_test.rb +0 -242
  46. data/test/helper.rb +0 -55
  47. data/test/memcached_mock.rb +0 -121
  48. data/test/sasldb +0 -1
  49. data/test/test_active_support.rb +0 -439
  50. data/test/test_cas_client.rb +0 -107
  51. data/test/test_compressor.rb +0 -53
  52. data/test/test_dalli.rb +0 -625
  53. data/test/test_encoding.rb +0 -32
  54. data/test/test_failover.rb +0 -128
  55. data/test/test_network.rb +0 -54
  56. data/test/test_rack_session.rb +0 -341
  57. data/test/test_ring.rb +0 -85
  58. data/test/test_sasl.rb +0 -110
  59. data/test/test_serializer.rb +0 -30
  60. data/test/test_server.rb +0 -80
@@ -1,363 +0,0 @@
1
- # encoding: ascii
2
- require 'dalli'
3
-
4
- module ActiveSupport
5
- module Cache
6
- class DalliStore
7
-
8
- attr_reader :silence, :options
9
- alias_method :silence?, :silence
10
-
11
- # Silence the logger.
12
- def silence!
13
- @silence = true
14
- self
15
- end
16
-
17
- # Silence the logger within a block.
18
- def mute
19
- previous_silence, @silence = defined?(@silence) && @silence, true
20
- yield
21
- ensure
22
- @silence = previous_silence
23
- end
24
-
25
- ESCAPE_KEY_CHARS = /[\x00-\x20%\x7F-\xFF]/
26
-
27
- # Creates a new DalliStore object, with the given memcached server
28
- # addresses. Each address is either a host name, or a host-with-port string
29
- # in the form of "host_name:port". For example:
30
- #
31
- # ActiveSupport::Cache::DalliStore.new("localhost", "server-downstairs.localnetwork:8229")
32
- #
33
- # If no addresses are specified, then DalliStore will connect to
34
- # localhost port 11211 (the default memcached port).
35
- #
36
- # Connection Pool support
37
- #
38
- # If you are using multithreaded Rails, the Rails.cache singleton can become a source
39
- # of contention. You can use a connection pool of Dalli clients with Rails.cache by
40
- # passing :pool_size and/or :pool_timeout:
41
- #
42
- # config.cache_store = :dalli_store, 'localhost:11211', :pool_size => 10
43
- #
44
- # Both pool options default to 5. You must include the `connection_pool` gem if you
45
- # wish to use pool support.
46
- #
47
- def initialize(*addresses)
48
- addresses = addresses.flatten
49
- options = addresses.extract_options!
50
- @options = options.dup
51
-
52
- pool_options = {}
53
- pool_options[:size] = options[:pool_size] if options[:pool_size]
54
- pool_options[:timeout] = options[:pool_timeout] if options[:pool_timeout]
55
-
56
- @options[:compress] ||= @options[:compression]
57
-
58
- addresses.compact!
59
- servers = if addresses.empty?
60
- nil # use the default from Dalli::Client
61
- else
62
- addresses
63
- end
64
- if pool_options.empty?
65
- @data = Dalli::Client.new(servers, @options)
66
- else
67
- @data = ::ConnectionPool.new(pool_options) { Dalli::Client.new(servers, @options.merge(:threadsafe => false)) }
68
- end
69
-
70
- extend Strategy::LocalCache
71
- end
72
-
73
- ##
74
- # Access the underlying Dalli::Client or ConnectionPool instance for
75
- # access to get_multi, etc.
76
- def dalli
77
- @data
78
- end
79
-
80
- def with(&block)
81
- @data.with(&block)
82
- end
83
-
84
- def fetch(name, options=nil)
85
- options ||= {}
86
- name = expanded_key name
87
-
88
- if block_given?
89
- unless options[:force]
90
- entry = instrument(:read, name, options) do |payload|
91
- read_entry(name, options).tap do |result|
92
- if payload
93
- payload[:super_operation] = :fetch
94
- payload[:hit] = !!result
95
- end
96
- end
97
- end
98
- end
99
-
100
- if !entry.nil?
101
- instrument(:fetch_hit, name, options) { |payload| }
102
- entry
103
- else
104
- result = instrument(:generate, name, options) do |payload|
105
- yield
106
- end
107
- write(name, result, options)
108
- result
109
- end
110
- else
111
- read(name, options)
112
- end
113
- end
114
-
115
- def read(name, options=nil)
116
- options ||= {}
117
- name = expanded_key name
118
-
119
- instrument(:read, name, options) do |payload|
120
- entry = read_entry(name, options)
121
- payload[:hit] = !!entry if payload
122
- entry
123
- end
124
- end
125
-
126
- def write(name, value, options=nil)
127
- options ||= {}
128
- name = expanded_key name
129
-
130
- instrument(:write, name, options) do |payload|
131
- with do |connection|
132
- options = options.merge(:connection => connection)
133
- write_entry(name, value, options)
134
- end
135
- end
136
- end
137
-
138
- def exist?(name, options=nil)
139
- options ||= {}
140
- name = expanded_key name
141
-
142
- log(:exist, name, options)
143
- !read_entry(name, options).nil?
144
- end
145
-
146
- def delete(name, options=nil)
147
- options ||= {}
148
- name = expanded_key name
149
-
150
- instrument(:delete, name, options) do |payload|
151
- delete_entry(name, options)
152
- end
153
- end
154
-
155
- # Reads multiple keys from the cache using a single call to the
156
- # servers for all keys. Keys must be Strings.
157
- def read_multi(*names)
158
- names.extract_options!
159
- mapping = names.inject({}) { |memo, name| memo[expanded_key(name)] = name; memo }
160
- instrument(:read_multi, names) do
161
- results = {}
162
- if local_cache
163
- mapping.keys.each do |key|
164
- if value = local_cache.read_entry(key, options)
165
- results[key] = value
166
- end
167
- end
168
- end
169
-
170
- data = with { |c| c.get_multi(mapping.keys - results.keys) }
171
- results.merge!(data)
172
- results.inject({}) do |memo, (inner, _)|
173
- entry = results[inner]
174
- # NB Backwards data compatibility, to be removed at some point
175
- value = (entry.is_a?(ActiveSupport::Cache::Entry) ? entry.value : entry)
176
- memo[mapping[inner]] = value
177
- local_cache.write_entry(inner, value, options) if local_cache
178
- memo
179
- end
180
- end
181
- end
182
-
183
- # Fetches data from the cache, using the given keys. If there is data in
184
- # the cache with the given keys, then that data is returned. Otherwise,
185
- # the supplied block is called for each key for which there was no data,
186
- # and the result will be written to the cache and returned.
187
- def fetch_multi(*names)
188
- options = names.extract_options!
189
- mapping = names.inject({}) { |memo, name| memo[expanded_key(name)] = name; memo }
190
-
191
- instrument(:fetch_multi, names) do
192
- with do |connection|
193
- results = connection.get_multi(mapping.keys)
194
-
195
- connection.multi do
196
- mapping.inject({}) do |memo, (expanded, name)|
197
- memo[name] = results[expanded]
198
- if memo[name].nil?
199
- value = yield(name)
200
- memo[name] = value
201
- options = options.merge(:connection => connection)
202
- write_entry(expanded, value, options)
203
- end
204
-
205
- memo
206
- end
207
- end
208
- end
209
- end
210
- end
211
-
212
- # Increment a cached value. This method uses the memcached incr atomic
213
- # operator and can only be used on values written with the :raw option.
214
- # Calling it on a value not stored with :raw will fail.
215
- # :initial defaults to the amount passed in, as if the counter was initially zero.
216
- # memcached counters cannot hold negative values.
217
- def increment(name, amount = 1, options=nil)
218
- options ||= {}
219
- name = expanded_key name
220
- initial = options.has_key?(:initial) ? options[:initial] : amount
221
- expires_in = options[:expires_in]
222
- instrument(:increment, name, :amount => amount) do
223
- with { |c| c.incr(name, amount, expires_in, initial) }
224
- end
225
- rescue Dalli::DalliError => e
226
- logger.error("DalliError: #{e.message}") if logger
227
- raise if raise_errors?
228
- nil
229
- end
230
-
231
- # Decrement a cached value. This method uses the memcached decr atomic
232
- # operator and can only be used on values written with the :raw option.
233
- # Calling it on a value not stored with :raw will fail.
234
- # :initial defaults to zero, as if the counter was initially zero.
235
- # memcached counters cannot hold negative values.
236
- def decrement(name, amount = 1, options=nil)
237
- options ||= {}
238
- name = expanded_key name
239
- initial = options.has_key?(:initial) ? options[:initial] : 0
240
- expires_in = options[:expires_in]
241
- instrument(:decrement, name, :amount => amount) do
242
- with { |c| c.decr(name, amount, expires_in, initial) }
243
- end
244
- rescue Dalli::DalliError => e
245
- logger.error("DalliError: #{e.message}") if logger
246
- raise if raise_errors?
247
- nil
248
- end
249
-
250
- # Clear the entire cache on all memcached servers. This method should
251
- # be used with care when using a shared cache.
252
- def clear(options=nil)
253
- instrument(:clear, 'flushing all keys') do
254
- with { |c| c.flush_all }
255
- end
256
- rescue Dalli::DalliError => e
257
- logger.error("DalliError: #{e.message}") if logger
258
- raise if raise_errors?
259
- nil
260
- end
261
-
262
- # Clear any local cache
263
- def cleanup(options=nil)
264
- end
265
-
266
- # Get the statistics from the memcached servers.
267
- def stats
268
- with { |c| c.stats }
269
- end
270
-
271
- def reset
272
- with { |c| c.reset }
273
- end
274
-
275
- def logger
276
- Dalli.logger
277
- end
278
-
279
- def logger=(new_logger)
280
- Dalli.logger = new_logger
281
- end
282
-
283
- protected
284
-
285
- # Read an entry from the cache.
286
- def read_entry(key, options) # :nodoc:
287
- entry = with { |c| c.get(key, options) }
288
- # NB Backwards data compatibility, to be removed at some point
289
- entry.is_a?(ActiveSupport::Cache::Entry) ? entry.value : entry
290
- rescue Dalli::DalliError => e
291
- logger.error("DalliError: #{e.message}") if logger
292
- raise if raise_errors?
293
- nil
294
- end
295
-
296
- # Write an entry to the cache.
297
- def write_entry(key, value, options) # :nodoc:
298
- # cleanup LocalCache
299
- cleanup if options[:unless_exist]
300
- method = options[:unless_exist] ? :add : :set
301
- expires_in = options[:expires_in]
302
- connection = options.delete(:connection)
303
- connection.send(method, key, value, expires_in, options)
304
- rescue Dalli::DalliError => e
305
- logger.error("DalliError: #{e.message}") if logger
306
- raise if raise_errors?
307
- false
308
- end
309
-
310
- # Delete an entry from the cache.
311
- def delete_entry(key, options) # :nodoc:
312
- with { |c| c.delete(key) }
313
- rescue Dalli::DalliError => e
314
- logger.error("DalliError: #{e.message}") if logger
315
- raise if raise_errors?
316
- false
317
- end
318
-
319
- private
320
- # Expand key to be a consistent string value. Invoke +cache_key+ if
321
- # object responds to +cache_key+. Otherwise, to_param method will be
322
- # called. If the key is a Hash, then keys will be sorted alphabetically.
323
- def expanded_key(key) # :nodoc:
324
- return key.cache_key.to_s if key.respond_to?(:cache_key)
325
-
326
- case key
327
- when Array
328
- if key.size > 1
329
- key = key.collect{|element| expanded_key(element)}
330
- else
331
- key = key.first
332
- end
333
- when Hash
334
- key = key.sort_by { |k,_| k.to_s }.collect{|k,v| "#{k}=#{v}"}
335
- end
336
-
337
- key = key.to_param
338
- if key.respond_to? :force_encoding
339
- key = key.dup
340
- key.force_encoding('binary')
341
- end
342
- key
343
- end
344
-
345
- def instrument(operation, key, options=nil)
346
- log(operation, key, options)
347
-
348
- payload = { :key => key }
349
- payload.merge!(options) if options.is_a?(Hash)
350
- ActiveSupport::Notifications.instrument("cache_#{operation}.active_support", payload){ yield(payload) }
351
- end
352
-
353
- def log(operation, key, options=nil)
354
- return unless logger && logger.debug? && !silence?
355
- logger.debug("Cache #{operation}: #{key}#{options.blank? ? "" : " (#{options.inspect})"}")
356
- end
357
-
358
- def raise_errors?
359
- !!@options[:raise_errors]
360
- end
361
- end
362
- end
363
- end
data/lib/dalli/railtie.rb DELETED
@@ -1,7 +0,0 @@
1
- module Dalli
2
- class Railtie < ::Rails::Railtie
3
- config.before_configuration do
4
- config.cache_store = :dalli_store
5
- end
6
- end
7
- end
@@ -1,242 +0,0 @@
1
- require 'helper'
2
- require 'benchmark'
3
- require 'active_support/cache/dalli_store'
4
-
5
- describe 'performance' do
6
- before do
7
- puts "Testing #{Dalli::VERSION} with #{RUBY_DESCRIPTION}"
8
- # We'll use a simple @value to try to avoid spending time in Marshal,
9
- # which is a constant penalty that both clients have to pay
10
- @value = []
11
- @marshalled = Marshal.dump(@value)
12
-
13
- @servers = ['127.0.0.1:19122', 'localhost:19122']
14
- @key1 = "Short"
15
- @key2 = "Sym1-2-3::45"*8
16
- @key3 = "Long"*40
17
- @key4 = "Medium"*8
18
- # 5 and 6 are only used for multiget miss test
19
- @key5 = "Medium2"*8
20
- @key6 = "Long3"*40
21
- @counter = 'counter'
22
- end
23
-
24
- it 'runs benchmarks' do
25
- memcached do
26
-
27
- Benchmark.bm(37) do |x|
28
-
29
- n = 2500
30
-
31
- @ds = ActiveSupport::Cache::DalliStore.new(@servers)
32
- x.report("mixed:rails:dalli") do
33
- n.times do
34
- @ds.read @key1
35
- @ds.write @key2, @value
36
- @ds.fetch(@key3) { @value }
37
- @ds.fetch(@key2) { @value }
38
- @ds.fetch(@key1) { @value }
39
- @ds.write @key2, @value, :unless_exists => true
40
- @ds.delete @key2
41
- @ds.increment @counter, 1, :initial => 100
42
- @ds.increment @counter, 1, :expires_in => 12
43
- @ds.decrement @counter, 1
44
- end
45
- end
46
-
47
- x.report("mixed:rails-localcache:dalli") do
48
- n.times do
49
- @ds.with_local_cache do
50
- @ds.read @key1
51
- @ds.write @key2, @value
52
- @ds.fetch(@key3) { @value }
53
- @ds.fetch(@key2) { @value }
54
- @ds.fetch(@key1) { @value }
55
- @ds.write @key2, @value, :unless_exists => true
56
- @ds.delete @key2
57
- @ds.increment @counter, 1, :initial => 100
58
- @ds.increment @counter, 1, :expires_in => 12
59
- @ds.decrement @counter, 1
60
- end
61
- end
62
- end
63
-
64
- @ds.clear
65
- sizeable_data = "<marquee>some view partial data</marquee>" * 50
66
- [@key1, @key2, @key3, @key4, @key5, @key6].each do |key|
67
- @ds.write(key, sizeable_data)
68
- end
69
-
70
- x.report("read_multi_big:rails:dalli") do
71
- n.times do
72
- @ds.read_multi @key1, @key2, @key3, @key4
73
- @ds.read @key1
74
- @ds.read @key2
75
- @ds.read @key3
76
- @ds.read @key4
77
- @ds.read @key1
78
- @ds.read @key2
79
- @ds.read @key3
80
- @ds.read_multi @key1, @key2, @key3
81
- end
82
- end
83
-
84
- x.report("read_multi_big:rails-localcache:dalli") do
85
- n.times do
86
- @ds.with_local_cache do
87
- @ds.read_multi @key1, @key2, @key3, @key4
88
- @ds.read @key1
89
- @ds.read @key2
90
- @ds.read @key3
91
- @ds.read @key4
92
- end
93
- @ds.with_local_cache do
94
- @ds.read @key1
95
- @ds.read @key2
96
- @ds.read @key3
97
- @ds.read_multi @key1, @key2, @key3
98
- end
99
- end
100
- end
101
-
102
- @m = Dalli::Client.new(@servers)
103
- x.report("set:plain:dalli") do
104
- n.times do
105
- @m.set @key1, @marshalled, 0, :raw => true
106
- @m.set @key2, @marshalled, 0, :raw => true
107
- @m.set @key3, @marshalled, 0, :raw => true
108
- @m.set @key1, @marshalled, 0, :raw => true
109
- @m.set @key2, @marshalled, 0, :raw => true
110
- @m.set @key3, @marshalled, 0, :raw => true
111
- end
112
- end
113
-
114
- @m = Dalli::Client.new(@servers)
115
- x.report("setq:plain:dalli") do
116
- @m.multi do
117
- n.times do
118
- @m.set @key1, @marshalled, 0, :raw => true
119
- @m.set @key2, @marshalled, 0, :raw => true
120
- @m.set @key3, @marshalled, 0, :raw => true
121
- @m.set @key1, @marshalled, 0, :raw => true
122
- @m.set @key2, @marshalled, 0, :raw => true
123
- @m.set @key3, @marshalled, 0, :raw => true
124
- end
125
- end
126
- end
127
-
128
- @m = Dalli::Client.new(@servers)
129
- x.report("set:ruby:dalli") do
130
- n.times do
131
- @m.set @key1, @value
132
- @m.set @key2, @value
133
- @m.set @key3, @value
134
- @m.set @key1, @value
135
- @m.set @key2, @value
136
- @m.set @key3, @value
137
- end
138
- end
139
-
140
- @m = Dalli::Client.new(@servers)
141
- x.report("get:plain:dalli") do
142
- n.times do
143
- @m.get @key1, :raw => true
144
- @m.get @key2, :raw => true
145
- @m.get @key3, :raw => true
146
- @m.get @key1, :raw => true
147
- @m.get @key2, :raw => true
148
- @m.get @key3, :raw => true
149
- end
150
- end
151
-
152
- @m = Dalli::Client.new(@servers)
153
- x.report("get:ruby:dalli") do
154
- n.times do
155
- @m.get @key1
156
- @m.get @key2
157
- @m.get @key3
158
- @m.get @key1
159
- @m.get @key2
160
- @m.get @key3
161
- end
162
- end
163
-
164
- @m = Dalli::Client.new(@servers)
165
- x.report("multiget:ruby:dalli") do
166
- n.times do
167
- # We don't use the keys array because splat is slow
168
- @m.get_multi @key1, @key2, @key3, @key4, @key5, @key6
169
- end
170
- end
171
-
172
- @m = Dalli::Client.new(@servers)
173
- x.report("missing:ruby:dalli") do
174
- n.times do
175
- begin @m.delete @key1; rescue; end
176
- begin @m.get @key1; rescue; end
177
- begin @m.delete @key2; rescue; end
178
- begin @m.get @key2; rescue; end
179
- begin @m.delete @key3; rescue; end
180
- begin @m.get @key3; rescue; end
181
- end
182
- end
183
-
184
- @m = Dalli::Client.new(@servers)
185
- x.report("mixed:ruby:dalli") do
186
- n.times do
187
- @m.set @key1, @value
188
- @m.set @key2, @value
189
- @m.set @key3, @value
190
- @m.get @key1
191
- @m.get @key2
192
- @m.get @key3
193
- @m.set @key1, @value
194
- @m.get @key1
195
- @m.set @key2, @value
196
- @m.get @key2
197
- @m.set @key3, @value
198
- @m.get @key3
199
- end
200
- end
201
-
202
- @m = Dalli::Client.new(@servers)
203
- x.report("mixedq:ruby:dalli") do
204
- @m.multi do
205
- n.times do
206
- @m.set @key1, @value
207
- @m.set @key2, @value
208
- @m.set @key3, @value
209
- @m.get @key1
210
- @m.get @key2
211
- @m.get @key3
212
- @m.set @key1, @value
213
- @m.get @key1
214
- @m.set @key2, @value
215
- @m.replace @key2, @value
216
- @m.delete @key3
217
- @m.add @key3, @value
218
- @m.get @key2
219
- @m.set @key3, @value
220
- @m.get @key3
221
- end
222
- end
223
- end
224
-
225
- @m = Dalli::Client.new(@servers)
226
- x.report("incr:ruby:dalli") do
227
- counter = 'foocount'
228
- n.times do
229
- @m.incr counter, 1, 0, 1
230
- end
231
- n.times do
232
- @m.decr counter, 1
233
- end
234
-
235
- assert_equal 0, @m.incr(counter, 0)
236
- end
237
-
238
- end
239
- end
240
-
241
- end
242
- end
data/test/helper.rb DELETED
@@ -1,55 +0,0 @@
1
- $TESTING = true
2
- require 'rubygems'
3
- # require 'simplecov'
4
- # SimpleCov.start
5
- require 'minitest/pride'
6
- require 'minitest/autorun'
7
- require 'mocha/setup'
8
- require 'memcached_mock'
9
-
10
- ENV['MEMCACHED_SASL_PWDB'] = "#{File.dirname(__FILE__)}/sasldb"
11
-
12
- WANT_RAILS_VERSION = ENV['RAILS_VERSION'] || '>= 3.0.0'
13
- gem 'rails', WANT_RAILS_VERSION
14
- require 'rails'
15
- puts "Testing with Rails #{Rails.version}"
16
-
17
- require 'dalli'
18
- require 'logger'
19
-
20
- Dalli.logger = Logger.new(STDOUT)
21
- Dalli.logger.level = Logger::ERROR
22
-
23
- class MiniTest::Spec
24
- include MemcachedMock::Helper
25
-
26
- def assert_error(error, regexp=nil, &block)
27
- ex = assert_raises(error, &block)
28
- assert_match(regexp, ex.message, "#{ex.class.name}: #{ex.message}\n#{ex.backtrace.join("\n\t")}")
29
- end
30
-
31
- def op_cas_succeeds(rsp)
32
- rsp.is_a?(Integer) && rsp > 0
33
- end
34
-
35
- def op_replace_succeeds(rsp)
36
- rsp.is_a?(Integer) && rsp > 0
37
- end
38
-
39
- # add and set must have the same return value because of DalliStore#write_entry
40
- def op_addset_succeeds(rsp)
41
- rsp.is_a?(Integer) && rsp > 0
42
- end
43
-
44
- def with_activesupport
45
- require 'active_support/all'
46
- require 'active_support/cache/dalli_store'
47
- yield
48
- end
49
-
50
- def with_actionpack
51
- require 'action_dispatch'
52
- require 'action_controller'
53
- yield
54
- end
55
- end