redis-cluster-client 0.11.1 → 0.11.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd66efdf343224572aeffdbfdd4cb96c8189bd45183c0a3934e6dd1964a35655
4
- data.tar.gz: 66805c538066aabab413b767f0b9e8756c1eff8920f410a665939f18d69c0621
3
+ metadata.gz: a18bda4b076ac6a39e7558b39b0ff5f443e2f9d192ff45ee6749e64b3a349fbd
4
+ data.tar.gz: ed166898e6dbb23b316d87162767fe06eb34440029bdb6f33764c58038c20d88
5
5
  SHA512:
6
- metadata.gz: d325c2955718451c15084b58b0231d521065ebe1b8b549f79106f26132b50eb77ac90e6b0dcfb11868eb80b2d37a742f741b21d963c6ff92faacf4d88bc64830
7
- data.tar.gz: 7e6c92442c2852b0533c19b4e60ff8e8e6532d55cbeebc9424e1b62081c6eb21af6a5717ae04fbb683083c271d3008934d0e17becc4b7abf232c005304c2b713
6
+ metadata.gz: 7b1ca4265e58d3d4cdb00c0ad9629d72dec6c1a0681d34663e38adb147a0d66985be3f4257d6f6d0c62752cda0f710bfd9e7eb9f3694e07ec4796ce99677c148
7
+ data.tar.gz: 178592be6e79bfdf2c5288f558fca21116aabd98cc10b4436298393d22f895844523b3e32f28635172229a404c55d83e52e242230677ab00d509dba7d70adc0c
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'redis_client'
4
+ require 'redis_client/cluster/errors'
4
5
  require 'redis_client/cluster/normalized_cmd_name'
5
6
 
6
7
  class RedisClient
@@ -89,12 +90,11 @@ class RedisClient
89
90
 
90
91
  case event = @queue.pop(true)
91
92
  when ::RedisClient::CommandError
92
- if event.message.start_with?('MOVED', 'CLUSTERDOWN Hash slot not served')
93
- @router.renew_cluster_state
94
- break start_over
95
- end
93
+ raise event unless event.message.start_with?('MOVED', 'CLUSTERDOWN Hash slot not served')
96
94
 
97
- raise event
95
+ break start_over
96
+ when ::RedisClient::ConnectionError
97
+ break start_over
98
98
  when StandardError then raise event
99
99
  when Array then break event
100
100
  end
@@ -114,25 +114,20 @@ class RedisClient
114
114
  end
115
115
  end
116
116
 
117
- def call_to_single_state(command, retry_count: 1)
117
+ def call_to_single_state(command)
118
118
  node_key = @router.find_node_key(command)
119
- @state_dict[node_key] ||= State.new(@router.find_node(node_key).pubsub, @queue)
120
- @state_dict[node_key].call(command)
121
- rescue ::RedisClient::ConnectionError
122
- @state_dict[node_key].close
123
- @state_dict.delete(node_key)
124
- @router.renew_cluster_state
125
- retry_count -= 1
126
- retry_count >= 0 ? retry : raise
119
+
120
+ handle_connection_error(node_key) do
121
+ @state_dict[node_key] ||= State.new(@router.find_node(node_key).pubsub, @queue)
122
+ @state_dict[node_key].call(command)
123
+ end
127
124
  end
128
125
 
129
126
  def call_to_all_states(command)
130
127
  @state_dict.each do |node_key, state|
131
- state.call(command)
132
- rescue ::RedisClient::ConnectionError
133
- @state_dict[node_key].close
134
- @state_dict.delete(node_key)
135
- @router.renew_cluster_state
128
+ handle_connection_error(node_key, ignore: true) do
129
+ state.call(command)
130
+ end
136
131
  end
137
132
  end
138
133
 
@@ -152,11 +147,26 @@ class RedisClient
152
147
  timeout.nil? || timeout < 0 ? 0 : timeout * 1_000_000
153
148
  end
154
149
 
150
+ def handle_connection_error(node_key, ignore: false)
151
+ yield
152
+ rescue ::RedisClient::ConnectionError
153
+ @state_dict[node_key]&.close
154
+ @state_dict.delete(node_key)
155
+ @router.renew_cluster_state
156
+ raise unless ignore
157
+ end
158
+
155
159
  def start_over
156
- @state_dict.each_value(&:close)
157
- @state_dict.clear
158
- @commands.each { |command| _call(command) }
159
- nil
160
+ loop do
161
+ @router.renew_cluster_state
162
+ @state_dict.each_value(&:close)
163
+ @state_dict.clear
164
+ @queue.clear
165
+ @commands.each { |command| _call(command) }
166
+ break
167
+ rescue ::RedisClient::ConnectionError, ::RedisClient::Cluster::NodeMightBeDown
168
+ sleep 1.0
169
+ end
160
170
  end
161
171
  end
162
172
  end
@@ -29,7 +29,7 @@ class RedisClient
29
29
  @pool = pool
30
30
  @client_kwargs = kwargs
31
31
  @node = ::RedisClient::Cluster::Node.new(concurrent_worker, config: config, pool: pool, **kwargs)
32
- renew_cluster_state
32
+ @node.reload!
33
33
  @command = ::RedisClient::Cluster::Command.load(@node.replica_clients.shuffle, slow_command_timeout: config.slow_command_timeout)
34
34
  @command_builder = @config.command_builder
35
35
  end
@@ -175,7 +175,12 @@ class RedisClient
175
175
  def find_node_key_by_key(key, seed: nil, primary: false)
176
176
  if key && !key.empty?
177
177
  slot = ::RedisClient::Cluster::KeySlotConverter.convert(key)
178
- primary ? @node.find_node_key_of_primary(slot) : @node.find_node_key_of_replica(slot)
178
+ node_key = primary ? @node.find_node_key_of_primary(slot) : @node.find_node_key_of_replica(slot)
179
+ if node_key.nil?
180
+ renew_cluster_state
181
+ raise ::RedisClient::Cluster::NodeMightBeDown
182
+ end
183
+ node_key
179
184
  else
180
185
  primary ? @node.any_primary_node_key(seed: seed) : @node.any_replica_node_key(seed: seed)
181
186
  end
@@ -236,6 +241,8 @@ class RedisClient
236
241
 
237
242
  def renew_cluster_state
238
243
  @node.reload!
244
+ rescue ::RedisClient::Cluster::InitialSetupError
245
+ # ignore
239
246
  end
240
247
 
241
248
  def close
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-cluster-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.1
4
+ version: 0.11.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taishi Kasuga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-26 00:00:00.000000000 Z
11
+ date: 2024-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis-client