Skip to content

Commit 07e7849

Browse files
author
KJ Tsanaktsidis
committed
Cluster: Preserve message and suberrors when raising CommandErrorCollection
The constructor signature for CommandErrorCollection is (errors, message). That means if you call "raise CommandErrorCollection, 'foobar'", that actually winds up setting the _errors_ field to 'foobar', _NOT_ the message. This leads to incredibly undescriptive "Command errors were replied on any node" errors getting emitted if there are errors using pipelining. Fix this by: 1) explicitly constructing the error, with the arguments in the right order 2) mapping the sub-errors into redis-rb errors too - presumably there's an :errors attr_reader because somebody will find that useful.
1 parent 6729fc8 commit 07e7849

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

cluster/lib/redis/cluster/client.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,14 @@ def handle_errors
8484
raise ERROR_MAPPING.fetch(node_error.class), node_error.message, node_error.backtrace
8585
end
8686
end
87-
raise ERROR_MAPPING.fetch(error.class), error.message, error.backtrace
87+
remapped_node_errors = error.errors.map do |node_key, node_error|
88+
remapped = ERROR_MAPPING.fetch(node_error.class, node_error.class).new(node_error.message)
89+
remapped.set_backtrace node_error.backtrace
90+
[node_key, remapped]
91+
end.to_h
92+
raise(Redis::Cluster::CommandErrorCollection.new(remapped_node_errors, error.message).tap do |remapped|
93+
remapped.set_backtrace error.backtrace
94+
end)
8895
rescue ::RedisClient::Error => error
8996
raise ERROR_MAPPING.fetch(error.class), error.message, error.backtrace
9097
end

cluster/test/commands_on_server_test.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ def test_bgsave
2121
'Use BGSAVE SCHEDULE in order to schedule a BGSAVE whenever possible.'
2222

2323
redis_cluster_mock(bgsave: ->(*_) { "-Error #{err_msg}" }) do |redis|
24-
assert_raises(Redis::Cluster::CommandErrorCollection, 'Command error replied on any node') do
24+
err = assert_raises(Redis::Cluster::CommandErrorCollection, 'Command error replied on any node') do
2525
redis.bgsave
2626
end
27+
assert_includes err.message, err_msg
28+
assert_kind_of Redis::CommandError, err.errors.values.first
2729
end
2830
end
2931

0 commit comments

Comments
 (0)