@@ -140,66 +140,53 @@ func (c *clusterClient) refresh() (err error) {
140140type 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
145160func (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