...

Source file src/github.com/launchdarkly/go-server-sdk-redis-redigo/v2/redis_big_segments_impl.go

Documentation: github.com/launchdarkly/go-server-sdk-redis-redigo/v2

     1  package ldredis
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  
     7  	r "github.com/gomodule/redigo/redis"
     8  
     9  	"github.com/launchdarkly/go-sdk-common/v3/ldlog"
    10  	"github.com/launchdarkly/go-sdk-common/v3/ldtime"
    11  	"github.com/launchdarkly/go-server-sdk/v6/subsystems"
    12  	"github.com/launchdarkly/go-server-sdk/v6/subsystems/ldstoreimpl"
    13  )
    14  
    15  // Internal implementation of the BigSegmentStore interface for Redis.
    16  type redisBigSegmentStoreImpl struct {
    17  	prefix  string
    18  	pool    Pool
    19  	loggers ldlog.Loggers
    20  }
    21  
    22  func newRedisBigSegmentStoreImpl(
    23  	builder builderOptions,
    24  	loggers ldlog.Loggers,
    25  ) *redisBigSegmentStoreImpl {
    26  	impl := &redisBigSegmentStoreImpl{
    27  		prefix:  builder.prefix,
    28  		pool:    builder.pool,
    29  		loggers: loggers,
    30  	}
    31  	impl.loggers.SetPrefix("RedisBigSegmentStore:")
    32  
    33  	if impl.pool == nil {
    34  		logRedisURL(loggers, builder.url)
    35  		impl.pool = newPool(builder.url, builder.dialOptions)
    36  	}
    37  	return impl
    38  }
    39  
    40  func (store *redisBigSegmentStoreImpl) GetMetadata() (subsystems.BigSegmentStoreMetadata, error) {
    41  	c := store.getConn()
    42  	defer c.Close() //nolint:errcheck
    43  
    44  	valueStr, err := r.String(c.Do("GET", bigSegmentsSyncTimeKey(store.prefix)))
    45  	if err != nil {
    46  		if err == r.ErrNil {
    47  			// this is just a "not found" result, not a database error
    48  			err = nil
    49  		}
    50  		return subsystems.BigSegmentStoreMetadata{}, err
    51  	}
    52  	value, err := strconv.ParseUint(valueStr, 10, 64)
    53  	if err != nil {
    54  		return subsystems.BigSegmentStoreMetadata{}, err
    55  	}
    56  
    57  	return subsystems.BigSegmentStoreMetadata{
    58  		LastUpToDate: ldtime.UnixMillisecondTime(value),
    59  	}, nil
    60  }
    61  
    62  func (store *redisBigSegmentStoreImpl) GetMembership(
    63  	contextHashKey string,
    64  ) (subsystems.BigSegmentMembership, error) {
    65  	c := store.getConn()
    66  	defer c.Close() //nolint:errcheck
    67  
    68  	includedRefs, err := r.Strings(c.Do("SMEMBERS", bigSegmentsIncludeKey(store.prefix, contextHashKey)))
    69  	if err != nil && err != r.ErrNil {
    70  		return nil, err
    71  	}
    72  	excludedRefs, err := r.Strings(c.Do("SMEMBERS", bigSegmentsExcludeKey(store.prefix, contextHashKey)))
    73  	if err != nil && err != r.ErrNil {
    74  		return nil, err
    75  	}
    76  
    77  	return ldstoreimpl.NewBigSegmentMembershipFromSegmentRefs(includedRefs, excludedRefs), nil
    78  }
    79  
    80  func (store *redisBigSegmentStoreImpl) Close() error {
    81  	return store.pool.Close()
    82  }
    83  
    84  func (store *redisBigSegmentStoreImpl) getConn() r.Conn {
    85  	return store.pool.Get()
    86  }
    87  
    88  func bigSegmentsSyncTimeKey(prefix string) string {
    89  	return fmt.Sprintf("%s:big_segments_synchronized_on", prefix)
    90  }
    91  
    92  func bigSegmentsIncludeKey(prefix, contextHashKey string) string {
    93  	return fmt.Sprintf("%s:big_segment_include:%s", prefix, contextHashKey)
    94  }
    95  
    96  func bigSegmentsExcludeKey(prefix, contextHashKey string) string {
    97  	return fmt.Sprintf("%s:big_segment_exclude:%s", prefix, contextHashKey)
    98  }
    99  

View as plain text