48 lines
1.0 KiB
Go
48 lines
1.0 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
|
|
"github.com/fiskerinc/cloud-services/pkg/cache"
|
|
"github.com/fiskerinc/cloud-services/pkg/utils/envtool"
|
|
)
|
|
|
|
var (
|
|
max_invalid_cache = envtool.GetEnvInt("MAX_INVALID_CANID_CACHE", 100)
|
|
invalidCANIDOnce sync.Once
|
|
invalidCANIDInstance InvalidCANIDCacheInterface
|
|
)
|
|
|
|
func NewInvalidCANIDCache() InvalidCANIDCacheInterface {
|
|
return &InvalidCANIDCache{
|
|
ringMap: cache.NewRingMap(max_invalid_cache),
|
|
}
|
|
}
|
|
|
|
func GetInvalidCANIDCache() InvalidCANIDCacheInterface {
|
|
invalidCANIDOnce.Do(func() {
|
|
if invalidCANIDInstance == nil {
|
|
invalidCANIDInstance = NewInvalidCANIDCache()
|
|
}
|
|
})
|
|
|
|
return invalidCANIDInstance
|
|
}
|
|
|
|
func SetInvalidCANIDCache(instance InvalidCANIDCacheInterface) {
|
|
invalidCANIDInstance = instance
|
|
}
|
|
|
|
type InvalidCANIDCacheInterface interface {
|
|
Exists(dbc string, can_id int32) bool
|
|
}
|
|
|
|
type InvalidCANIDCache struct {
|
|
ringMap *cache.RingMap
|
|
}
|
|
|
|
func (i *InvalidCANIDCache) Exists(dbc string, can_id int32) bool {
|
|
return !i.ringMap.Set(fmt.Sprintf("%s:%d", dbc[0:4], can_id), false)
|
|
}
|