errors.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package internal
  2. import (
  3. "io"
  4. "net"
  5. "strings"
  6. )
  7. const Nil = RedisError("redis: nil")
  8. type RedisError string
  9. func (e RedisError) Error() string { return string(e) }
  10. func IsRetryableError(err error) bool {
  11. return IsNetworkError(err)
  12. }
  13. func IsInternalError(err error) bool {
  14. _, ok := err.(RedisError)
  15. return ok
  16. }
  17. func IsNetworkError(err error) bool {
  18. if err == io.EOF {
  19. return true
  20. }
  21. _, ok := err.(net.Error)
  22. return ok
  23. }
  24. func IsBadConn(err error, allowTimeout bool) bool {
  25. if err == nil {
  26. return false
  27. }
  28. if IsInternalError(err) {
  29. return false
  30. }
  31. if allowTimeout {
  32. if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
  33. return false
  34. }
  35. }
  36. return true
  37. }
  38. func IsMovedError(err error) (moved bool, ask bool, addr string) {
  39. if !IsInternalError(err) {
  40. return
  41. }
  42. s := err.Error()
  43. if strings.HasPrefix(s, "MOVED ") {
  44. moved = true
  45. } else if strings.HasPrefix(s, "ASK ") {
  46. ask = true
  47. } else {
  48. return
  49. }
  50. ind := strings.LastIndex(s, " ")
  51. if ind == -1 {
  52. return false, false, ""
  53. }
  54. addr = s[ind+1:]
  55. return
  56. }
  57. func IsLoadingError(err error) bool {
  58. return strings.HasPrefix(err.Error(), "LOADING")
  59. }
  60. func IsExecAbortError(err error) bool {
  61. return strings.HasPrefix(err.Error(), "EXECABORT")
  62. }