crowdsec/pkg/leakybucket/queue.go

77 lines
1.6 KiB
Go
Raw Normal View History

2020-05-15 09:39:16 +00:00
package leakybucket
import (
"reflect"
"github.com/crowdsecurity/crowdsec/pkg/types"
log "github.com/sirupsen/logrus"
)
//A very simple queue mechanism to hold track of the objects in the bucket
// Queue is a simple struct that holds a limited size queue
type Queue struct {
Queue []types.Event
L int //capacity
}
// NewQueue create a new queue with a size of l
func NewQueue(l int) *Queue {
if l == -1 {
return &Queue{
Queue: make([]types.Event, 0),
L: int(^uint(0) >> 1), // max integer value, architecture independent
}
}
q := &Queue{
Queue: make([]types.Event, 0, l),
L: l,
}
log.WithFields(log.Fields{"Capacity": q.L}).Debugf("Creating queue")
return q
}
// Add an event in the queue. If it has already l elements, the first
// element is dropped before adding the new m element
func (q *Queue) Add(m types.Event) {
for len(q.Queue) > q.L { //we allow to add one element more than the true capacity
q.Queue = q.Queue[1:]
}
q.Queue = append(q.Queue, m)
}
//Remove removes and return the last element of the queue
func (q *Queue) Remove() *types.Event {
if len(q.Queue) > 0 {
var dropped types.Event = q.Queue[0]
q.Queue = q.Queue[1:]
return &dropped
}
return nil
}
// GetQueue returns the entire queue
func (q *Queue) GetQueue() []types.Event {
return q.Queue
}
// In test if evt is in the queue
func (q *Queue) In(evt types.Event) bool {
for _, element := range q.Queue {
if reflect.DeepEqual(element, evt) {
return true
}
}
return false
}
// Len gives de the Len of queue
func (q *Queue) Len() int {
return len(q.Queue)
}
// Size gives de the Size of queue
func (q *Queue) Size() int {
return q.L
}