Skip to content

Commit fdb6041

Browse files
committed
refactor: simplify cluster shards
1 parent 8503e0d commit fdb6041

File tree

1 file changed

+35
-71
lines changed

1 file changed

+35
-71
lines changed

cluster.go

Lines changed: 35 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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
267277
func 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
304302
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-
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

Comments
 (0)