...
1 package internal
2
3 import (
4 "io"
5 "net"
6 "strings"
7
8 "github.com/go-redis/redis/internal/proto"
9 )
10
11 func IsRetryableError(err error, retryTimeout bool) bool {
12 if err == nil {
13 return false
14 }
15 if err == io.EOF {
16 return true
17 }
18 if netErr, ok := err.(net.Error); ok {
19 if netErr.Timeout() {
20 return retryTimeout
21 }
22 return true
23 }
24 s := err.Error()
25 if s == "ERR max number of clients reached" {
26 return true
27 }
28 if strings.HasPrefix(s, "LOADING ") {
29 return true
30 }
31 if strings.HasPrefix(s, "READONLY ") {
32 return true
33 }
34 if strings.HasPrefix(s, "CLUSTERDOWN ") {
35 return true
36 }
37 return false
38 }
39
40 func IsRedisError(err error) bool {
41 _, ok := err.(proto.RedisError)
42 return ok
43 }
44
45 func IsBadConn(err error, allowTimeout bool) bool {
46 if err == nil {
47 return false
48 }
49 if IsRedisError(err) {
50
51 return IsReadOnlyError(err)
52 }
53 if allowTimeout {
54 if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
55 return false
56 }
57 }
58 return true
59 }
60
61 func IsMovedError(err error) (moved bool, ask bool, addr string) {
62 if !IsRedisError(err) {
63 return
64 }
65
66 s := err.Error()
67 if strings.HasPrefix(s, "MOVED ") {
68 moved = true
69 } else if strings.HasPrefix(s, "ASK ") {
70 ask = true
71 } else {
72 return
73 }
74
75 ind := strings.LastIndex(s, " ")
76 if ind == -1 {
77 return false, false, ""
78 }
79 addr = s[ind+1:]
80 return
81 }
82
83 func IsLoadingError(err error) bool {
84 return strings.HasPrefix(err.Error(), "LOADING ")
85 }
86
87 func IsReadOnlyError(err error) bool {
88 return strings.HasPrefix(err.Error(), "READONLY ")
89 }
90
View as plain text