2025-01-17 18:09:39 +05:30
package memorycache
2025-01-04 01:28:54 +05:30
import (
"context"
"reflect"
2025-05-03 18:30:07 +05:30
"strings"
2025-01-04 01:28:54 +05:30
"time"
2025-03-20 21:01:41 +05:30
"github.com/SigNoz/signoz/pkg/cache"
2025-05-03 18:30:07 +05:30
"github.com/SigNoz/signoz/pkg/errors"
2025-03-20 21:01:41 +05:30
"github.com/SigNoz/signoz/pkg/factory"
2025-05-03 18:30:07 +05:30
"github.com/SigNoz/signoz/pkg/types/cachetypes"
"github.com/SigNoz/signoz/pkg/valuer"
2025-01-04 01:28:54 +05:30
go_cache "github.com/patrickmn/go-cache"
)
2025-01-17 18:09:39 +05:30
type provider struct {
2025-05-22 17:16:09 +05:30
cc * go_cache . Cache
config cache . Config
settings factory . ScopedProviderSettings
2025-01-04 01:28:54 +05:30
}
2025-01-20 17:45:33 +05:30
func NewFactory ( ) factory . ProviderFactory [ cache . Cache , cache . Config ] {
return factory . NewProviderFactory ( factory . MustNewName ( "memory" ) , New )
}
func New ( ctx context . Context , settings factory . ProviderSettings , config cache . Config ) ( cache . Cache , error ) {
2025-05-22 17:16:09 +05:30
scopedProviderSettings := factory . NewScopedProviderSettings ( settings , "github.com/SigNoz/signoz/pkg/cache/memorycache" )
return & provider { cc : go_cache . New ( config . Memory . TTL , config . Memory . CleanupInterval ) , settings : scopedProviderSettings , config : config } , nil
2025-01-04 01:28:54 +05:30
}
2025-05-22 17:16:09 +05:30
func ( provider * provider ) Set ( ctx context . Context , orgID valuer . UUID , cacheKey string , data cachetypes . Cacheable , ttl time . Duration ) error {
2025-01-04 01:28:54 +05:30
// check if the data being passed is a pointer and is not nil
2025-05-03 18:30:07 +05:30
err := cachetypes . ValidatePointer ( data , "inmemory" )
if err != nil {
return err
2025-01-04 01:28:54 +05:30
}
2025-05-22 17:16:09 +05:30
if ttl == 0 {
2025-05-25 11:40:39 +05:30
provider . settings . Logger ( ) . WarnContext ( ctx , "zero value for TTL found. defaulting to the base TTL" , "cache_key" , cacheKey , "default_ttl" , provider . config . Memory . TTL )
2025-05-22 17:16:09 +05:30
}
provider . cc . Set ( strings . Join ( [ ] string { orgID . StringValue ( ) , cacheKey } , "::" ) , data , ttl )
2025-01-04 01:28:54 +05:30
return nil
}
2025-05-22 17:16:09 +05:30
func ( provider * provider ) Get ( _ context . Context , orgID valuer . UUID , cacheKey string , dest cachetypes . Cacheable , allowExpired bool ) error {
2025-01-04 01:28:54 +05:30
// check if the destination being passed is a pointer and is not nil
2025-05-03 18:30:07 +05:30
err := cachetypes . ValidatePointer ( dest , "inmemory" )
if err != nil {
return err
2025-01-04 01:28:54 +05:30
}
// check if the destination value is settable
2025-05-03 18:30:07 +05:30
dstv := reflect . ValueOf ( dest )
2025-01-04 01:28:54 +05:30
if ! dstv . Elem ( ) . CanSet ( ) {
2025-05-03 18:30:07 +05:30
return errors . Newf ( errors . TypeInvalidInput , errors . CodeInvalidInput , "destination value is not settable, %s" , dstv . Elem ( ) )
2025-01-04 01:28:54 +05:30
}
2025-05-22 17:16:09 +05:30
data , found := provider . cc . Get ( strings . Join ( [ ] string { orgID . StringValue ( ) , cacheKey } , "::" ) )
2025-01-04 01:28:54 +05:30
if ! found {
2025-05-03 18:30:07 +05:30
return errors . Newf ( errors . TypeNotFound , errors . CodeNotFound , "key miss" )
2025-01-04 01:28:54 +05:30
}
// check the type compatbility between the src and dest
srcv := reflect . ValueOf ( data )
if ! srcv . Type ( ) . AssignableTo ( dstv . Type ( ) ) {
2025-05-03 18:30:07 +05:30
return errors . Newf ( errors . TypeInvalidInput , errors . CodeInvalidInput , "src type is not assignable to dst type" )
2025-01-04 01:28:54 +05:30
}
// set the value to from src to dest
dstv . Elem ( ) . Set ( srcv . Elem ( ) )
2025-05-03 18:30:07 +05:30
return nil
2025-01-04 01:28:54 +05:30
}
2025-05-22 17:16:09 +05:30
func ( provider * provider ) Delete ( _ context . Context , orgID valuer . UUID , cacheKey string ) {
provider . cc . Delete ( strings . Join ( [ ] string { orgID . StringValue ( ) , cacheKey } , "::" ) )
2025-01-04 01:28:54 +05:30
}
2025-05-22 17:16:09 +05:30
func ( provider * provider ) DeleteMany ( _ context . Context , orgID valuer . UUID , cacheKeys [ ] string ) {
2025-01-04 01:28:54 +05:30
for _ , cacheKey := range cacheKeys {
2025-05-22 17:16:09 +05:30
provider . cc . Delete ( strings . Join ( [ ] string { orgID . StringValue ( ) , cacheKey } , "::" ) )
2025-01-04 01:28:54 +05:30
}
}