Skip to content

Commit 21f643e

Browse files
author
KJ Tsanaktsidis
committed
Perform cluster bookeeping tasks _before_ determining retry
Just because a block is not going to be retried, does not mean we should not process topology updates & redirections in response to errors, I think.
1 parent 658103d commit 21f643e

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

lib/redis_client/cluster/router.rb

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -83,60 +83,57 @@ def try_send(node, method, command, args, retry_count: 3, &block) # rubocop:disa
8383
rescue ::RedisClient::CircuitBreaker::OpenCircuitError
8484
raise
8585
rescue ::RedisClient::CommandError => e
86-
raise if retry_count <= 0
87-
8886
if e.message.start_with?('MOVED')
8987
node = assign_redirection_node(e.message)
9088
retry_count -= 1
91-
retry
89+
retry if retry_count >= 0
9290
elsif e.message.start_with?('ASK')
9391
node = assign_asking_node(e.message)
9492
node.call('ASKING')
9593
retry_count -= 1
96-
retry
94+
retry if retry_count >= 0
9795
elsif e.message.start_with?('CLUSTERDOWN Hash slot not served')
9896
update_cluster_info!
9997
retry_count -= 1
100-
retry
101-
else
102-
raise
98+
retry if retry_count >= 0
10399
end
100+
raise
104101
rescue ::RedisClient::ConnectionError => e
105102
raise if METHODS_FOR_BLOCKING_CMD.include?(method) && e.is_a?(RedisClient::ReadTimeoutError)
106-
raise if retry_count <= 0
107103

108104
update_cluster_info!
105+
106+
raise if retry_count <= 0
107+
109108
retry_count -= 1
110109
retry
111110
end
112111

113-
def try_delegate(node, method, *args, retry_count: 3, **kwargs, &block) # rubocop:disable Metrics/AbcSize
112+
def try_delegate(node, method, *args, retry_count: 3, **kwargs, &block) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
114113
node.public_send(method, *args, **kwargs, &block)
115114
rescue ::RedisClient::CircuitBreaker::OpenCircuitError
116115
raise
117116
rescue ::RedisClient::CommandError => e
118-
raise if retry_count <= 0
119-
120117
if e.message.start_with?('MOVED')
121118
node = assign_redirection_node(e.message)
122119
retry_count -= 1
123-
retry
120+
retry if retry_count >= 0
124121
elsif e.message.start_with?('ASK')
125122
node = assign_asking_node(e.message)
126123
node.call('ASKING')
127124
retry_count -= 1
128-
retry
125+
retry if retry_count >= 0
129126
elsif e.message.start_with?('CLUSTERDOWN Hash slot not served')
130127
update_cluster_info!
131128
retry_count -= 1
132-
retry
133-
else
134-
raise
129+
retry if retry_count >= 0
135130
end
131+
raise
136132
rescue ::RedisClient::ConnectionError
133+
update_cluster_info!
134+
137135
raise if retry_count <= 0
138136

139-
update_cluster_info!
140137
retry_count -= 1
141138
retry
142139
end

0 commit comments

Comments
 (0)