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

Fix WrapProcess for Ring and Cluster. Add better example.

This commit is contained in:
Vladimir Mihailenco
2016-11-30 12:39:14 +02:00
parent b148c1afd3
commit 82f21639bf
7 changed files with 124 additions and 61 deletions

26
ring.go
View File

@@ -230,7 +230,7 @@ func (c *Ring) addClient(name string, cl *Client) {
c.mu.Unlock()
}
func (c *Ring) shardByKey(key string) (*Client, error) {
func (c *Ring) shardByKey(key string) (*ringShard, error) {
key = hashtag.Key(key)
c.mu.RLock()
@@ -246,27 +246,27 @@ func (c *Ring) shardByKey(key string) (*Client, error) {
return nil, errRingShardsDown
}
cl := c.shards[name].Client
shard := c.shards[name]
c.mu.RUnlock()
return cl, nil
return shard, nil
}
func (c *Ring) randomShard() (*Client, error) {
func (c *Ring) randomShard() (*ringShard, error) {
return c.shardByKey(strconv.Itoa(rand.Int()))
}
func (c *Ring) shardByName(name string) (*Client, error) {
func (c *Ring) shardByName(name string) (*ringShard, error) {
if name == "" {
return c.randomShard()
}
c.mu.RLock()
cl := c.shards[name].Client
shard := c.shards[name]
c.mu.RUnlock()
return cl, nil
return shard, nil
}
func (c *Ring) cmdShard(cmd Cmder) (*Client, error) {
func (c *Ring) cmdShard(cmd Cmder) (*ringShard, error) {
cmdInfo := c.cmdInfo(cmd.arg(0))
firstKey := cmd.arg(cmdFirstKeyPos(cmd, cmdInfo))
if firstKey == "" {
@@ -276,12 +276,12 @@ func (c *Ring) cmdShard(cmd Cmder) (*Client, error) {
}
func (c *Ring) Process(cmd Cmder) error {
cl, err := c.cmdShard(cmd)
shard, err := c.cmdShard(cmd)
if err != nil {
cmd.setErr(err)
return err
}
return cl.baseClient.Process(cmd)
return shard.Client.Process(cmd)
}
// rebalance removes dead shards from the Ring.
@@ -384,7 +384,7 @@ func (c *Ring) pipelineExec(cmds []Cmder) (firstErr error) {
resetCmds(cmds)
}
client, err := c.shardByName(name)
shard, err := c.shardByName(name)
if err != nil {
setCmdsErr(cmds, err)
if firstErr == nil {
@@ -393,7 +393,7 @@ func (c *Ring) pipelineExec(cmds []Cmder) (firstErr error) {
continue
}
cn, _, err := client.conn()
cn, _, err := shard.Client.conn()
if err != nil {
setCmdsErr(cmds, err)
if firstErr == nil {
@@ -403,7 +403,7 @@ func (c *Ring) pipelineExec(cmds []Cmder) (firstErr error) {
}
retry, err := execCmds(cn, cmds)
client.putConn(cn, err, false)
shard.Client.putConn(cn, err, false)
if err == nil {
continue
}