forked from TrueCloudLab/frostfs-http-gw
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 netmap.
|
|
NetmapCache struct {
|
|
cache gcache.Cache
|
|
logger *zap.Logger
|
|
}
|
|
|
|
// NetmapCacheConfig stores expiration params for cache.
|
|
NetmapCacheConfig struct {
|
|
Lifetime time.Duration
|
|
Logger *zap.Logger
|
|
}
|
|
)
|
|
|
|
const (
|
|
DefaultNetmapCacheLifetime = time.Minute
|
|
netmapCacheSize = 1
|
|
netmapKey = "netmap"
|
|
)
|
|
|
|
// 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)
|
|
}
|