http urls monitor.

error.go 1.4KB

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