memcache-client 1.4.0 → 1.5.0
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/History.txt +7 -0
- data/lib/memcache.rb +64 -24
- data/test/test_mem_cache.rb +60 -16
- metadata +25 -3
- metadata.gz.sig +0 -0
data.tar.gz.sig
ADDED
Binary file
|
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
= 1.5.0
|
2
|
+
|
3
|
+
* Add MemCache#flush_all command. Patch #13019 and bug #10503. Patches
|
4
|
+
submitted by Sebastian Delmont and Rick Olson.
|
5
|
+
* Type-cast data returned by MemCache#stats. Patch #10505 submitted by
|
6
|
+
Sebastian Delmont.
|
7
|
+
|
1
8
|
= 1.4.0
|
2
9
|
|
3
10
|
* Fix bug #10371, #set does not check response for server errors.
|
data/lib/memcache.rb
CHANGED
@@ -42,7 +42,7 @@ class MemCache
|
|
42
42
|
##
|
43
43
|
# The version of MemCache you are using.
|
44
44
|
|
45
|
-
VERSION = '1.
|
45
|
+
VERSION = '1.5.0'
|
46
46
|
|
47
47
|
##
|
48
48
|
# Default options for the cache object.
|
@@ -365,6 +365,31 @@ class MemCache
|
|
365
365
|
@mutex.unlock if @multithread
|
366
366
|
end
|
367
367
|
|
368
|
+
##
|
369
|
+
# Flush the cache from all memcache servers.
|
370
|
+
|
371
|
+
def flush_all
|
372
|
+
raise MemCacheError, 'No active servers' unless active?
|
373
|
+
raise MemCacheError, "Update of readonly cache" if @readonly
|
374
|
+
begin
|
375
|
+
@mutex.lock if @multithread
|
376
|
+
@servers.each do |server|
|
377
|
+
begin
|
378
|
+
sock = server.socket
|
379
|
+
raise MemCacheError, "No connection to server" if sock.nil?
|
380
|
+
sock.write "flush_all\r\n"
|
381
|
+
result = sock.gets
|
382
|
+
raise MemCacheError, $2.strip if result =~ /^(SERVER_)?ERROR(.*)/
|
383
|
+
rescue SocketError, SystemCallError, IOError => err
|
384
|
+
server.close
|
385
|
+
raise MemCacheError, err.message
|
386
|
+
end
|
387
|
+
end
|
388
|
+
ensure
|
389
|
+
@mutex.unlock if @multithread
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
368
393
|
##
|
369
394
|
# Reset the connection to all memcache servers. This should be called if
|
370
395
|
# there is a problem with a cache lookup that might have left the connection
|
@@ -384,26 +409,26 @@ class MemCache
|
|
384
409
|
#
|
385
410
|
# >> pp CACHE.stats
|
386
411
|
# {"localhost:11211"=>
|
387
|
-
# {"bytes"=>
|
388
|
-
# "pid"=>
|
389
|
-
# "connection_structures"=>
|
390
|
-
# "time"=>
|
391
|
-
# "pointer_size"=>
|
392
|
-
# "limit_maxbytes"=>
|
393
|
-
# "cmd_get"=>
|
412
|
+
# {"bytes"=>4718,
|
413
|
+
# "pid"=>20188,
|
414
|
+
# "connection_structures"=>4,
|
415
|
+
# "time"=>1162278121,
|
416
|
+
# "pointer_size"=>32,
|
417
|
+
# "limit_maxbytes"=>67108864,
|
418
|
+
# "cmd_get"=>14532,
|
394
419
|
# "version"=>"1.2.0",
|
395
|
-
# "bytes_written"=>
|
396
|
-
# "cmd_set"=>
|
397
|
-
# "get_misses"=>
|
398
|
-
# "total_connections"=>
|
399
|
-
# "curr_connections"=>
|
400
|
-
# "curr_items"=>
|
401
|
-
# "uptime"=>
|
402
|
-
# "get_hits"=>
|
403
|
-
# "total_items"=>
|
404
|
-
# "rusage_system"=>
|
405
|
-
# "rusage_user"=>
|
406
|
-
# "bytes_read"=>
|
420
|
+
# "bytes_written"=>432583,
|
421
|
+
# "cmd_set"=>32,
|
422
|
+
# "get_misses"=>0,
|
423
|
+
# "total_connections"=>19,
|
424
|
+
# "curr_connections"=>3,
|
425
|
+
# "curr_items"=>4,
|
426
|
+
# "uptime"=>1557,
|
427
|
+
# "get_hits"=>14532,
|
428
|
+
# "total_items"=>32,
|
429
|
+
# "rusage_system"=>0.313952,
|
430
|
+
# "rusage_user"=>0.119981,
|
431
|
+
# "bytes_read"=>190619}}
|
407
432
|
# => nil
|
408
433
|
|
409
434
|
def stats
|
@@ -418,12 +443,27 @@ class MemCache
|
|
418
443
|
begin
|
419
444
|
sock.write "stats\r\n"
|
420
445
|
stats = {}
|
421
|
-
while line = sock.gets
|
446
|
+
while line = sock.gets do
|
422
447
|
break if line == "END\r\n"
|
423
|
-
line =~ /^STAT ([\w]+) ([\
|
424
|
-
|
448
|
+
if line =~ /^STAT ([\w]+) ([\w\.\:]+)/ then
|
449
|
+
name, value = $1, $2
|
450
|
+
stats[name] = case name
|
451
|
+
when 'version'
|
452
|
+
value
|
453
|
+
when 'rusage_user', 'rusage_system' then
|
454
|
+
seconds, microseconds = value.split(/:/, 2)
|
455
|
+
microseconds ||= 0
|
456
|
+
Float(seconds) + (Float(microseconds) / 1_000_000)
|
457
|
+
else
|
458
|
+
if value =~ /^\d+$/ then
|
459
|
+
value.to_i
|
460
|
+
else
|
461
|
+
value
|
462
|
+
end
|
463
|
+
end
|
464
|
+
end
|
425
465
|
end
|
426
|
-
server_stats["#{server.host}:#{server.port}"] = stats
|
466
|
+
server_stats["#{server.host}:#{server.port}"] = stats
|
427
467
|
rescue SocketError, SystemCallError, IOError => err
|
428
468
|
server.close
|
429
469
|
raise MemCacheError, err.message
|
data/test/test_mem_cache.rb
CHANGED
@@ -507,19 +507,6 @@ class TestMemCache < Test::Unit::TestCase
|
|
507
507
|
assert_equal expected, server.socket.written.string
|
508
508
|
end
|
509
509
|
|
510
|
-
def test_set
|
511
|
-
server = FakeServer.new
|
512
|
-
server.socket.data.write "STORED\r\n"
|
513
|
-
server.socket.data.rewind
|
514
|
-
@cache.servers = []
|
515
|
-
@cache.servers << server
|
516
|
-
|
517
|
-
@cache.set 'key', 'value'
|
518
|
-
|
519
|
-
expected = "set my_namespace:key 0 0 9\r\n\004\b\"\nvalue\r\n"
|
520
|
-
assert_equal expected, server.socket.written.string
|
521
|
-
end
|
522
|
-
|
523
510
|
def test_set_expiry
|
524
511
|
server = FakeServer.new
|
525
512
|
server.socket.data.write "STORED\r\n"
|
@@ -632,9 +619,43 @@ class TestMemCache < Test::Unit::TestCase
|
|
632
619
|
assert_equal 'Update of readonly cache', e.message
|
633
620
|
end
|
634
621
|
|
635
|
-
def
|
622
|
+
def test_delete
|
623
|
+
server = FakeServer.new
|
624
|
+
@cache.servers = []
|
625
|
+
@cache.servers << server
|
626
|
+
|
627
|
+
@cache.delete 'key'
|
628
|
+
|
629
|
+
expected = "delete my_namespace:key 0\r\n"
|
630
|
+
assert_equal expected, server.socket.written.string
|
631
|
+
end
|
632
|
+
|
633
|
+
def test_delete_with_expiry
|
634
|
+
server = FakeServer.new
|
635
|
+
@cache.servers = []
|
636
|
+
@cache.servers << server
|
637
|
+
|
638
|
+
@cache.delete 'key', 300
|
639
|
+
|
640
|
+
expected = "delete my_namespace:key 300\r\n"
|
641
|
+
assert_equal expected, server.socket.written.string
|
642
|
+
end
|
643
|
+
|
644
|
+
def test_flush_all
|
645
|
+
@cache.servers = []
|
646
|
+
3.times { @cache.servers << FakeServer.new }
|
647
|
+
|
648
|
+
@cache.flush_all
|
649
|
+
|
650
|
+
expected = "flush_all\r\n"
|
651
|
+
@cache.servers.each do |server|
|
652
|
+
assert_equal expected, server.socket.written.string
|
653
|
+
end
|
654
|
+
end
|
655
|
+
|
656
|
+
def test_flush_all_failure
|
636
657
|
socket = FakeSocket.new
|
637
|
-
socket.data.write "
|
658
|
+
socket.data.write "ERROR\r\n"
|
638
659
|
socket.data.rewind
|
639
660
|
server = FakeServer.new socket
|
640
661
|
def server.host() "localhost"; end
|
@@ -643,7 +664,30 @@ class TestMemCache < Test::Unit::TestCase
|
|
643
664
|
@cache.servers = []
|
644
665
|
@cache.servers << server
|
645
666
|
|
646
|
-
|
667
|
+
assert_raise MemCache::MemCacheError do
|
668
|
+
@cache.flush_all
|
669
|
+
end
|
670
|
+
|
671
|
+
assert_equal "flush_all\r\n", socket.written.string
|
672
|
+
end
|
673
|
+
|
674
|
+
def test_stats
|
675
|
+
socket = FakeSocket.new
|
676
|
+
socket.data.write "STAT pid 20188\r\nSTAT total_items 32\r\nSTAT version 1.2.3\r\nSTAT rusage_user 1:300\r\nSTAT dummy ok\r\nEND\r\n"
|
677
|
+
socket.data.rewind
|
678
|
+
server = FakeServer.new socket
|
679
|
+
def server.host() 'localhost'; end
|
680
|
+
def server.port() 11211; end
|
681
|
+
|
682
|
+
@cache.servers = []
|
683
|
+
@cache.servers << server
|
684
|
+
|
685
|
+
expected = {
|
686
|
+
'localhost:11211' => {
|
687
|
+
'pid' => 20188, 'total_items' => 32, 'version' => '1.2.3',
|
688
|
+
'rusage_user' => 1.0003, 'dummy' => 'ok'
|
689
|
+
}
|
690
|
+
}
|
647
691
|
assert_equal expected, @cache.stats
|
648
692
|
|
649
693
|
assert_equal "stats\r\n", socket.written.string
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4.3
|
|
3
3
|
specification_version: 1
|
4
4
|
name: memcache-client
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date: 2007-
|
6
|
+
version: 1.5.0
|
7
|
+
date: 2007-08-13 00:00:00 -07:00
|
8
8
|
summary: A Ruby memcached client
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,6 +31,28 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
31
31
|
platform: ruby
|
32
32
|
signing_key:
|
33
33
|
cert_chain:
|
34
|
+
- |
|
35
|
+
-----BEGIN CERTIFICATE-----
|
36
|
+
MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkcmJy
|
37
|
+
YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
|
38
|
+
ZXQwHhcNMDcwODE0MDAwMjIzWhcNMDgwODEzMDAwMjIzWjBBMRAwDgYDVQQDDAdk
|
39
|
+
cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
|
40
|
+
FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVZUNKmnp8LrkM
|
41
|
+
bQd5ZrcTV1R7woai4clBLUjH3DL47r+f6d5dz+gJUegZ3RKWdSvOfaRmXFkr2+nv
|
42
|
+
vc6uzcxk9w1uN5Z3w+BCeKtsUR8EtUhH8b26HDNGDeuoTX1gEgm4DacBh1/Ib+SQ
|
43
|
+
PxLVkFnWiCekGvL7jzecw6UwADn49Ag4NxIvpN0ttsYCQFMDuqzdISjurbb3dZ2z
|
44
|
+
OsaDqdW29c3Jed816kVhOzRZ2EC4BExPtEN6xZCwab6f9tzJT+Atea7PRFLm/T7t
|
45
|
+
QFBPGC2XjPUXJxTyz+8PEDDb2PXeZwPSDIysq1tzB55A3rE1a5pLvnBfek5KjC25
|
46
|
+
0wuuKuxlAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
47
|
+
BBStuxfp/gfzqL+3k7tFe8gVU9zpvDANBgkqhkiG9w0BAQUFAAOCAQEAvnmUelUN
|
48
|
+
s9f/VasT9mZV4tIP3sKi0uqyq9i7vtDgCNFw0BAKNxa6ybO1CrBBnjDMa4hvhrW8
|
49
|
+
qCLkx7BFHGV/eWR3pdwcLAS8cLuEib75nuG1lbG2yIvGSYTyQ/oxbmuUAZxpavK2
|
50
|
+
101OludXvBC9hpA4Qz3UhJYBdtT8TuztiFGLzhCJusjUD7I6Y+TrrTPkBGceVVyY
|
51
|
+
hx8aJk+44+jvzgsTi4MyrRo4lAGsQxFa1f1IBuEgqNPdML31yGO0QKof+IqPiVNo
|
52
|
+
HsCQoSWkgfQE0DHTgx+hWkF2d10+54I4aM9tIROeGACQemcj0IRf3v7Au8I+6PWl
|
53
|
+
3E1oHz01aNcUFA==
|
54
|
+
-----END CERTIFICATE-----
|
55
|
+
|
34
56
|
post_install_message:
|
35
57
|
authors:
|
36
58
|
- Eric Hodel
|
@@ -77,5 +99,5 @@ dependencies:
|
|
77
99
|
requirements:
|
78
100
|
- - ">="
|
79
101
|
- !ruby/object:Gem::Version
|
80
|
-
version: 1.
|
102
|
+
version: 1.3.0
|
81
103
|
version:
|
metadata.gz.sig
ADDED
Binary file
|