Initial QSfera import
This commit is contained in:
+32
@@ -0,0 +1,32 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"github.com/open-policy-agent/opa/v1/metrics"
|
||||
)
|
||||
|
||||
// This prevents getting blocked forever writing to a full buffer, in case another routine fills the last space.
|
||||
// Retrying maxEventRetry times to drop the oldest event. Dropping the incoming event if there still isn't room.
|
||||
const maxEventRetry = 1000
|
||||
|
||||
// PushFIFO pushes data into a buffered channel without blocking when full, making room by dropping the oldest data.
|
||||
// An optional metric can be recorded when data is dropped.
|
||||
func PushFIFO[T any](buffer chan T, data T, metrics metrics.Metrics, metricName string) {
|
||||
|
||||
for range maxEventRetry {
|
||||
// non-blocking send to the buffer, to prevent blocking if buffer is full so room can be made.
|
||||
select {
|
||||
case buffer <- data:
|
||||
return
|
||||
default:
|
||||
}
|
||||
|
||||
// non-blocking drop from the buffer to make room for incoming event
|
||||
select {
|
||||
case <-buffer:
|
||||
if metrics != nil && metricName != "" {
|
||||
metrics.Counter(metricName).Incr()
|
||||
}
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user