@@ -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,37 @@ 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 ][ 0 ], _ = slots [ i * 2 ]. AsInt64 ()
315+ g . slots [ i ][ 1 ], _ = slots [ i * 2 + 1 ]. AsInt64 ()
342316 }
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 )
357326 }
358327 g .nodes = append (g .nodes , dst )
359328 }
360329 }
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
367333 }
368- groups [master ] = g
369334 }
370335 return groups
371336}
0 commit comments