mirror of
https://github.com/open-policy-agent/opa.git
synced 2026-08-28 11:15:32 -06:00
56ad17a5c8
Signed-off-by: Sebastian Spaink <sebastianspaink@gmail.com>
73 lines
1.3 KiB
Go
73 lines
1.3 KiB
Go
// Copyright 2018 The OPA Authors. All rights reserved.
|
|
// Use of this source code is governed by an Apache2
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package logs
|
|
|
|
import (
|
|
"container/list"
|
|
)
|
|
|
|
// logBuffer implements a circular FIFO buffer for the plugin that caps memory
|
|
// usage at the configured limit. If the buffer size is exceeded, events from
|
|
// the front of the buffer are dropped.
|
|
type logBuffer struct {
|
|
usage int64
|
|
limit int64
|
|
l *list.List
|
|
}
|
|
|
|
type logBufferElem struct {
|
|
bs []byte
|
|
}
|
|
|
|
func newLogBuffer(limit int64) *logBuffer {
|
|
return &logBuffer{
|
|
limit: limit,
|
|
usage: 0,
|
|
l: list.New(),
|
|
}
|
|
}
|
|
|
|
func (lb *logBuffer) Push(bs []byte) (dropped int) {
|
|
size := int64(len(bs))
|
|
|
|
if lb.limit > 0 {
|
|
if size > lb.limit {
|
|
return 1
|
|
}
|
|
|
|
for lb.usage+size > lb.limit {
|
|
elem := lb.l.Front()
|
|
if elem == nil {
|
|
break
|
|
}
|
|
drop := elem.Value.(logBufferElem).bs
|
|
lb.l.Remove(elem)
|
|
lb.usage -= int64(len(drop))
|
|
dropped++
|
|
}
|
|
}
|
|
|
|
elem := logBufferElem{bs}
|
|
|
|
lb.l.PushBack(elem)
|
|
lb.usage += size
|
|
return dropped
|
|
}
|
|
|
|
func (lb *logBuffer) Pop() []byte {
|
|
elem := lb.l.Front()
|
|
if elem != nil {
|
|
e := elem.Value.(logBufferElem)
|
|
lb.usage -= int64(len(e.bs))
|
|
lb.l.Remove(elem)
|
|
return e.bs
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (lb *logBuffer) Len() int {
|
|
return lb.l.Len()
|
|
}
|