Merge pull request #390 from lijunfei/v4

if readonly is open, read from master when slave is loading data
This commit is contained in:
Vladimir Mihailenco 2016-10-09 10:56:35 +03:00 committed by GitHub
commit be32042426
2 changed files with 17 additions and 0 deletions

View File

@ -300,6 +300,17 @@ func (c *ClusterClient) Process(cmd Cmder) error {
return nil 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. // On network errors try random node.
if errors.IsRetryable(err) { if errors.IsRetryable(err) {
node, err = c.randomNode() node, err = c.randomNode()

View File

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