memcache-client 1.7.2 → 1.7.3
Sign up to get free protection for your applications and to get access to all the features.
- data/FAQ.rdoc +7 -0
- data/History.rdoc +7 -0
- data/lib/memcache.rb +38 -45
- data/test/test_mem_cache.rb +14 -4
- metadata +6 -4
data/FAQ.rdoc
CHANGED
@@ -22,3 +22,10 @@ You can increase the timeout or disable them completely with the following confi
|
|
22
22
|
native:
|
23
23
|
MemCache.new ['server1', 'server2'], { :timeout => 1.0 } # 1 second timeout
|
24
24
|
|
25
|
+
|
26
|
+
== The new memcache-client is slower than 1.5.0!?
|
27
|
+
|
28
|
+
Yes, in the simplest case, 1.6.x+ is slower than 1.5.0. If you just have a single memcached
|
29
|
+
server, the latest memcache-client will be slower. This is because 1.5.0 does not
|
30
|
+
timeout network operations. For reliability purposes, memcache-client 1.6.x+ enables
|
31
|
+
timeouts by default. Most of this performance penalty is now gone in 1.7.3 and later.
|
data/History.rdoc
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
= 1.7.3 (2009-06-06)
|
2
|
+
|
3
|
+
* Remove SystemTimer support, refactor I/O to use nonblocking operations. Speeds up
|
4
|
+
performance approx 100%. Timeouts basically have no overhead now! (tenderlove)
|
5
|
+
* Update load logic to support SystemTimer running in Ruby Enterprise Edition. Thanks
|
6
|
+
to splattael on github for the comment.
|
7
|
+
|
1
8
|
= 1.7.2 (2009-04-12)
|
2
9
|
|
3
10
|
* Rollback socket timeout optimization. It does not work on all operating systems
|
data/lib/memcache.rb
CHANGED
@@ -4,25 +4,7 @@ require 'socket'
|
|
4
4
|
require 'thread'
|
5
5
|
require 'zlib'
|
6
6
|
require 'digest/sha1'
|
7
|
-
|
8
|
-
begin
|
9
|
-
# Try to use the SystemTimer gem instead of Ruby's timeout library
|
10
|
-
# when running on something that looks like Ruby 1.8.x. See:
|
11
|
-
# http://ph7spot.com/articles/system_timer
|
12
|
-
# We don't want to bother trying to load SystemTimer on jruby and
|
13
|
-
# ruby 1.9+.
|
14
|
-
if !defined?(RUBY_ENGINE)
|
15
|
-
require 'system_timer'
|
16
|
-
MemCacheTimer = SystemTimer
|
17
|
-
else
|
18
|
-
require 'timeout'
|
19
|
-
MemCacheTimer = Timeout
|
20
|
-
end
|
21
|
-
rescue LoadError => e
|
22
|
-
puts "[memcache-client] Could not load SystemTimer gem, falling back to Ruby's slower/unsafe timeout library: #{e.message}"
|
23
|
-
require 'timeout'
|
24
|
-
MemCacheTimer = Timeout
|
25
|
-
end
|
7
|
+
require 'net/protocol'
|
26
8
|
|
27
9
|
##
|
28
10
|
# A Ruby client library for memcached.
|
@@ -33,7 +15,7 @@ class MemCache
|
|
33
15
|
##
|
34
16
|
# The version of MemCache you are using.
|
35
17
|
|
36
|
-
VERSION = '1.7.
|
18
|
+
VERSION = '1.7.3'
|
37
19
|
|
38
20
|
##
|
39
21
|
# Default options for the cache object.
|
@@ -521,7 +503,11 @@ class MemCache
|
|
521
503
|
@servers.each do |server|
|
522
504
|
with_socket_management(server) do |socket|
|
523
505
|
logger.debug { "flush_all #{delay_time} on #{server}" } if logger
|
524
|
-
|
506
|
+
if delay == 0 # older versions of memcached will fail silently otherwise
|
507
|
+
socket.write "flush_all#{noreply}\r\n"
|
508
|
+
else
|
509
|
+
socket.write "flush_all #{delay_time}#{noreply}\r\n"
|
510
|
+
end
|
525
511
|
break nil if @no_reply
|
526
512
|
result = socket.gets
|
527
513
|
raise_on_error_response! result
|
@@ -1015,30 +1001,9 @@ class MemCache
|
|
1015
1001
|
end
|
1016
1002
|
|
1017
1003
|
def connect_to(host, port, timeout=nil)
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
alias :blocking_gets :gets
|
1022
|
-
def gets(*args)
|
1023
|
-
MemCacheTimer.timeout(#{timeout}) do
|
1024
|
-
self.blocking_gets(*args)
|
1025
|
-
end
|
1026
|
-
end
|
1027
|
-
alias :blocking_read :read
|
1028
|
-
def read(*args)
|
1029
|
-
MemCacheTimer.timeout(#{timeout}) do
|
1030
|
-
self.blocking_read(*args)
|
1031
|
-
end
|
1032
|
-
end
|
1033
|
-
alias :blocking_write :write
|
1034
|
-
def write(*args)
|
1035
|
-
MemCacheTimer.timeout(#{timeout}) do
|
1036
|
-
self.blocking_write(*args)
|
1037
|
-
end
|
1038
|
-
end
|
1039
|
-
EOR
|
1040
|
-
end
|
1041
|
-
s
|
1004
|
+
io = MemCache::BufferedIO.new(TCPSocket.new(host, port))
|
1005
|
+
io.read_timeout = timeout
|
1006
|
+
io
|
1042
1007
|
end
|
1043
1008
|
|
1044
1009
|
##
|
@@ -1072,6 +1037,33 @@ class MemCache
|
|
1072
1037
|
|
1073
1038
|
class MemCacheError < RuntimeError; end
|
1074
1039
|
|
1040
|
+
class BufferedIO < Net::BufferedIO # :nodoc:
|
1041
|
+
BUFSIZE = 1024 * 16
|
1042
|
+
|
1043
|
+
# An implementation similar to this is in *trunk* for 1.9. When it
|
1044
|
+
# gets released, this method can be removed when using 1.9
|
1045
|
+
def rbuf_fill
|
1046
|
+
begin
|
1047
|
+
@rbuf << @io.read_nonblock(BUFSIZE)
|
1048
|
+
rescue Errno::EWOULDBLOCK
|
1049
|
+
retry unless @read_timeout
|
1050
|
+
if IO.select([@io], nil, nil, @read_timeout)
|
1051
|
+
retry
|
1052
|
+
else
|
1053
|
+
raise Timeout::Error
|
1054
|
+
end
|
1055
|
+
end
|
1056
|
+
end
|
1057
|
+
|
1058
|
+
def setsockopt *args
|
1059
|
+
@io.setsockopt *args
|
1060
|
+
end
|
1061
|
+
|
1062
|
+
def gets
|
1063
|
+
readuntil("\n")
|
1064
|
+
end
|
1065
|
+
end
|
1066
|
+
|
1075
1067
|
end
|
1076
1068
|
|
1077
1069
|
module Continuum
|
@@ -1111,5 +1103,6 @@ module Continuum
|
|
1111
1103
|
"<#{value}, #{server.host}:#{server.port}>"
|
1112
1104
|
end
|
1113
1105
|
end
|
1106
|
+
|
1114
1107
|
end
|
1115
1108
|
require 'continuum_native'
|
data/test/test_mem_cache.rb
CHANGED
@@ -138,8 +138,6 @@ class TestMemCache < Test::Unit::TestCase
|
|
138
138
|
end
|
139
139
|
end
|
140
140
|
puts "1000 gets without socket timeout: #{without} sec"
|
141
|
-
|
142
|
-
assert without < with
|
143
141
|
end
|
144
142
|
end
|
145
143
|
|
@@ -945,7 +943,7 @@ class TestMemCache < Test::Unit::TestCase
|
|
945
943
|
|
946
944
|
@cache.flush_all
|
947
945
|
|
948
|
-
expected = "flush_all
|
946
|
+
expected = "flush_all\r\n"
|
949
947
|
@cache.servers.each do |server|
|
950
948
|
assert_equal expected, server.socket.written.string
|
951
949
|
end
|
@@ -979,7 +977,19 @@ class TestMemCache < Test::Unit::TestCase
|
|
979
977
|
@cache.flush_all
|
980
978
|
end
|
981
979
|
|
982
|
-
assert_match /flush_all
|
980
|
+
assert_match /flush_all\r\n/, socket.written.string
|
981
|
+
end
|
982
|
+
|
983
|
+
def test_flush_all_for_real
|
984
|
+
requirement(memcached_running?, 'A real memcached server must be running for testing flush_all') do
|
985
|
+
cache = MemCache.new "localhost:11211", :namespace => "test_flush_all"
|
986
|
+
k, v = "1234", "test"
|
987
|
+
assert_nil cache.get(k)
|
988
|
+
cache.set(k, v)
|
989
|
+
assert_equal v, cache.get(k)
|
990
|
+
cache.flush_all
|
991
|
+
assert_nil cache.get(k)
|
992
|
+
end
|
983
993
|
end
|
984
994
|
|
985
995
|
def test_stats
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memcache-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.7.
|
4
|
+
version: 1.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Hodel
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2009-
|
14
|
+
date: 2009-06-06 00:00:00 -05:00
|
15
15
|
default_executable:
|
16
16
|
dependencies: []
|
17
17
|
|
@@ -33,6 +33,8 @@ files:
|
|
33
33
|
- lib/continuum_native.rb
|
34
34
|
has_rdoc: false
|
35
35
|
homepage: http://github.com/mperham/memcache-client
|
36
|
+
licenses: []
|
37
|
+
|
36
38
|
post_install_message:
|
37
39
|
rdoc_options: []
|
38
40
|
|
@@ -53,9 +55,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
55
|
requirements: []
|
54
56
|
|
55
57
|
rubyforge_project: seattlerb
|
56
|
-
rubygems_version: 1.3.
|
58
|
+
rubygems_version: 1.3.2
|
57
59
|
signing_key:
|
58
|
-
specification_version:
|
60
|
+
specification_version: 3
|
59
61
|
summary: A Ruby library for accessing memcached.
|
60
62
|
test_files:
|
61
63
|
- test/test_mem_cache.rb
|