60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package digitaltwin
|
|
|
|
import (
|
|
"fiskerinc.com/modules/cache"
|
|
"fiskerinc.com/modules/logger"
|
|
)
|
|
|
|
// var existsCount ExistsCount
|
|
|
|
type DigitalTwinCacheInterface interface {
|
|
Exists(vin string, prop string, value interface{}) bool
|
|
}
|
|
|
|
type DigitalTwinCache struct {
|
|
ringMap *cache.RingMap
|
|
// existsChan chan<- bool
|
|
}
|
|
|
|
func NewDigitalTwinCache(capacity int) DigitalTwinCacheInterface {
|
|
// existsChannel := make(chan bool, 100)
|
|
// existsCount = ExistsCount{
|
|
// Channel: existsChannel,
|
|
// }
|
|
// go existsCount.Run()
|
|
return &DigitalTwinCache{
|
|
ringMap: cache.NewRingMap(capacity),
|
|
// existsChan: existsChannel,
|
|
}
|
|
}
|
|
|
|
func (d *DigitalTwinCache) Exists(vin string, prop string, value interface{}) bool {
|
|
exists := d.ringMap.Exists(vin+prop, value)
|
|
// If the channel is full, we just fall through
|
|
// select {
|
|
// case d.existsChan <- exists:
|
|
// default:
|
|
// }
|
|
return exists
|
|
}
|
|
|
|
type ExistsCount struct {
|
|
Total int
|
|
Exists int
|
|
Channel <-chan bool
|
|
}
|
|
|
|
func (ec *ExistsCount) Run() {
|
|
for exists := range ec.Channel {
|
|
ec.Total++
|
|
if exists {
|
|
ec.Exists += 1
|
|
}
|
|
if ec.Total >= 180000000 {
|
|
logger.Error().Int("Cached Entries", ec.Exists).Int("Total Entries", ec.Total).Msg("Digital Twin Cache Results")
|
|
ec.Total = 0
|
|
ec.Exists = 0
|
|
}
|
|
}
|
|
}
|