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  }