Skip to content

Commit 658e982

Browse files
committed
refactor: simplify cluster refresh
1 parent 3f8295d commit 658e982

File tree

1 file changed

+23
-36
lines changed

1 file changed

+23
-36
lines changed

cluster.go

Lines changed: 23 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -140,66 +140,53 @@ func (c *clusterClient) refresh() (err error) {
140140
type clusterslots struct {
141141
reply RedisResult
142142
addr string
143+
ver int
144+
}
145+
146+
func (s clusterslots) parse(tls bool) map[string]group {
147+
if s.ver < 7 {
148+
return parseSlots(s.reply.val, s.addr)
149+
}
150+
return parseShards(s.reply.val, s.addr, tls)
151+
}
152+
153+
func getClusterSlots(c conn) clusterslots {
154+
if c.Version() < 7 {
155+
return clusterslots{reply: c.Do(context.Background(), cmds.SlotCmd), addr: c.Addr(), ver: c.Version()}
156+
}
157+
return clusterslots{reply: c.Do(context.Background(), cmds.ShardsCmd), addr: c.Addr(), ver: c.Version()}
143158
}
144159

145160
func (c *clusterClient) _refresh() (err error) {
146-
type versionedResult struct {
147-
version int
148-
reply RedisResult
149-
addr string
150-
}
151-
var (
152-
reply RedisMessage
153-
addr string
154-
version int
155-
)
156161
c.mu.RLock()
157-
results := make(chan versionedResult, len(c.conns))
162+
results := make(chan clusterslots, len(c.conns))
158163
pending := make([]conn, 0, len(c.conns))
159164
for _, cc := range c.conns {
160165
pending = append(pending, cc)
161166
}
162167
c.mu.RUnlock()
163168

169+
var result clusterslots
164170
for i := 0; i < cap(results); i++ {
165171
if i&3 == 0 { // batch CLUSTER SLOTS/CLUSTER SHARDS for every 4 connections
166172
for j := i; j < i+4 && j < len(pending); j++ {
167173
go func(c conn) {
168-
var reply RedisResult
169-
if c.Version() < 7 {
170-
reply = c.Do(context.Background(), cmds.SlotCmd)
171-
} else {
172-
reply = c.Do(context.Background(), cmds.ShardsCmd)
173-
}
174-
results <- versionedResult{
175-
version: c.Version(),
176-
reply: reply,
177-
addr: c.Addr(),
178-
}
174+
results <- getClusterSlots(c)
179175
}(pending[j])
180176
}
181177
}
182-
r := <-results
183-
version = r.version
184-
addr = r.addr
185-
reply, err = r.reply.ToMessage()
186-
if len(reply.values) != 0 {
178+
result = <-results
179+
err = result.reply.Error()
180+
if len(result.reply.val.values) != 0 {
187181
break
188182
}
189183
}
190-
pending = nil
191-
192184
if err != nil {
193185
return err
194186
}
187+
pending = nil
195188

196-
var groups map[string]group
197-
if version < 7 {
198-
groups = parseSlots(reply, addr)
199-
} else {
200-
groups = parseShards(reply, addr, c.opt.TLSConfig != nil)
201-
}
202-
189+
groups := result.parse(c.opt.TLSConfig != nil)
203190
conns := make(map[string]conn, len(groups))
204191
for _, g := range groups {
205192
for _, addr := range g.nodes {

0 commit comments

Comments
 (0)