@@ -262,35 +262,33 @@ type group struct {
262
262
slots [][2 ]int64
263
263
}
264
264
265
+ func parseEndpoint (fallback , endpoint string , port int64 ) string {
266
+ switch endpoint {
267
+ case "" :
268
+ endpoint , _ , _ = net .SplitHostPort (fallback )
269
+ case "?" :
270
+ return ""
271
+ }
272
+ return net .JoinHostPort (endpoint , strconv .FormatInt (port , 10 ))
273
+ }
274
+
265
275
// parseSlots - map redis slots for each redis nodes/addresses
266
276
// defaultAddr is needed in case the node does not know its own IP
267
277
func parseSlots (slots RedisMessage , defaultAddr string ) map [string ]group {
268
278
groups := make (map [string ]group , len (slots .values ))
269
279
for _ , v := range slots .values {
270
- var master string
271
- switch v .values [2 ].values [0 ].string {
272
- case "" :
273
- master = defaultAddr
274
- case "?" :
280
+ master := parseEndpoint (defaultAddr , v .values [2 ].values [0 ].string , v .values [2 ].values [1 ].integer )
281
+ if master == "" {
275
282
continue
276
- default :
277
- master = net .JoinHostPort (v .values [2 ].values [0 ].string , strconv .FormatInt (v .values [2 ].values [1 ].integer , 10 ))
278
283
}
279
284
g , ok := groups [master ]
280
285
if ! ok {
281
286
g .slots = make ([][2 ]int64 , 0 )
282
287
g .nodes = make ([]string , 0 , len (v .values )- 2 )
283
288
for i := 2 ; i < len (v .values ); i ++ {
284
- var dst string
285
- switch v .values [i ].values [0 ].string {
286
- case "" :
287
- dst = defaultAddr
288
- case "?" :
289
- continue
290
- default :
291
- dst = net .JoinHostPort (v .values [i ].values [0 ].string , strconv .FormatInt (v .values [i ].values [1 ].integer , 10 ))
289
+ if dst := parseEndpoint (defaultAddr , v .values [i ].values [0 ].string , v .values [i ].values [1 ].integer ); dst != "" {
290
+ g .nodes = append (g .nodes , dst )
292
291
}
293
- g .nodes = append (g .nodes , dst )
294
292
}
295
293
}
296
294
g .slots = append (g .slots , [2 ]int64 {v .values [0 ].integer , v .values [1 ].integer })
@@ -302,70 +300,37 @@ func parseSlots(slots RedisMessage, defaultAddr string) map[string]group {
302
300
// parseShards - map redis shards for each redis nodes/addresses
303
301
// defaultAddr is needed in case the node does not know its own IP
304
302
func parseShards (shards RedisMessage , defaultAddr string , tls bool ) map [string ]group {
305
- parseNodeEndpoint := func (msg map [string ]RedisMessage ) string {
306
- endpoint := msg ["endpoint" ].string
307
- switch endpoint {
308
- case "" :
309
- return defaultAddr
310
- case "?" :
311
- return ""
312
- }
313
-
314
- port := msg ["port" ].integer
315
- if tls && msg ["tls-port" ].integer > 0 {
316
- port = msg ["tls-port" ].integer
317
- }
318
-
319
- return net .JoinHostPort (endpoint , strconv .FormatInt (port , 10 ))
320
- }
321
-
322
303
groups := make (map [string ]group , len (shards .values ))
323
304
for _ , v := range shards .values {
324
- slotsAndNodes , _ := v .ToMap ()
325
- var (
326
- master string
327
- masterPos int
328
- )
329
- nodes := slotsAndNodes ["nodes" ].values
330
- for i := 0 ; i < len (nodes ); i ++ {
331
- dict , _ := nodes [i ].ToMap ()
332
- if dict ["role" ].string != "master" {
333
- continue
334
- }
335
- master = parseNodeEndpoint (dict )
336
- masterPos = i
337
- break
305
+ m := - 1
306
+ shard , _ := v .ToMap ()
307
+ slots := shard ["slots" ].values
308
+ nodes := shard ["nodes" ].values
309
+ g := group {
310
+ nodes : make ([]string , 0 , len (nodes )),
311
+ slots : make ([][2 ]int64 , len (slots )/ 2 ),
338
312
}
339
-
340
- if master == "" {
341
- continue
313
+ for i := range g . slots {
314
+ g . slots [ i ][ 0 ], _ = slots [ i * 2 ]. AsInt64 ()
315
+ g . slots [ i ][ 1 ], _ = slots [ i * 2 + 1 ]. AsInt64 ()
342
316
}
343
-
344
- g , ok := groups [master ]
345
- if ! ok {
346
- g .slots = make ([][2 ]int64 , 0 )
347
- g .nodes = make ([]string , 0 , len (nodes ))
348
- g .nodes = append (g .nodes , master )
349
- for i := 0 ; i < len (nodes ); i ++ {
350
- if i == masterPos {
351
- continue
352
- }
353
- dict , _ := nodes [i ].ToMap ()
354
- dst := parseNodeEndpoint (dict )
355
- if dst == "" {
356
- continue
317
+ for _ , n := range nodes {
318
+ dict , _ := n .ToMap ()
319
+ port := dict ["port" ].integer
320
+ if tls && dict ["tls-port" ].integer > 0 {
321
+ port = dict ["tls-port" ].integer
322
+ }
323
+ if dst := parseEndpoint (defaultAddr , dict ["endpoint" ].string , port ); dst != "" {
324
+ if dict ["role" ].string == "master" {
325
+ m = len (g .nodes )
357
326
}
358
327
g .nodes = append (g .nodes , dst )
359
328
}
360
329
}
361
- slots := slotsAndNodes ["slots" ]
362
- arr , _ := slots .ToArray ()
363
- for i := 0 ; i + 1 < len (arr ); i += 2 {
364
- start , _ := arr [i ].AsInt64 ()
365
- end , _ := arr [i + 1 ].AsInt64 ()
366
- g .slots = append (g .slots , [2 ]int64 {start , end })
330
+ if m >= 0 {
331
+ g .nodes [0 ], g .nodes [m ] = g .nodes [m ], g .nodes [0 ]
332
+ groups [g .nodes [0 ]] = g
367
333
}
368
- groups [master ] = g
369
334
}
370
335
return groups
371
336
}
0 commit comments