diff --git a/filters/shedder/admission.go b/filters/shedder/admission.go index 1ba1ba3d45..a5c8d815a1 100644 --- a/filters/shedder/admission.go +++ b/filters/shedder/admission.go @@ -95,44 +95,7 @@ type Options struct { Tracer opentracing.Tracer } -type AdmissionControlSpec struct { - tracer opentracing.Tracer -} - -type admissionControl struct { - once sync.Once - mu sync.Mutex - quit chan struct{} - closed bool - - metrics metrics.Metrics - metricSuffix string - tracer opentracing.Tracer - - mode mode - windowSize int - minRps int - d time.Duration - successThreshold float64 // (0,1] - maxRejectProbability float64 // (0,1] - exponent float64 // >0 - - averageRpsFactor float64 - totals []int64 - success []int64 - counter *atomic.Int64 - successCounter *atomic.Int64 -} - -func NewAdmissionControl(o Options) filters.Spec { - tracer := o.Tracer - if tracer == nil { - tracer = &opentracing.NoopTracer{} - } - return &AdmissionControlSpec{ - tracer: tracer, - } -} +type admissionControlPre struct{} // Do removes duplcate filters, because we can only handle one in a // chain. The last one will override the others. @@ -160,6 +123,11 @@ func (spec *admissionControlPre) Do(routes []*eskip.Route) []*eskip.Route { return routes } +type admissionControlPost struct { + mu sync.Mutex // required for testing + filters map[string]*admissionControl +} + // Do implements routing.PostProcessor and makes it possible to close goroutines. func (spec *admissionControlPost) Do(routes []*routing.Route) []*routing.Route { inUse := make(map[string]struct{}) @@ -191,10 +159,43 @@ func (spec *admissionControlPost) Do(routes []*routing.Route) []*routing.Route { return routes } -type admissionControlPre struct{} -type admissionControlPost struct { - mu sync.Mutex - filters map[string]*admissionControl +type AdmissionControlSpec struct { + tracer opentracing.Tracer +} + +type admissionControl struct { + once sync.Once + mu sync.Mutex + quit chan struct{} + closed bool + + metrics metrics.Metrics + metricSuffix string + tracer opentracing.Tracer + + mode mode + windowSize int + minRps int + d time.Duration + successThreshold float64 // (0,1] + maxRejectProbability float64 // (0,1] + exponent float64 // >0 + + averageRpsFactor float64 + totals []int64 + success []int64 + counter *atomic.Int64 + successCounter *atomic.Int64 +} + +func NewAdmissionControl(o Options) filters.Spec { + tracer := o.Tracer + if tracer == nil { + tracer = &opentracing.NoopTracer{} + } + return &AdmissionControlSpec{ + tracer: tracer, + } } func (*AdmissionControlSpec) PreProcessor() *admissionControlPre {