1
0
mirror of https://github.com/redis/go-redis.git synced 2025-07-28 06:42:00 +03:00

execute commans concurrently on each cluster node in method defaultProcessPipeline (#861)

Execute commands concurrently on each cluster node
This commit is contained in:
zhanyr
2018-09-11 17:37:57 +08:00
committed by Vladimir Mihailenco
parent dd997adc42
commit a9e329d3bc

View File

@ -1254,18 +1254,25 @@ func (c *ClusterClient) defaultProcessPipeline(cmds []Cmder) error {
failedCmds := make(map[*clusterNode][]Cmder) failedCmds := make(map[*clusterNode][]Cmder)
var wg sync.WaitGroup
var lock sync.RWMutex
for node, cmds := range cmdsMap { for node, cmds := range cmdsMap {
wg.Add(1)
go func(node *clusterNode, cmds []Cmder) {
defer wg.Done()
failedCmdsTmp := make(map[*clusterNode][]Cmder)
cn, err := node.Client.getConn() cn, err := node.Client.getConn()
if err != nil { if err != nil {
if err == pool.ErrClosed { if err == pool.ErrClosed {
c.remapCmds(cmds, failedCmds) c.remapCmds(cmds, failedCmdsTmp)
} else { } else {
setCmdsErr(cmds, err) setCmdsErr(cmds, err)
} }
continue
}
err = c.pipelineProcessCmds(node, cn, cmds, failedCmds) } else {
err = c.pipelineProcessCmds(node, cn, cmds, failedCmdsTmp)
if err == nil || internal.IsRedisError(err) { if err == nil || internal.IsRedisError(err) {
node.Client.connPool.Put(cn) node.Client.connPool.Put(cn)
} else { } else {
@ -1273,6 +1280,22 @@ func (c *ClusterClient) defaultProcessPipeline(cmds []Cmder) error {
} }
} }
if len(failedCmdsTmp) > 0 {
for node, cs := range failedCmdsTmp {
lock.Lock()
if _, ok := failedCmds[node]; ok {
failedCmds[node] = append(failedCmds[node], cs...)
} else {
failedCmds[node] = cs
}
lock.Unlock()
}
}
}(node, cmds)
}
wg.Wait()
if len(failedCmds) == 0 { if len(failedCmds) == 0 {
break break
} }