redis 3.0.0 → 4.2.2
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 +7 -0
- data/CHANGELOG.md +269 -0
- data/README.md +295 -58
- data/lib/redis.rb +1760 -451
- data/lib/redis/client.rb +355 -88
- data/lib/redis/cluster.rb +295 -0
- data/lib/redis/cluster/command.rb +81 -0
- data/lib/redis/cluster/command_loader.rb +34 -0
- data/lib/redis/cluster/key_slot_converter.rb +72 -0
- data/lib/redis/cluster/node.rb +107 -0
- data/lib/redis/cluster/node_key.rb +31 -0
- data/lib/redis/cluster/node_loader.rb +37 -0
- data/lib/redis/cluster/option.rb +90 -0
- data/lib/redis/cluster/slot.rb +86 -0
- data/lib/redis/cluster/slot_loader.rb +49 -0
- data/lib/redis/connection.rb +4 -2
- data/lib/redis/connection/command_helper.rb +5 -10
- data/lib/redis/connection/hiredis.rb +12 -8
- data/lib/redis/connection/registry.rb +2 -1
- data/lib/redis/connection/ruby.rb +232 -63
- data/lib/redis/connection/synchrony.rb +41 -14
- data/lib/redis/distributed.rb +205 -70
- data/lib/redis/errors.rb +48 -0
- data/lib/redis/hash_ring.rb +31 -73
- data/lib/redis/pipeline.rb +74 -18
- data/lib/redis/subscribe.rb +24 -13
- data/lib/redis/version.rb +3 -1
- metadata +63 -160
- data/.gitignore +0 -10
- data/.order +0 -169
- data/.travis.yml +0 -50
- data/.travis/Gemfile +0 -11
- data/.yardopts +0 -3
- data/Rakefile +0 -392
- data/benchmarking/logging.rb +0 -62
- data/benchmarking/pipeline.rb +0 -51
- data/benchmarking/speed.rb +0 -21
- data/benchmarking/suite.rb +0 -24
- data/benchmarking/worker.rb +0 -71
- data/examples/basic.rb +0 -15
- data/examples/dist_redis.rb +0 -43
- data/examples/incr-decr.rb +0 -17
- data/examples/list.rb +0 -26
- data/examples/pubsub.rb +0 -31
- data/examples/sets.rb +0 -36
- data/examples/unicorn/config.ru +0 -3
- data/examples/unicorn/unicorn.rb +0 -20
- data/redis.gemspec +0 -41
- data/test/blocking_commands_test.rb +0 -42
- data/test/command_map_test.rb +0 -30
- data/test/commands_on_hashes_test.rb +0 -21
- data/test/commands_on_lists_test.rb +0 -20
- data/test/commands_on_sets_test.rb +0 -77
- data/test/commands_on_sorted_sets_test.rb +0 -109
- data/test/commands_on_strings_test.rb +0 -83
- data/test/commands_on_value_types_test.rb +0 -99
- data/test/connection_handling_test.rb +0 -189
- data/test/db/.gitignore +0 -1
- data/test/distributed_blocking_commands_test.rb +0 -46
- data/test/distributed_commands_on_hashes_test.rb +0 -10
- data/test/distributed_commands_on_lists_test.rb +0 -22
- data/test/distributed_commands_on_sets_test.rb +0 -83
- data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
- data/test/distributed_commands_on_strings_test.rb +0 -48
- data/test/distributed_commands_on_value_types_test.rb +0 -87
- data/test/distributed_commands_requiring_clustering_test.rb +0 -148
- data/test/distributed_connection_handling_test.rb +0 -23
- data/test/distributed_internals_test.rb +0 -15
- data/test/distributed_key_tags_test.rb +0 -52
- data/test/distributed_persistence_control_commands_test.rb +0 -26
- data/test/distributed_publish_subscribe_test.rb +0 -92
- data/test/distributed_remote_server_control_commands_test.rb +0 -53
- data/test/distributed_scripting_test.rb +0 -102
- data/test/distributed_sorting_test.rb +0 -20
- data/test/distributed_test.rb +0 -58
- data/test/distributed_transactions_test.rb +0 -32
- data/test/encoding_test.rb +0 -18
- data/test/error_replies_test.rb +0 -59
- data/test/helper.rb +0 -188
- data/test/helper_test.rb +0 -22
- data/test/internals_test.rb +0 -214
- data/test/lint/blocking_commands.rb +0 -124
- data/test/lint/hashes.rb +0 -162
- data/test/lint/lists.rb +0 -143
- data/test/lint/sets.rb +0 -96
- data/test/lint/sorted_sets.rb +0 -201
- data/test/lint/strings.rb +0 -157
- data/test/lint/value_types.rb +0 -106
- data/test/persistence_control_commands_test.rb +0 -26
- data/test/pipelining_commands_test.rb +0 -195
- data/test/publish_subscribe_test.rb +0 -153
- data/test/remote_server_control_commands_test.rb +0 -104
- data/test/scripting_test.rb +0 -78
- data/test/sorting_test.rb +0 -45
- data/test/support/connection/hiredis.rb +0 -1
- data/test/support/connection/ruby.rb +0 -1
- data/test/support/connection/synchrony.rb +0 -17
- data/test/support/redis_mock.rb +0 -92
- data/test/support/wire/synchrony.rb +0 -24
- data/test/support/wire/thread.rb +0 -5
- data/test/synchrony_driver.rb +0 -57
- data/test/test.conf +0 -9
- data/test/thread_safety_test.rb +0 -32
- data/test/transactions_test.rb +0 -244
- data/test/unknown_commands_test.rb +0 -14
- data/test/url_param_test.rb +0 -64
@@ -1,20 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
class TestDistributedSorting < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_sort
|
10
|
-
assert_raise(Redis::Distributed::CannotDistribute) do
|
11
|
-
r.set("foo:1", "s1")
|
12
|
-
r.set("foo:2", "s2")
|
13
|
-
|
14
|
-
r.rpush("bar", "1")
|
15
|
-
r.rpush("bar", "2")
|
16
|
-
|
17
|
-
r.sort("bar", :get => "foo:*", :limit => [0, 1])
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/test/distributed_test.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
class TestDistributed < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_handle_multiple_servers
|
10
|
-
@r = Redis::Distributed.new ["redis://localhost:#{PORT}/15", *NODES]
|
11
|
-
|
12
|
-
100.times do |idx|
|
13
|
-
@r.set(idx.to_s, "foo#{idx}")
|
14
|
-
end
|
15
|
-
|
16
|
-
100.times do |idx|
|
17
|
-
assert_equal "foo#{idx}", @r.get(idx.to_s)
|
18
|
-
end
|
19
|
-
|
20
|
-
assert_equal "0", @r.keys("*").sort.first
|
21
|
-
assert_equal "string", @r.type("1")
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_add_nodes
|
25
|
-
logger = Logger.new("/dev/null")
|
26
|
-
|
27
|
-
@r = Redis::Distributed.new NODES, :logger => logger, :timeout => 10
|
28
|
-
|
29
|
-
assert_equal "127.0.0.1", @r.nodes[0].client.host
|
30
|
-
assert_equal PORT, @r.nodes[0].client.port
|
31
|
-
assert_equal 15, @r.nodes[0].client.db
|
32
|
-
assert_equal 10, @r.nodes[0].client.timeout
|
33
|
-
assert_equal logger, @r.nodes[0].client.logger
|
34
|
-
|
35
|
-
@r.add_node("redis://localhost:6380/14")
|
36
|
-
|
37
|
-
assert_equal "localhost", @r.nodes[1].client.host
|
38
|
-
assert_equal 6380, @r.nodes[1].client.port
|
39
|
-
assert_equal 14, @r.nodes[1].client.db
|
40
|
-
assert_equal 10, @r.nodes[1].client.timeout
|
41
|
-
assert_equal logger, @r.nodes[1].client.logger
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_pipelining_commands_cannot_be_distributed
|
45
|
-
assert_raise Redis::Distributed::CannotDistribute do
|
46
|
-
r.pipelined do
|
47
|
-
r.lpush "foo", "s1"
|
48
|
-
r.lpush "foo", "s2"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_unknown_commands_does_not_work_by_default
|
54
|
-
assert_raise NoMethodError do
|
55
|
-
r.not_yet_implemented_command
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
class TestDistributedTransactions < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_multi_discard
|
10
|
-
@foo = nil
|
11
|
-
|
12
|
-
assert_raise Redis::Distributed::CannotDistribute do
|
13
|
-
r.multi { @foo = 1 }
|
14
|
-
end
|
15
|
-
|
16
|
-
assert_equal nil, @foo
|
17
|
-
|
18
|
-
assert_raise Redis::Distributed::CannotDistribute do
|
19
|
-
r.discard
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_watch_unwatch
|
24
|
-
assert_raise Redis::Distributed::CannotDistribute do
|
25
|
-
r.watch("foo")
|
26
|
-
end
|
27
|
-
|
28
|
-
assert_raise Redis::Distributed::CannotDistribute do
|
29
|
-
r.unwatch
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/test/encoding_test.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
class TestEncoding < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Client
|
8
|
-
|
9
|
-
def test_returns_properly_encoded_strings
|
10
|
-
if defined?(Encoding)
|
11
|
-
with_external_encoding("UTF-8") do
|
12
|
-
r.set "foo", "שלום"
|
13
|
-
|
14
|
-
assert_equal "Shalom שלום", "Shalom " + r.get("foo")
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
data/test/error_replies_test.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
class TestErrorReplies < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Client
|
8
|
-
|
9
|
-
# Every test shouldn't disconnect from the server. Also, when error replies are
|
10
|
-
# in play, the protocol should never get into an invalid state where there are
|
11
|
-
# pending replies in the connection. Calling INFO after every test ensures that
|
12
|
-
# the protocol is still in a valid state.
|
13
|
-
def with_reconnection_check
|
14
|
-
before = r.info["total_connections_received"]
|
15
|
-
yield(r)
|
16
|
-
after = r.info["total_connections_received"]
|
17
|
-
ensure
|
18
|
-
assert_equal before, after
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_error_reply_for_single_command
|
22
|
-
with_reconnection_check do
|
23
|
-
begin
|
24
|
-
r.unknown_command
|
25
|
-
rescue => ex
|
26
|
-
ensure
|
27
|
-
assert ex.message =~ /unknown command/i
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_raise_first_error_reply_in_pipeline
|
33
|
-
with_reconnection_check do
|
34
|
-
begin
|
35
|
-
r.pipelined do
|
36
|
-
r.set("foo", "s1")
|
37
|
-
r.incr("foo") # not an integer
|
38
|
-
r.lpush("foo", "value") # wrong kind of value
|
39
|
-
end
|
40
|
-
rescue => ex
|
41
|
-
ensure
|
42
|
-
assert ex.message =~ /not an integer/i
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_recover_from_raise_in__call_loop
|
48
|
-
with_reconnection_check do
|
49
|
-
begin
|
50
|
-
r.client.call_loop([:invalid_monitor]) do
|
51
|
-
assert false # Should never be executed
|
52
|
-
end
|
53
|
-
rescue => ex
|
54
|
-
ensure
|
55
|
-
assert ex.message =~ /unknown command/i
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
data/test/helper.rb
DELETED
@@ -1,188 +0,0 @@
|
|
1
|
-
$:.unshift File.expand_path('../lib', File.dirname(__FILE__))
|
2
|
-
|
3
|
-
require "test/unit"
|
4
|
-
require "logger"
|
5
|
-
require "stringio"
|
6
|
-
|
7
|
-
begin
|
8
|
-
require "ruby-debug"
|
9
|
-
rescue LoadError
|
10
|
-
end
|
11
|
-
|
12
|
-
$VERBOSE = true
|
13
|
-
|
14
|
-
ENV["conn"] ||= "ruby"
|
15
|
-
|
16
|
-
require "redis"
|
17
|
-
require "redis/distributed"
|
18
|
-
require "redis/connection/#{ENV["conn"]}"
|
19
|
-
|
20
|
-
require "support/redis_mock"
|
21
|
-
require "support/connection/#{ENV["conn"]}"
|
22
|
-
|
23
|
-
PORT = 6381
|
24
|
-
OPTIONS = {:port => PORT, :db => 15, :timeout => 0.1}
|
25
|
-
NODES = ["redis://127.0.0.1:#{PORT}/15"]
|
26
|
-
|
27
|
-
def init(redis)
|
28
|
-
begin
|
29
|
-
redis.select 14
|
30
|
-
redis.flushdb
|
31
|
-
redis.select 15
|
32
|
-
redis.flushdb
|
33
|
-
redis
|
34
|
-
rescue Redis::CannotConnectError
|
35
|
-
puts <<-EOS
|
36
|
-
|
37
|
-
Cannot connect to Redis.
|
38
|
-
|
39
|
-
Make sure Redis is running on localhost, port #{PORT}.
|
40
|
-
This testing suite connects to the database 15.
|
41
|
-
|
42
|
-
To install redis:
|
43
|
-
visit <http://redis.io/download/>.
|
44
|
-
|
45
|
-
To start the server:
|
46
|
-
rake start
|
47
|
-
|
48
|
-
To stop the server:
|
49
|
-
rake stop
|
50
|
-
|
51
|
-
EOS
|
52
|
-
exit 1
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def driver(*drivers, &blk)
|
57
|
-
if drivers.map(&:to_s).include?(ENV["conn"])
|
58
|
-
class_eval(&blk)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
module Helper
|
63
|
-
|
64
|
-
def run(runner)
|
65
|
-
if respond_to?(:around)
|
66
|
-
around { super(runner) }
|
67
|
-
else
|
68
|
-
super
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def silent
|
73
|
-
verbose, $VERBOSE = $VERBOSE, false
|
74
|
-
|
75
|
-
begin
|
76
|
-
yield
|
77
|
-
ensure
|
78
|
-
$VERBOSE = verbose
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def with_external_encoding(encoding)
|
83
|
-
original_encoding = Encoding.default_external
|
84
|
-
|
85
|
-
begin
|
86
|
-
silent { Encoding.default_external = Encoding.find(encoding) }
|
87
|
-
yield
|
88
|
-
ensure
|
89
|
-
silent { Encoding.default_external = original_encoding }
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
class Version
|
94
|
-
|
95
|
-
include Comparable
|
96
|
-
|
97
|
-
attr :parts
|
98
|
-
|
99
|
-
def initialize(v)
|
100
|
-
case v
|
101
|
-
when Version
|
102
|
-
@parts = v.parts
|
103
|
-
else
|
104
|
-
@parts = v.to_s.split(".")
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def <=>(other)
|
109
|
-
other = Version.new(other)
|
110
|
-
length = [self.parts.length, other.parts.length].max
|
111
|
-
length.times do |i|
|
112
|
-
a, b = self.parts[i], other.parts[i]
|
113
|
-
|
114
|
-
return -1 if a.nil?
|
115
|
-
return +1 if b.nil?
|
116
|
-
return a <=> b if a != b
|
117
|
-
end
|
118
|
-
|
119
|
-
0
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
module Generic
|
124
|
-
|
125
|
-
include Helper
|
126
|
-
|
127
|
-
attr_reader :log
|
128
|
-
attr_reader :redis
|
129
|
-
|
130
|
-
alias :r :redis
|
131
|
-
|
132
|
-
def setup
|
133
|
-
@log = StringIO.new
|
134
|
-
@redis = init _new_client
|
135
|
-
end
|
136
|
-
|
137
|
-
def teardown
|
138
|
-
@redis.quit if @redis
|
139
|
-
end
|
140
|
-
|
141
|
-
def redis_mock(commands, options = {}, &blk)
|
142
|
-
RedisMock.start(commands) do |port|
|
143
|
-
yield _new_client(options.merge(:port => port))
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
module Client
|
149
|
-
|
150
|
-
include Generic
|
151
|
-
|
152
|
-
def version
|
153
|
-
Version.new(redis.info["redis_version"])
|
154
|
-
end
|
155
|
-
|
156
|
-
private
|
157
|
-
|
158
|
-
def _format_options(options)
|
159
|
-
OPTIONS.merge(:logger => ::Logger.new(@log)).merge(options)
|
160
|
-
end
|
161
|
-
|
162
|
-
def _new_client(options = {})
|
163
|
-
Redis.new(_format_options(options))
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
module Distributed
|
168
|
-
|
169
|
-
include Generic
|
170
|
-
|
171
|
-
def version
|
172
|
-
Version.new(redis.info.first["redis_version"])
|
173
|
-
end
|
174
|
-
|
175
|
-
private
|
176
|
-
|
177
|
-
def _format_options(options)
|
178
|
-
{
|
179
|
-
:timeout => OPTIONS[:timeout],
|
180
|
-
:logger => ::Logger.new(@log),
|
181
|
-
}.merge(options)
|
182
|
-
end
|
183
|
-
|
184
|
-
def _new_client(options = {})
|
185
|
-
Redis::Distributed.new(NODES, _format_options(options))
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
data/test/helper_test.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
class TestHelper < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper
|
8
|
-
|
9
|
-
def test_version_comparison
|
10
|
-
v = Version.new("2.0.0")
|
11
|
-
|
12
|
-
assert v < "3"
|
13
|
-
assert v > "1"
|
14
|
-
assert v > "2"
|
15
|
-
|
16
|
-
assert v < "2.1"
|
17
|
-
assert v < "2.0.1"
|
18
|
-
assert v < "2.0.0.1"
|
19
|
-
|
20
|
-
assert v == "2.0.0"
|
21
|
-
end
|
22
|
-
end
|
data/test/internals_test.rb
DELETED
@@ -1,214 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
class TestInternals < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Client
|
8
|
-
|
9
|
-
def test_logger
|
10
|
-
r.ping
|
11
|
-
|
12
|
-
assert log.string =~ /Redis >> PING/
|
13
|
-
assert log.string =~ /Redis >> \d+\.\d+ms/
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_logger_with_pipelining
|
17
|
-
r.pipelined do
|
18
|
-
r.set "foo", "bar"
|
19
|
-
r.get "foo"
|
20
|
-
end
|
21
|
-
|
22
|
-
assert log.string["SET foo bar"]
|
23
|
-
assert log.string["GET foo"]
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_recovers_from_failed_commands
|
27
|
-
# See https://github.com/redis/redis-rb/issues#issue/28
|
28
|
-
|
29
|
-
assert_raise(Redis::CommandError) do
|
30
|
-
r.command_that_doesnt_exist
|
31
|
-
end
|
32
|
-
|
33
|
-
assert_nothing_raised do
|
34
|
-
r.info
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_raises_on_protocol_errors
|
39
|
-
redis_mock(:ping => lambda { |*_| "foo" }) do |redis|
|
40
|
-
assert_raise(Redis::ProtocolError) do
|
41
|
-
redis.ping
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_provides_a_meaningful_inspect
|
47
|
-
assert_equal "#<Redis client v#{Redis::VERSION} for redis://127.0.0.1:#{PORT}/15>", r.inspect
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_redis_current
|
51
|
-
assert_equal "127.0.0.1", Redis.current.client.host
|
52
|
-
assert_equal 6379, Redis.current.client.port
|
53
|
-
assert_equal 0, Redis.current.client.db
|
54
|
-
|
55
|
-
Redis.current = Redis.new(OPTIONS.merge(:port => 6380, :db => 1))
|
56
|
-
|
57
|
-
t = Thread.new do
|
58
|
-
assert_equal "127.0.0.1", Redis.current.client.host
|
59
|
-
assert_equal 6380, Redis.current.client.port
|
60
|
-
assert_equal 1, Redis.current.client.db
|
61
|
-
end
|
62
|
-
|
63
|
-
t.join
|
64
|
-
|
65
|
-
assert_equal "127.0.0.1", Redis.current.client.host
|
66
|
-
assert_equal 6380, Redis.current.client.port
|
67
|
-
assert_equal 1, Redis.current.client.db
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_default_id_with_host_and_port
|
71
|
-
redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0))
|
72
|
-
assert_equal "redis://host:1234/0", redis.client.id
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_default_id_with_host_and_port_and_explicit_scheme
|
76
|
-
redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0, :scheme => "foo"))
|
77
|
-
assert_equal "redis://host:1234/0", redis.client.id
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_default_id_with_path
|
81
|
-
redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0))
|
82
|
-
assert_equal "redis:///tmp/redis.sock/0", redis.client.id
|
83
|
-
end
|
84
|
-
|
85
|
-
def test_default_id_with_path_and_explicit_scheme
|
86
|
-
redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0, :scheme => "foo"))
|
87
|
-
assert_equal "redis:///tmp/redis.sock/0", redis.client.id
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_override_id
|
91
|
-
redis = Redis.new(OPTIONS.merge(:id => "test"))
|
92
|
-
assert_equal redis.client.id, "test"
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_timeout
|
96
|
-
assert_nothing_raised do
|
97
|
-
Redis.new(OPTIONS.merge(:timeout => 0))
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_time
|
102
|
-
return if version < "2.5.4"
|
103
|
-
|
104
|
-
# Test that the difference between the time that Ruby reports and the time
|
105
|
-
# that Redis reports is minimal (prevents the test from being racy).
|
106
|
-
rv = r.time
|
107
|
-
|
108
|
-
redis_usec = rv[0] * 1_000_000 + rv[1]
|
109
|
-
ruby_usec = Integer(Time.now.to_f * 1_000_000)
|
110
|
-
|
111
|
-
assert 500_000 > (ruby_usec - redis_usec).abs
|
112
|
-
end
|
113
|
-
|
114
|
-
def test_connection_timeout
|
115
|
-
assert_raise Redis::CannotConnectError do
|
116
|
-
Redis.new(OPTIONS.merge(:host => "10.255.255.254", :timeout => 0.1)).ping
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def close_on_ping(seq)
|
121
|
-
$request = 0
|
122
|
-
|
123
|
-
command = lambda do
|
124
|
-
idx = $request
|
125
|
-
$request += 1
|
126
|
-
|
127
|
-
rv = "+%d" % idx
|
128
|
-
rv = nil if seq.include?(idx)
|
129
|
-
rv
|
130
|
-
end
|
131
|
-
|
132
|
-
redis_mock(:ping => command, :timeout => 0.1) do |redis|
|
133
|
-
yield(redis)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_retry_by_default
|
138
|
-
close_on_ping([0]) do |redis|
|
139
|
-
assert_equal "1", redis.ping
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
def test_retry_when_wrapped_in_with_reconnect_true
|
144
|
-
close_on_ping([0]) do |redis|
|
145
|
-
redis.with_reconnect(true) do
|
146
|
-
assert_equal "1", redis.ping
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_dont_retry_when_wrapped_in_with_reconnect_false
|
152
|
-
close_on_ping([0]) do |redis|
|
153
|
-
assert_raise Redis::ConnectionError do
|
154
|
-
redis.with_reconnect(false) do
|
155
|
-
redis.ping
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
def test_dont_retry_when_wrapped_in_without_reconnect
|
162
|
-
close_on_ping([0]) do |redis|
|
163
|
-
assert_raise Redis::ConnectionError do
|
164
|
-
redis.without_reconnect do
|
165
|
-
redis.ping
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
def test_retry_only_once_when_read_raises_econnreset
|
172
|
-
close_on_ping([0, 1]) do |redis|
|
173
|
-
assert_raise Redis::ConnectionError do
|
174
|
-
redis.ping
|
175
|
-
end
|
176
|
-
|
177
|
-
assert !redis.client.connected?
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
def test_don_t_retry_when_second_read_in_pipeline_raises_econnreset
|
182
|
-
close_on_ping([1]) do |redis|
|
183
|
-
assert_raise Redis::ConnectionError do
|
184
|
-
redis.pipelined do
|
185
|
-
redis.ping
|
186
|
-
redis.ping # Second #read times out
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
assert !redis.client.connected?
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
def test_connecting_to_unix_domain_socket
|
195
|
-
assert_nothing_raised do
|
196
|
-
Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock")).ping
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
driver(:ruby, :hiredis) do
|
201
|
-
def test_bubble_timeout_without_retrying
|
202
|
-
serv = TCPServer.new(6380)
|
203
|
-
|
204
|
-
redis = Redis.new(:port => 6380, :timeout => 0.1)
|
205
|
-
|
206
|
-
assert_raise(Redis::TimeoutError) do
|
207
|
-
redis.ping
|
208
|
-
end
|
209
|
-
|
210
|
-
ensure
|
211
|
-
serv.close if serv
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|