65 lines
1.5 KiB
Go
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)
|
|
}
|