@@ -17,18 +17,57 @@ class Cluster
17
17
class Router
18
18
ZERO_CURSOR_FOR_SCAN = '0'
19
19
TSF = -> ( f , x ) { f . nil? ? x : f . call ( x ) } . curry
20
+ DEDICATED_ACTIONS = lambda do # rubocop:disable Metrics/BlockLength
21
+ action = Struct . new ( 'RedisCommandRoutingAction' , :method_name , :reply_transformer , keyword_init : true )
22
+ pick_first = -> ( reply ) { reply . first } # rubocop:disable Style/SymbolProc
23
+ multiple_key_action = action . new ( method_name : :send_multiple_keys_command )
24
+ all_node_first_action = action . new ( method_name : :send_command_to_all_nodes , reply_transformer : pick_first )
25
+ primary_first_action = action . new ( method_name : :send_command_to_primaries , reply_transformer : pick_first )
26
+ not_supported_action = action . new ( method_name : :fail_not_supported_command )
27
+ keyless_action = action . new ( method_name : :fail_keyless_command )
28
+ {
29
+ 'ping' => action . new ( method_name : :send_ping_command , reply_transformer : pick_first ) ,
30
+ 'wait' => action . new ( method_name : :send_wait_command ) ,
31
+ 'keys' => action . new ( method_name : :send_command_to_replicas , reply_transformer : -> ( reply ) { reply . flatten . sort_by ( &:to_s ) } ) ,
32
+ 'dbsize' => action . new ( method_name : :send_command_to_replicas , reply_transformer : -> ( reply ) { reply . select { |e | e . is_a? ( Integer ) } . sum } ) ,
33
+ 'scan' => action . new ( method_name : :send_scan_command ) ,
34
+ 'lastsave' => action . new ( method_name : :send_command_to_all_nodes , reply_transformer : -> ( reply ) { reply . sort_by ( &:to_i ) } ) ,
35
+ 'role' => action . new ( method_name : :send_command_to_all_nodes ) ,
36
+ 'config' => action . new ( method_name : :send_config_command ) ,
37
+ 'client' => action . new ( method_name : :send_client_command ) ,
38
+ 'cluster' => action . new ( method_name : :send_cluster_command ) ,
39
+ 'memory' => action . new ( method_name : :send_memory_command ) ,
40
+ 'script' => action . new ( method_name : :send_script_command ) ,
41
+ 'pubsub' => action . new ( method_name : :send_pubsub_command ) ,
42
+ 'watch' => action . new ( method_name : :send_watch_command ) ,
43
+ 'mget' => multiple_key_action ,
44
+ 'mset' => multiple_key_action ,
45
+ 'del' => multiple_key_action ,
46
+ 'acl' => all_node_first_action ,
47
+ 'auth' => all_node_first_action ,
48
+ 'bgrewriteaof' => all_node_first_action ,
49
+ 'bgsave' => all_node_first_action ,
50
+ 'quit' => all_node_first_action ,
51
+ 'save' => all_node_first_action ,
52
+ 'flushall' => primary_first_action ,
53
+ 'flushdb' => primary_first_action ,
54
+ 'readonly' => not_supported_action ,
55
+ 'readwrite' => not_supported_action ,
56
+ 'shutdown' => not_supported_action ,
57
+ 'discard' => keyless_action ,
58
+ 'exec' => keyless_action ,
59
+ 'multi' => keyless_action ,
60
+ 'unwatch' => keyless_action
61
+ } . each_with_object ( { } ) do |( k , v ) , acc |
62
+ acc [ k ] = v
63
+ acc [ k . upcase ] = v
64
+ end
65
+ end . call . freeze
20
66
21
- private_constant :ZERO_CURSOR_FOR_SCAN , :TSF
67
+ private_constant :ZERO_CURSOR_FOR_SCAN , :TSF , :DEDICATED_ACTIONS
22
68
23
69
attr_reader :config
24
70
25
- Action = Struct . new (
26
- 'RedisCommandRoutingAction' ,
27
- :method_name ,
28
- :reply_transformer ,
29
- keyword_init : true
30
- )
31
-
32
71
def initialize ( config , concurrent_worker , pool : nil , **kwargs )
33
72
@config = config
34
73
@concurrent_worker = concurrent_worker
@@ -38,16 +77,15 @@ def initialize(config, concurrent_worker, pool: nil, **kwargs)
38
77
@node . reload!
39
78
@command = ::RedisClient ::Cluster ::Command . load ( @node . replica_clients . shuffle , slow_command_timeout : config . slow_command_timeout )
40
79
@command_builder = @config . command_builder
41
- @dedicated_actions = build_dedicated_actions
42
80
rescue ::RedisClient ::Cluster ::InitialSetupError => e
43
81
e . with_config ( config )
44
82
raise
45
83
end
46
84
47
85
def send_command ( method , command , *args , &block ) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
48
- return assign_node_and_send_command ( method , command , args , &block ) unless @dedicated_actions . key? ( command . first )
86
+ return assign_node_and_send_command ( method , command , args , &block ) unless DEDICATED_ACTIONS . key? ( command . first )
49
87
50
- action = @dedicated_actions [ command . first ]
88
+ action = DEDICATED_ACTIONS [ command . first ]
51
89
return send ( action . method_name , method , command , args , &block ) if action . reply_transformer . nil?
52
90
53
91
reply = send ( action . method_name , method , command , args )
@@ -257,53 +295,6 @@ def close
257
295
258
296
private
259
297
260
- def build_dedicated_actions # rubocop:disable Metrics/AbcSize
261
- pick_first = -> ( reply ) { reply . first } # rubocop:disable Style/SymbolProc
262
- multiple_key_action = Action . new ( method_name : :send_multiple_keys_command )
263
- all_node_first_action = Action . new ( method_name : :send_command_to_all_nodes , reply_transformer : pick_first )
264
- primary_first_action = Action . new ( method_name : :send_command_to_primaries , reply_transformer : pick_first )
265
- not_supported_action = Action . new ( method_name : :fail_not_supported_command )
266
- keyless_action = Action . new ( method_name : :fail_keyless_command )
267
- actions = {
268
- 'ping' => Action . new ( method_name : :send_ping_command , reply_transformer : pick_first ) ,
269
- 'wait' => Action . new ( method_name : :send_wait_command ) ,
270
- 'keys' => Action . new ( method_name : :send_command_to_replicas , reply_transformer : -> ( reply ) { reply . flatten . sort_by ( &:to_s ) } ) ,
271
- 'dbsize' => Action . new ( method_name : :send_command_to_replicas , reply_transformer : -> ( reply ) { reply . select { |e | e . is_a? ( Integer ) } . sum } ) ,
272
- 'scan' => Action . new ( method_name : :send_scan_command ) ,
273
- 'lastsave' => Action . new ( method_name : :send_command_to_all_nodes , reply_transformer : -> ( reply ) { reply . sort_by ( &:to_i ) } ) ,
274
- 'role' => Action . new ( method_name : :send_command_to_all_nodes ) ,
275
- 'config' => Action . new ( method_name : :send_config_command ) ,
276
- 'client' => Action . new ( method_name : :send_client_command ) ,
277
- 'cluster' => Action . new ( method_name : :send_cluster_command ) ,
278
- 'memory' => Action . new ( method_name : :send_memory_command ) ,
279
- 'script' => Action . new ( method_name : :send_script_command ) ,
280
- 'pubsub' => Action . new ( method_name : :send_pubsub_command ) ,
281
- 'watch' => Action . new ( method_name : :send_watch_command ) ,
282
- 'mget' => multiple_key_action ,
283
- 'mset' => multiple_key_action ,
284
- 'del' => multiple_key_action ,
285
- 'acl' => all_node_first_action ,
286
- 'auth' => all_node_first_action ,
287
- 'bgrewriteaof' => all_node_first_action ,
288
- 'bgsave' => all_node_first_action ,
289
- 'quit' => all_node_first_action ,
290
- 'save' => all_node_first_action ,
291
- 'flushall' => primary_first_action ,
292
- 'flushdb' => primary_first_action ,
293
- 'readonly' => not_supported_action ,
294
- 'readwrite' => not_supported_action ,
295
- 'shutdown' => not_supported_action ,
296
- 'discard' => keyless_action ,
297
- 'exec' => keyless_action ,
298
- 'multi' => keyless_action ,
299
- 'unwatch' => keyless_action
300
- } . freeze
301
- actions . each_with_object ( { } ) do |( k , v ) , acc |
302
- acc [ k ] = v
303
- acc [ k . upcase ] = v
304
- end . freeze
305
- end
306
-
307
298
def send_command_to_all_nodes ( method , command , args , &block )
308
299
@node . call_all ( method , command , args , &block )
309
300
end
0 commit comments