github.com/argoproj/argo-cd/v2@v2.10.5/util/cache/redis_hook.go (about) 1 package cache 2 3 import ( 4 "context" 5 "errors" 6 "net" 7 8 "github.com/redis/go-redis/v9" 9 log "github.com/sirupsen/logrus" 10 ) 11 12 type argoRedisHooks struct { 13 reconnectCallback func() 14 } 15 16 func NewArgoRedisHook(reconnectCallback func()) *argoRedisHooks { 17 return &argoRedisHooks{reconnectCallback: reconnectCallback} 18 } 19 20 func (hook *argoRedisHooks) DialHook(next redis.DialHook) redis.DialHook { 21 return func(ctx context.Context, network, addr string) (net.Conn, error) { 22 conn, err := next(ctx, network, addr) 23 return conn, err 24 } 25 } 26 27 func (hook *argoRedisHooks) ProcessHook(next redis.ProcessHook) redis.ProcessHook { 28 return func(ctx context.Context, cmd redis.Cmder) error { 29 var dnsError *net.DNSError 30 err := next(ctx, cmd) 31 if err != nil && errors.As(err, &dnsError) { 32 log.Warnf("Reconnect to redis because error: \"%v\"", err) 33 hook.reconnectCallback() 34 } 35 return err 36 } 37 } 38 39 func (hook *argoRedisHooks) ProcessPipelineHook(next redis.ProcessPipelineHook) redis.ProcessPipelineHook { 40 return nil 41 }