Skip to content

Commit 330fb77

Browse files
committed
Do not transform (parse) commands that fail inside of a pipeline, like
`#zrange` with invalid parameters and `with_scores` set to `true`. This last argument requires parsing of the result, but when the Redis server returns a `CommandError`, this string is attempted to be parsed, which fails with the following stacktrace: ``` /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis.rb:2809:in `block in <class:Redis>': undefined method `each_slice' for from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/pipeline.rb:114:in `_set' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/pipeline.rb:61:in `block in finish' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/pipeline.rb:60:in `each' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/pipeline.rb:60:in `each_with_index' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/pipeline.rb:60:in `each' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/pipeline.rb:60:in `map' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/pipeline.rb:60:in `finish' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/client.rb:155:in `block in call_pipeline' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/client.rb:291:in `with_reconnect' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis/client.rb:153:in `call_pipeline' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis.rb:2307:in `block in pipelined' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis.rb:45:in `block in synchronize' from /Users/javierhonduco/.rubies/ruby-2.4.0/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis.rb:45:in `synchronize' from /Users/javierhonduco/.gem/ruby/2.4.0/gems/redis-4.0.1/lib/redis.rb:2303:in `pipelined' [...] ```
1 parent b515128 commit 330fb77

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

lib/redis.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2805,11 +2805,13 @@ def method_missing(command, *args)
28052805
}
28062806

28072807
FloatifyPairs =
2808-
lambda { |array|
2809-
if array
2810-
array.each_slice(2).map do |member, score|
2808+
lambda { |result|
2809+
if result.respond_to?(:each_slice)
2810+
result.each_slice(2).map do |member, score|
28112811
[member, Floatify.call(score)]
28122812
end
2813+
else
2814+
result
28132815
end
28142816
}
28152817

test/pipelining_commands_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,14 @@ def test_futures_raise_when_trying_to_access_their_values_too_early
128128
end
129129
end
130130

131+
def test_futures_raise_when_command_errors_and_needs_transformation
132+
assert_raise(Redis::CommandError) do
133+
r.pipelined do
134+
@result = r.zrange("a", "b", 5, :with_scores => true)
135+
end
136+
end
137+
end
138+
131139
def test_futures_can_be_identified
132140
r.pipelined do
133141
@result = r.sadd("foo", 1)

0 commit comments

Comments
 (0)