frostfs-http-gw/internal/cache/netmap.go
Marina Biryukova cd53b9c883
All checks were successful
/ DCO (pull_request) Successful in 2m16s
/ Vulncheck (pull_request) Successful in 7m32s
/ Builds (pull_request) Successful in 2m33s
/ Lint (pull_request) Successful in 10m30s
/ Tests (pull_request) Successful in 2m20s
[#185] Update SDK to support new tree/pool version
Signed-off-by: Marina Biryukova <m.biryukova@yadro.com>
2024-12-20 11:43:51 +03:00

65 lines
1.5 KiB
Go

package cache
import (
"fmt"
"time"
"git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
"github.com/bluele/gcache"
"go.uber.org/zap"
)
type (
// NetMapCache provides cache for net map.
NetMapCache struct {
cache gcache.Cache
logger *zap.Logger
}
// NetMapCacheConfig stores expiration params for cache.
NetMapCacheConfig struct {
Lifetime time.Duration
Logger *zap.Logger
}
)
const (
DefaultNetMapCacheLifetime = 1 * time.Minute
netMapCacheSize = 1
netMapKey = "net_map"
)
// DefaultNetMapConfig returns new default cache expiration values.
func DefaultNetMapConfig(logger *zap.Logger) *NetMapCacheConfig {
return &NetMapCacheConfig{
Lifetime: DefaultNetMapCacheLifetime,
Logger: logger,
}
}
// NewNetMapCache creates an object of NetMapCache.
func NewNetMapCache(config *NetMapCacheConfig) *NetMapCache {
gc := gcache.New(netMapCacheSize).LRU().Expiration(config.Lifetime).Build()
return &NetMapCache{cache: gc, logger: config.Logger}
}
func (c *NetMapCache) Get() *netmap.NetMap {
entry, err := c.cache.Get(netMapKey)
if err != nil {
return nil
}
result, ok := entry.(netmap.NetMap)
if !ok {
c.logger.Warn(logs.InvalidCacheEntryType, zap.String("actual", fmt.Sprintf("%T", entry)),
zap.String("expected", fmt.Sprintf("%T", result)))
return nil
}
return &result
}
func (c *NetMapCache) Put(nm netmap.NetMap) error {
return c.cache.Set(netMapKey, nm)
}