1
1
# frozen_string_literal: true
2
2
3
- require 'set'
4
-
5
3
class Redis
6
4
class Cluster
7
5
# Keep slot and node key map for Redis Cluster Client
@@ -28,11 +26,20 @@ def find_node_key_of_slave(slot)
28
26
return nil unless exists? ( slot )
29
27
return find_node_key_of_master ( slot ) if replica_disabled?
30
28
31
- @map [ slot ] [ :slaves ] . to_a . sample
29
+ @map [ slot ] [ :slaves ] . sample
32
30
end
33
31
34
32
def put ( slot , node_key )
35
- assign_node_key ( @map , slot , node_key )
33
+ # Since we're sharing a hash for build_slot_node_key_map, duplicate it
34
+ # if it already exists instead of preserving as-is.
35
+ @map [ slot ] = @map [ slot ] ? @map [ slot ] . dup : { master : nil , slaves : [ ] }
36
+
37
+ if master? ( node_key )
38
+ @map [ slot ] [ :master ] = node_key
39
+ elsif !@map [ slot ] [ :slaves ] . include? ( node_key )
40
+ @map [ slot ] [ :slaves ] << node_key
41
+ end
42
+
36
43
nil
37
44
end
38
45
@@ -52,20 +59,27 @@ def slave?(node_key)
52
59
53
60
# available_slots is mapping of node_key to list of slot ranges
54
61
def build_slot_node_key_map ( available_slots )
55
- available_slots . each_with_object ( { } ) do |( node_key , slots_arr ) , acc |
56
- slots_arr . each do |slots |
57
- slots . each { |slot | assign_node_key ( acc , slot , node_key ) }
62
+ by_ranges = { }
63
+ available_slots . each do |node_key , slots_arr |
64
+ by_ranges [ slots_arr ] ||= { master : nil , slaves : [ ] }
65
+
66
+ if master? ( node_key )
67
+ by_ranges [ slots_arr ] [ :master ] = node_key
68
+ elsif !by_ranges [ slots_arr ] [ :slaves ] . include? ( node_key )
69
+ by_ranges [ slots_arr ] [ :slaves ] << node_key
58
70
end
59
71
end
60
- end
61
72
62
- def assign_node_key ( mappings , slot , node_key )
63
- mappings [ slot ] ||= { master : nil , slaves : ::Set . new }
64
- if master? ( node_key )
65
- mappings [ slot ] [ :master ] = node_key
66
- else
67
- mappings [ slot ] [ :slaves ] . add ( node_key )
73
+ by_slot = { }
74
+ by_ranges . each do |slots_arr , nodes |
75
+ slots_arr . each do |slots |
76
+ slots . each do |slot |
77
+ by_slot [ slot ] = nodes
78
+ end
79
+ end
68
80
end
81
+
82
+ by_slot
69
83
end
70
84
end
71
85
end
0 commit comments