Skip to content

Commit c395ecc

Browse files
authored
test: fix resharding test for scale reading (#139)
1 parent 3de8f27 commit c395ecc

File tree

7 files changed

+69
-35
lines changed

7 files changed

+69
-35
lines changed

.rubocop.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ Metrics/BlockLength:
3030
Exclude:
3131
- 'test/**/*'
3232

33+
Metrics/ParameterLists:
34+
Max: 10
35+
3336
Layout/LineLength:
3437
Max: 200
3538

lib/redis_client/cluster/node.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def parse_node_info(info) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticC
105105
end
106106
end
107107

108-
def initialize( # rubocop:disable Metrics/ParameterLists
108+
def initialize(
109109
options,
110110
node_info: [],
111111
with_replica: false,

lib/redis_client/cluster/node/latency_replica.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def find_node_key_of_replica(primary_node_key, seed: nil) # rubocop:disable Lint
3434

3535
def any_replica_node_key(seed: nil)
3636
random = seed.nil? ? Random : Random.new(seed)
37-
@existed_replicas.sample(random: random)&.first
37+
@existed_replicas.sample(random: random)&.first || any_primary_node_key(seed: seed)
3838
end
3939

4040
private

lib/redis_client/cluster/node/random_replica.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def find_node_key_of_replica(primary_node_key, seed: nil)
2929

3030
def any_replica_node_key(seed: nil)
3131
random = seed.nil? ? Random : Random.new(seed)
32-
@replica_node_keys.sample(random: random)
32+
@replica_node_keys.sample(random: random) || any_primary_node_key(seed: seed)
3333
end
3434
end
3535
end

lib/redis_client/cluster/router.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ def send_command(method, command, *args, &block) # rubocop:disable Metrics/AbcSi
6363
raise
6464
end
6565

66-
# @see https://redis.io/topics/cluster-spec#redirection-and-resharding
67-
# Redirection and resharding
66+
# @see https://redis.io/docs/reference/cluster-spec/#redirection-and-resharding Redirection and resharding
6867
def try_send(node, method, command, args, retry_count: 3, &block) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
6968
if args.empty?
7069
# prevent memory allocation for variable-length args

lib/redis_client/cluster_config.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class ClusterConfig
2222

2323
attr_reader :command_builder, :client_config, :replica_affinity
2424

25-
def initialize( # rubocop:disable Metrics/ParameterLists
25+
def initialize(
2626
nodes: DEFAULT_NODES,
2727
replica: false,
2828
replica_affinity: :random,

test/test_against_cluster_state.rb

Lines changed: 61 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ def setup
1717
end
1818

1919
def teardown
20-
@controller.rebuild
2120
@controller.close
2221
@client.close
2322
end
@@ -90,47 +89,80 @@ def do_resharding_test(number_of_keys: 1000)
9089
class PrimaryOnly < TestingWrapper
9190
include Mixin
9291

92+
private
93+
94+
def new_test_client
95+
::RedisClient.cluster(
96+
nodes: TEST_NODE_URIS,
97+
fixed_hostname: TEST_FIXED_HOSTNAME,
98+
**TEST_GENERIC_OPTIONS
99+
).new_client
100+
end
101+
end
102+
103+
class ScaleReadRandom < TestingWrapper
104+
include Mixin
105+
106+
def test_the_state_of_cluster_resharding
107+
keys = nil
108+
do_resharding_test { |ks| keys = ks }
109+
keys.each { |key| assert_equal(key, @client.call('GET', key), "Case: GET: #{key}") }
110+
end
111+
112+
def test_the_state_of_cluster_resharding_with_pipelining
113+
keys = nil
114+
do_resharding_test { |ks| keys = ks }
115+
values = @client.pipelined { |pipeline| keys.each { |key| pipeline.call('GET', key) } }
116+
keys.each_with_index { |key, i| assert_equal(key, values[i], "Case: GET: #{key}") }
117+
end
118+
119+
private
120+
93121
def new_test_client
94122
::RedisClient.cluster(
95123
nodes: TEST_NODE_URIS,
124+
replica: true,
125+
replica_affinity: :random,
96126
fixed_hostname: TEST_FIXED_HOSTNAME,
97127
**TEST_GENERIC_OPTIONS
98128
).new_client
99129
end
100130
end
101131

102-
# # TODO: https://github.com/redis-rb/redis-cluster-client/issues/42
103-
# class ScaleReadRandom < TestingWrapper
104-
# include Mixin
105-
#
106-
# def new_test_client
107-
# ::RedisClient.cluster(
108-
# nodes: TEST_NODE_URIS,
109-
# replica: true,
110-
# replica_affinity: :random,
111-
# fixed_hostname: TEST_FIXED_HOSTNAME,
112-
# **TEST_GENERIC_OPTIONS
113-
# ).new_client
114-
# end
115-
# end
116-
#
117-
# class ScaleReadLatency < TestingWrapper
118-
# include Mixin
119-
#
120-
# def new_test_client
121-
# ::RedisClient.cluster(
122-
# nodes: TEST_NODE_URIS,
123-
# replica: true,
124-
# replica_affinity: :latency,
125-
# fixed_hostname: TEST_FIXED_HOSTNAME,
126-
# **TEST_GENERIC_OPTIONS
127-
# ).new_client
128-
# end
129-
# end
132+
class ScaleReadLatency < TestingWrapper
133+
include Mixin
134+
135+
def test_the_state_of_cluster_resharding
136+
keys = nil
137+
do_resharding_test { |ks| keys = ks }
138+
keys.each { |key| assert_equal(key, @client.call('GET', key), "Case: GET: #{key}") }
139+
end
140+
141+
def test_the_state_of_cluster_resharding_with_pipelining
142+
keys = nil
143+
do_resharding_test { |ks| keys = ks }
144+
values = @client.pipelined { |pipeline| keys.each { |key| pipeline.call('GET', key) } }
145+
keys.each_with_index { |key, i| assert_equal(key, values[i], "Case: GET: #{key}") }
146+
end
147+
148+
private
149+
150+
def new_test_client
151+
::RedisClient.cluster(
152+
nodes: TEST_NODE_URIS,
153+
replica: true,
154+
replica_affinity: :latency,
155+
fixed_hostname: TEST_FIXED_HOSTNAME,
156+
**TEST_GENERIC_OPTIONS
157+
).new_client
158+
end
159+
end
130160

131161
class Pooled < TestingWrapper
132162
include Mixin
133163

164+
private
165+
134166
def new_test_client
135167
::RedisClient.cluster(
136168
nodes: TEST_NODE_URIS,

0 commit comments

Comments
 (0)