1 changed files with 62 additions and 0 deletions
@ -0,0 +1,62 @@
@@ -0,0 +1,62 @@
|
||||
package simulation |
||||
|
||||
type CacheNode struct { |
||||
ID string |
||||
Label string |
||||
CacheTTL int |
||||
MaxEntries int |
||||
EvictionPolicy string |
||||
CurrentLoad int |
||||
Queue []Request |
||||
Cache map[string]interface{} |
||||
Alive bool |
||||
Targets []string |
||||
} |
||||
|
||||
func (c *CacheNode) GetID() string { |
||||
return c.ID |
||||
} |
||||
|
||||
func (c *CacheNode) Type() string { |
||||
return "cache" |
||||
} |
||||
|
||||
func (c *CacheNode) GetQueue() []Request { |
||||
return c.Queue |
||||
} |
||||
func (c *CacheNode) Tick(tick int) { |
||||
if len(c.Cache) > c.MaxEntries { |
||||
evictCount := len(c.Cache) - c.MaxEntries |
||||
|
||||
i := 0 |
||||
|
||||
for k := range c.Cache { |
||||
delete(c.Cache, k) |
||||
i++ |
||||
if i >= evictCount { |
||||
break |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
func (c *CacheNode) Receive(req *Request) { |
||||
c.Queue = append(c.Queue, *req) |
||||
} |
||||
|
||||
func (c *CacheNode) Emit() []*Request { |
||||
var out []*Request |
||||
|
||||
// emit everything in a single tick.
|
||||
for _, req := range c.Queue { |
||||
// check cache
|
||||
if _, ok := c.Cache[req.ID]; !ok { |
||||
c.Cache[req.ID] = struct{}{} |
||||
out = append(out, &req) |
||||
} |
||||
} |
||||
c.Queue = nil |
||||
return out |
||||
} |
||||
|
||||
func (c *CacheNode) IsAlive() bool { return c.Alive } |
||||
Loading…
Reference in new issue