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:
committed by
Vladimir Mihailenco
parent
dd997adc42
commit
a9e329d3bc
31
cluster.go
31
cluster.go
@ -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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user