@@ -262,35 +262,33 @@ type group struct {
262262 slots [][2 ]int64
263263}
264264
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+
265275// parseSlots - map redis slots for each redis nodes/addresses
266276// defaultAddr is needed in case the node does not know its own IP
267277func parseSlots (slots RedisMessage , defaultAddr string ) map [string ]group {
268278 groups := make (map [string ]group , len (slots .values ))
269279 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 == "" {
275282 continue
276- default :
277- master = net .JoinHostPort (v .values [2 ].values [0 ].string , strconv .FormatInt (v .values [2 ].values [1 ].integer , 10 ))
278283 }
279284 g , ok := groups [master ]
280285 if ! ok {
281286 g .slots = make ([][2 ]int64 , 0 )
282287 g .nodes = make ([]string , 0 , len (v .values )- 2 )
283288 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 )
292291 }
293- g .nodes = append (g .nodes , dst )
294292 }
295293 }
296294 g .slots = append (g .slots , [2 ]int64 {v .values [0 ].integer , v .values [1 ].integer })
@@ -302,70 +300,36 @@ func parseSlots(slots RedisMessage, defaultAddr string) map[string]group {
302300// parseShards - map redis shards for each redis nodes/addresses
303301// defaultAddr is needed in case the node does not know its own IP
304302func 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-
322303 groups := make (map [string ]group , len (shards .values ))
323304 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 ),
338312 }
339-
340- if master == "" {
341- continue
313+ for i := range g .slots {
314+ g .slots [i ] = [2 ]int64 {slots [i * 2 ].integer , slots [i * 2 + 1 ].integer }
342315 }
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
316+ for _ , n := range nodes {
317+ dict , _ := n .ToMap ()
318+ port := dict ["port" ].integer
319+ if tls && dict ["tls-port" ].integer > 0 {
320+ port = dict ["tls-port" ].integer
321+ }
322+ if dst := parseEndpoint (defaultAddr , dict ["endpoint" ].string , port ); dst != "" {
323+ if dict ["role" ].string == "master" {
324+ m = len (g .nodes )
357325 }
358326 g .nodes = append (g .nodes , dst )
359327 }
360328 }
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 })
329+ if m >= 0 {
330+ g .nodes [0 ], g .nodes [m ] = g .nodes [m ], g .nodes [0 ]
331+ groups [g .nodes [0 ]] = g
367332 }
368- groups [master ] = g
369333 }
370334 return groups
371335}
0 commit comments