memcached 0.19.2 → 0.19.3
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.
- data.tar.gz.sig +0 -0
- data/CHANGELOG +1 -0
- data/ext/extconf.rb +2 -2
- data/lib/memcached/memcached.rb +114 -24
- data/memcached.gemspec +2 -2
- data/test/unit/memcached_test.rb +129 -9
- metadata +3 -3
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG
CHANGED
data/ext/extconf.rb
CHANGED
@@ -34,11 +34,11 @@ if !ENV["EXTERNAL_LIB"]
|
|
34
34
|
raise "'#{cmd}' failed" unless system(cmd)
|
35
35
|
|
36
36
|
puts "Patching libmemcached source."
|
37
|
-
puts(cmd = "patch -p1 < libmemcached.patch")
|
37
|
+
puts(cmd = "patch -p1 -Z < libmemcached.patch")
|
38
38
|
raise "'#{cmd}' failed" unless system(cmd)
|
39
39
|
|
40
40
|
puts "Patching libmemcached with SASL support."
|
41
|
-
puts(cmd = "patch -p1 < sasl.patch")
|
41
|
+
puts(cmd = "patch -p1 -Z < sasl.patch")
|
42
42
|
raise "'#{cmd}' failed" unless system(cmd)
|
43
43
|
|
44
44
|
Dir.chdir(BUNDLE_PATH) do
|
data/lib/memcached/memcached.rb
CHANGED
@@ -31,7 +31,21 @@ class Memcached
|
|
31
31
|
:verify_key => true,
|
32
32
|
:use_udp => false,
|
33
33
|
:binary_protocol => false,
|
34
|
-
:credentials => nil
|
34
|
+
:credentials => nil,
|
35
|
+
:exception_retry_limit => 5,
|
36
|
+
:exceptions_to_retry => [
|
37
|
+
Memcached::ServerIsMarkedDead,
|
38
|
+
Memcached::ATimeoutOccurred,
|
39
|
+
Memcached::ConnectionBindFailure,
|
40
|
+
Memcached::ConnectionFailure,
|
41
|
+
Memcached::ConnectionSocketCreateFailure,
|
42
|
+
Memcached::Failure,
|
43
|
+
Memcached::MemoryAllocationFailure,
|
44
|
+
Memcached::ReadFailure,
|
45
|
+
Memcached::ServerError,
|
46
|
+
Memcached::SystemError,
|
47
|
+
Memcached::UnknownReadFailure,
|
48
|
+
Memcached::WriteFailure]
|
35
49
|
}
|
36
50
|
|
37
51
|
#:stopdoc:
|
@@ -75,6 +89,8 @@ Valid option parameters are:
|
|
75
89
|
<tt>:binary_protocol</tt>:: Use the binary protocol to reduce query processing overhead. Defaults to false.
|
76
90
|
<tt>:sort_hosts</tt>:: Whether to force the server list to stay sorted. This defeats consistent hashing and is rarely useful.
|
77
91
|
<tt>:verify_key</tt>:: Validate keys before accepting them. Never disable this.
|
92
|
+
<tt>:exception_retry_limit</tt>:: Retry this many times before raising the exception if the exception is in <tt>:exceptions_to_retry</tt>.
|
93
|
+
<tt>:exceptions_to_retry</tt>:: Exceptions listed here will be retried <tt>:exception_retry_limit</tt> times before getting raised.
|
78
94
|
|
79
95
|
Please note that when pipelining is enabled, setter and deleter methods do not raise on errors. For example, if you try to set an invalid key with <tt>:no_block => true</tt>, it will appear to succeed. The actual setting of the key occurs after libmemcached has returned control to your program, so there is no way to backtrack and raise the exception.
|
80
96
|
|
@@ -231,6 +247,12 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
231
247
|
self
|
232
248
|
end
|
233
249
|
|
250
|
+
# Should retry the exception
|
251
|
+
def should_retry(e)
|
252
|
+
options[:exceptions_to_retry].each {|ex_class| return true if e.instance_of?(ex_class)}
|
253
|
+
false
|
254
|
+
end
|
255
|
+
|
234
256
|
#:stopdoc:
|
235
257
|
alias :dup :clone #:nodoc:
|
236
258
|
#:startdoc:
|
@@ -282,23 +304,34 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
282
304
|
#
|
283
305
|
def set(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
284
306
|
value = marshal ? Marshal.dump(value) : value.to_s
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
307
|
+
begin
|
308
|
+
check_return_code(
|
309
|
+
Lib.memcached_set(@struct, key, value, ttl, flags),
|
310
|
+
key
|
311
|
+
)
|
312
|
+
rescue => e
|
313
|
+
tries ||= 0
|
314
|
+
retry if e.instance_of?(ClientError) && !tries
|
315
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
316
|
+
tries += 1
|
317
|
+
retry
|
318
|
+
end
|
293
319
|
end
|
294
320
|
|
295
321
|
# Add a key/value pair. Raises <b>Memcached::NotStored</b> if the key already exists on the server. The parameters are the same as <tt>set</tt>.
|
296
322
|
def add(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
297
323
|
value = marshal ? Marshal.dump(value) : value.to_s
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
324
|
+
begin
|
325
|
+
check_return_code(
|
326
|
+
Lib.memcached_add(@struct, key, value, ttl, flags),
|
327
|
+
key
|
328
|
+
)
|
329
|
+
rescue => e
|
330
|
+
tries ||= 0
|
331
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
332
|
+
tries += 1
|
333
|
+
retry
|
334
|
+
end
|
302
335
|
end
|
303
336
|
|
304
337
|
# Increment a key's value. Accepts a String <tt>key</tt>. Raises <b>Memcached::NotFound</b> if the key does not exist.
|
@@ -310,6 +343,11 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
310
343
|
ret, value = Lib.memcached_increment(@struct, key, offset)
|
311
344
|
check_return_code(ret, key)
|
312
345
|
value
|
346
|
+
rescue => e
|
347
|
+
tries ||= 0
|
348
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
349
|
+
tries += 1
|
350
|
+
retry
|
313
351
|
end
|
314
352
|
|
315
353
|
# Decrement a key's value. The parameters and exception behavior are the same as <tt>increment</tt>.
|
@@ -317,6 +355,11 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
317
355
|
ret, value = Lib.memcached_decrement(@struct, key, offset)
|
318
356
|
check_return_code(ret, key)
|
319
357
|
value
|
358
|
+
rescue => e
|
359
|
+
tries ||= 0
|
360
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
361
|
+
tries += 1
|
362
|
+
retry
|
320
363
|
end
|
321
364
|
|
322
365
|
#:stopdoc:
|
@@ -327,10 +370,17 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
327
370
|
# Replace a key/value pair. Raises <b>Memcached::NotFound</b> if the key does not exist on the server. The parameters are the same as <tt>set</tt>.
|
328
371
|
def replace(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
329
372
|
value = marshal ? Marshal.dump(value) : value.to_s
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
373
|
+
begin
|
374
|
+
check_return_code(
|
375
|
+
Lib.memcached_replace(@struct, key, value, ttl, flags),
|
376
|
+
key
|
377
|
+
)
|
378
|
+
rescue => e
|
379
|
+
tries ||= 0
|
380
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
381
|
+
tries += 1
|
382
|
+
retry
|
383
|
+
end
|
334
384
|
end
|
335
385
|
|
336
386
|
# Appends a string to a key's value. Accepts a String <tt>key</tt> and a String <tt>value</tt>. Raises <b>Memcached::NotFound</b> if the key does not exist on the server.
|
@@ -342,6 +392,11 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
342
392
|
Lib.memcached_append(@struct, key, value.to_s, IGNORED, IGNORED),
|
343
393
|
key
|
344
394
|
)
|
395
|
+
rescue => e
|
396
|
+
tries ||= 0
|
397
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
398
|
+
tries += 1
|
399
|
+
retry
|
345
400
|
end
|
346
401
|
|
347
402
|
# Prepends a string to a key's value. The parameters and exception behavior are the same as <tt>append</tt>.
|
@@ -351,6 +406,11 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
351
406
|
Lib.memcached_prepend(@struct, key, value.to_s, IGNORED, IGNORED),
|
352
407
|
key
|
353
408
|
)
|
409
|
+
rescue => e
|
410
|
+
tries ||= 0
|
411
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
412
|
+
tries += 1
|
413
|
+
retry
|
354
414
|
end
|
355
415
|
|
356
416
|
# Reads a key's value from the server and yields it to a block. Replaces the key's value with the result of the block as long as the key hasn't been updated in the meantime, otherwise raises <b>Memcached::NotStored</b>. Accepts a String <tt>key</tt> and a block.
|
@@ -358,22 +418,37 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
358
418
|
# Also accepts an optional <tt>ttl</tt> value.
|
359
419
|
#
|
360
420
|
# CAS stands for "compare and swap", and avoids the need for manual key mutexing. CAS support must be enabled in Memcached.new or a <b>Memcached::ClientError</b> will be raised. Note that CAS may be buggy in memcached itself.
|
361
|
-
#
|
421
|
+
# :retry_on_exceptions does not apply to this method
|
362
422
|
def cas(key, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
363
423
|
raise ClientError, "CAS not enabled for this Memcached instance" unless options[:support_cas]
|
364
424
|
|
365
|
-
|
366
|
-
|
425
|
+
begin
|
426
|
+
value, flags, ret = Lib.memcached_get_rvalue(@struct, key)
|
427
|
+
check_return_code(ret, key)
|
428
|
+
rescue => e
|
429
|
+
tries_for_get ||= 0
|
430
|
+
raise unless tries_for_get < options[:exception_retry_limit] && should_retry(e)
|
431
|
+
tries_for_get += 1
|
432
|
+
retry
|
433
|
+
end
|
434
|
+
|
367
435
|
cas = @struct.result.cas
|
368
436
|
|
369
437
|
value = Marshal.load(value) if marshal
|
370
438
|
value = yield value
|
371
439
|
value = Marshal.dump(value) if marshal
|
372
440
|
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
441
|
+
begin
|
442
|
+
check_return_code(
|
443
|
+
Lib.memcached_cas(@struct, key, value, ttl, flags, cas),
|
444
|
+
key
|
445
|
+
)
|
446
|
+
rescue => e
|
447
|
+
tries_for_cas ||= 0
|
448
|
+
raise unless tries_for_cas < options[:exception_retry_limit] && should_retry(e)
|
449
|
+
tries_for_cas += 1
|
450
|
+
retry
|
451
|
+
end
|
377
452
|
end
|
378
453
|
|
379
454
|
alias :compare_and_swap :cas
|
@@ -386,6 +461,11 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
386
461
|
Lib.memcached_delete(@struct, key, IGNORED),
|
387
462
|
key
|
388
463
|
)
|
464
|
+
rescue => e
|
465
|
+
tries ||= 0
|
466
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
467
|
+
tries += 1
|
468
|
+
retry
|
389
469
|
end
|
390
470
|
|
391
471
|
# Flushes all key/value pairs from all the servers.
|
@@ -393,6 +473,11 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
393
473
|
check_return_code(
|
394
474
|
Lib.memcached_flush(@struct, IGNORED)
|
395
475
|
)
|
476
|
+
rescue => e
|
477
|
+
tries ||= 0
|
478
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
479
|
+
tries += 1
|
480
|
+
retry
|
396
481
|
end
|
397
482
|
|
398
483
|
### Getters
|
@@ -428,6 +513,11 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
|
|
428
513
|
check_return_code(ret, keys)
|
429
514
|
marshal ? Marshal.load(value) : value
|
430
515
|
end
|
516
|
+
rescue => e
|
517
|
+
tries ||= 0
|
518
|
+
raise unless tries < options[:exception_retry_limit] && should_retry(e)
|
519
|
+
tries += 1
|
520
|
+
retry
|
431
521
|
end
|
432
522
|
|
433
523
|
### Information methods
|
data/memcached.gemspec
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{memcached}
|
5
|
-
s.version = "0.19.
|
5
|
+
s.version = "0.19.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Evan Weaver"]
|
9
9
|
s.cert_chain = ["/Users/eweaver/p/configuration/gem_certificates/evan_weaver-original-public_cert.pem"]
|
10
|
-
s.date = %q{2010-
|
10
|
+
s.date = %q{2010-04-20}
|
11
11
|
s.description = %q{An interface to the libmemcached C client.}
|
12
12
|
s.email = %q{}
|
13
13
|
s.extensions = ["ext/extconf.rb"]
|
data/test/unit/memcached_test.rb
CHANGED
@@ -23,6 +23,7 @@ class MemcachedTest < Test::Unit::TestCase
|
|
23
23
|
:prefix_key => @prefix_key,
|
24
24
|
:hash => :default,
|
25
25
|
:distribution => :modula,
|
26
|
+
# binary_protocol does not work -- test_get, test_get, test_append, and test_missing_append will fail when it is set to true.
|
26
27
|
:binary_protocol => true}
|
27
28
|
@binary_protocol_cache = Memcached.new(@servers, @binary_protocol_options)
|
28
29
|
|
@@ -263,21 +264,21 @@ class MemcachedTest < Test::Unit::TestCase
|
|
263
264
|
|
264
265
|
def test_get_with_server_timeout
|
265
266
|
socket = stub_server 43047
|
266
|
-
cache = Memcached.new("localhost:43047:1", :timeout => 0.5)
|
267
|
+
cache = Memcached.new("localhost:43047:1", :timeout => 0.5, :exception_retry_limit => 0)
|
267
268
|
assert 0.49 < (Benchmark.measure do
|
268
269
|
assert_raise(Memcached::ATimeoutOccurred) do
|
269
270
|
result = cache.get key
|
270
271
|
end
|
271
272
|
end).real
|
272
273
|
|
273
|
-
cache = Memcached.new("localhost:43047:1", :poll_timeout => 0.001, :rcv_timeout => 0.5)
|
274
|
+
cache = Memcached.new("localhost:43047:1", :poll_timeout => 0.001, :rcv_timeout => 0.5, :exception_retry_limit => 0)
|
274
275
|
assert 0.49 < (Benchmark.measure do
|
275
276
|
assert_raise(Memcached::ATimeoutOccurred) do
|
276
277
|
result = cache.get key
|
277
278
|
end
|
278
279
|
end).real
|
279
280
|
|
280
|
-
cache = Memcached.new("localhost:43047:1", :poll_timeout => 0.25, :rcv_timeout => 0.25)
|
281
|
+
cache = Memcached.new("localhost:43047:1", :poll_timeout => 0.25, :rcv_timeout => 0.25, :exception_retry_limit => 0)
|
281
282
|
assert 0.51 > (Benchmark.measure do
|
282
283
|
assert_raise(Memcached::ATimeoutOccurred) do
|
283
284
|
result = cache.get key
|
@@ -289,14 +290,14 @@ class MemcachedTest < Test::Unit::TestCase
|
|
289
290
|
|
290
291
|
def test_get_with_no_block_server_timeout
|
291
292
|
socket = stub_server 43048
|
292
|
-
cache = Memcached.new("localhost:43048:1", :no_block => true, :timeout => 0.25)
|
293
|
+
cache = Memcached.new("localhost:43048:1", :no_block => true, :timeout => 0.25, :exception_retry_limit => 0)
|
293
294
|
assert 0.24 < (Benchmark.measure do
|
294
295
|
assert_raise(Memcached::ATimeoutOccurred) do
|
295
296
|
result = cache.get key
|
296
297
|
end
|
297
298
|
end).real
|
298
299
|
|
299
|
-
cache = Memcached.new("localhost:43048:1", :no_block => true, :poll_timeout => 0.25, :rcv_timeout => 0.001)
|
300
|
+
cache = Memcached.new("localhost:43048:1", :no_block => true, :poll_timeout => 0.25, :rcv_timeout => 0.001, :exception_retry_limit => 0)
|
300
301
|
assert 0.24 < (Benchmark.measure do
|
301
302
|
assert_raise(Memcached::ATimeoutOccurred) do
|
302
303
|
result = cache.get key
|
@@ -305,7 +306,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
305
306
|
|
306
307
|
cache = Memcached.new("localhost:43048:1", :no_block => true,
|
307
308
|
:poll_timeout => 0.001,
|
308
|
-
:rcv_timeout => 0.25 # No affect in no-block mode
|
309
|
+
:rcv_timeout => 0.25, # No affect in no-block mode
|
310
|
+
:exception_retry_limit => 0
|
309
311
|
)
|
310
312
|
assert 0.24 > (Benchmark.measure do
|
311
313
|
assert_raise(Memcached::ATimeoutOccurred) do
|
@@ -863,7 +865,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
863
865
|
:server_failure_limit => 2,
|
864
866
|
:retry_timeout => 1,
|
865
867
|
:hash_with_prefix_key => false,
|
866
|
-
:hash => :md5
|
868
|
+
:hash => :md5,
|
869
|
+
:exception_retry_limit => 0
|
867
870
|
)
|
868
871
|
|
869
872
|
# Hit second server up to the server_failure_limit
|
@@ -897,6 +900,121 @@ class MemcachedTest < Test::Unit::TestCase
|
|
897
900
|
socket.close
|
898
901
|
end
|
899
902
|
|
903
|
+
def test_unresponsive_server_retries_greater_than_server_failure_limit
|
904
|
+
socket = stub_server 43041
|
905
|
+
|
906
|
+
cache = Memcached.new(
|
907
|
+
[@servers.last, 'localhost:43041'],
|
908
|
+
:prefix_key => @prefix_key,
|
909
|
+
:auto_eject_hosts => true,
|
910
|
+
:server_failure_limit => 2,
|
911
|
+
:retry_timeout => 1,
|
912
|
+
:hash_with_prefix_key => false,
|
913
|
+
:hash => :md5,
|
914
|
+
:exception_retry_limit => 3
|
915
|
+
)
|
916
|
+
|
917
|
+
key2 = 'test_missing_server'
|
918
|
+
assert_nothing_raised do
|
919
|
+
cache.set(key2, @value)
|
920
|
+
assert_equal cache.get(key2), @value
|
921
|
+
end
|
922
|
+
|
923
|
+
assert_nothing_raised do
|
924
|
+
cache.set(key2, @value)
|
925
|
+
assert_equal cache.get(key2), @value
|
926
|
+
end
|
927
|
+
|
928
|
+
sleep(2)
|
929
|
+
|
930
|
+
assert_nothing_raised do
|
931
|
+
cache.set(key2, @value)
|
932
|
+
assert_equal cache.get(key2), @value
|
933
|
+
end
|
934
|
+
|
935
|
+
socket.close
|
936
|
+
end
|
937
|
+
|
938
|
+
def test_unresponsive_server_retries_equals_server_failure_limit
|
939
|
+
socket = stub_server 43041
|
940
|
+
|
941
|
+
cache = Memcached.new(
|
942
|
+
[@servers.last, 'localhost:43041'],
|
943
|
+
:prefix_key => @prefix_key,
|
944
|
+
:auto_eject_hosts => true,
|
945
|
+
:server_failure_limit => 2,
|
946
|
+
:retry_timeout => 1,
|
947
|
+
:hash_with_prefix_key => false,
|
948
|
+
:hash => :md5,
|
949
|
+
:exception_retry_limit => 3
|
950
|
+
)
|
951
|
+
|
952
|
+
key2 = 'test_missing_server'
|
953
|
+
begin
|
954
|
+
cache.get(key2)
|
955
|
+
rescue => e
|
956
|
+
assert_equal Memcached::ServerIsMarkedDead, e.class
|
957
|
+
assert_match /localhost:43041/, e.message
|
958
|
+
end
|
959
|
+
|
960
|
+
assert_nothing_raised do
|
961
|
+
cache.set(key2, @value)
|
962
|
+
assert_equal cache.get(key2), @value
|
963
|
+
end
|
964
|
+
|
965
|
+
sleep(2)
|
966
|
+
|
967
|
+
begin
|
968
|
+
cache.get(key2)
|
969
|
+
rescue => e
|
970
|
+
assert_equal Memcached::ServerIsMarkedDead, e.class
|
971
|
+
assert_match /localhost:43041/, e.message
|
972
|
+
end
|
973
|
+
|
974
|
+
assert_nothing_raised do
|
975
|
+
cache.set(key2, @value)
|
976
|
+
assert_equal cache.get(key2), @value
|
977
|
+
end
|
978
|
+
|
979
|
+
socket.close
|
980
|
+
end
|
981
|
+
|
982
|
+
def test_unresponsive_server_retries_less_than_server_failure_limit
|
983
|
+
socket = stub_server 43041
|
984
|
+
|
985
|
+
cache = Memcached.new(
|
986
|
+
[@servers.last, 'localhost:43041'],
|
987
|
+
:prefix_key => @prefix_key,
|
988
|
+
:auto_eject_hosts => true,
|
989
|
+
:server_failure_limit => 2,
|
990
|
+
:retry_timeout => 1,
|
991
|
+
:hash_with_prefix_key => false,
|
992
|
+
:hash => :md5,
|
993
|
+
:exception_retry_limit => 1
|
994
|
+
)
|
995
|
+
|
996
|
+
key2 = 'test_missing_server'
|
997
|
+
assert_raise(Memcached::ATimeoutOccurred) { cache.set(key2, @value) }
|
998
|
+
begin
|
999
|
+
cache.get(key2)
|
1000
|
+
rescue => e
|
1001
|
+
assert_equal Memcached::ServerIsMarkedDead, e.class
|
1002
|
+
assert_match /localhost:43041/, e.message
|
1003
|
+
end
|
1004
|
+
|
1005
|
+
sleep(2)
|
1006
|
+
|
1007
|
+
assert_raise(Memcached::ATimeoutOccurred) { cache.set(key2, @value) }
|
1008
|
+
begin
|
1009
|
+
cache.get(key2)
|
1010
|
+
rescue => e
|
1011
|
+
assert_equal Memcached::ServerIsMarkedDead, e.class
|
1012
|
+
assert_match /localhost:43041/, e.message
|
1013
|
+
end
|
1014
|
+
|
1015
|
+
socket.close
|
1016
|
+
end
|
1017
|
+
|
900
1018
|
def test_missing_server
|
901
1019
|
cache = Memcached.new(
|
902
1020
|
[@servers.last, 'localhost:43041'],
|
@@ -905,7 +1023,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
905
1023
|
:server_failure_limit => 2,
|
906
1024
|
:retry_timeout => 1,
|
907
1025
|
:hash_with_prefix_key => false,
|
908
|
-
:hash => :md5
|
1026
|
+
:hash => :md5,
|
1027
|
+
:exception_retry_limit => 0
|
909
1028
|
)
|
910
1029
|
|
911
1030
|
# Hit second server up to the server_failure_limit
|
@@ -946,7 +1065,8 @@ class MemcachedTest < Test::Unit::TestCase
|
|
946
1065
|
:auto_eject_hosts => true,
|
947
1066
|
:distribution => :random,
|
948
1067
|
:server_failure_limit => 1,
|
949
|
-
:retry_timeout => 1
|
1068
|
+
:retry_timeout => 1,
|
1069
|
+
:exception_retry_limit => 0
|
950
1070
|
)
|
951
1071
|
|
952
1072
|
# Provoke the errors in 'failures'
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 19
|
8
|
-
-
|
9
|
-
version: 0.19.
|
8
|
+
- 3
|
9
|
+
version: 0.19.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Evan Weaver
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
yZ0=
|
36
36
|
-----END CERTIFICATE-----
|
37
37
|
|
38
|
-
date: 2010-
|
38
|
+
date: 2010-04-20 00:00:00 -07:00
|
39
39
|
default_executable:
|
40
40
|
dependencies: []
|
41
41
|
|
metadata.gz.sig
CHANGED
Binary file
|