if readonly, read from master when slave is loading

This commit is contained in:
lijunfei 2016-10-09 11:30:01 +08:00
parent 6d51952d43
commit 3cc9b99fb8
2 changed files with 17 additions and 0 deletions

View File

@ -300,6 +300,17 @@ func (c *ClusterClient) Process(cmd Cmder) error {
return nil
}
// If slave is loading, read from master
if errors.IsLoading(cmd.Err()) && c.opt.ReadOnly {
trynode, err := c.slotMasterNode(slot)
if err == nil && trynode != node {
node = trynode
continue
} else {
break
}
}
// On network errors try random node.
if errors.IsRetryable(err) {
node, err = c.randomNode()

View File

@ -10,6 +10,8 @@ const Nil = RedisError("redis: nil")
type RedisError string
var LoadingError RedisError = "LOADING Redis is loading the dataset in memory"
func (e RedisError) Error() string { return string(e) }
func IsRetryable(err error) bool {
@ -65,3 +67,7 @@ func IsMoved(err error) (moved bool, ask bool, addr string) {
addr = s[ind+1:]
return
}
func IsLoading(err error) bool {
return err.Error() == string(LastIndexoadingError)
}