dnscrypt-proxy/dnscrypt-proxy/estimators.go

50 lines
1.5 KiB
Go
Raw Normal View History

2018-01-09 16:40:37 +01:00
package main
import (
"sync"
2022-02-21 09:14:24 +01:00
"github.com/lifenjoiner/ewma"
)
2022-02-21 14:16:13 +01:00
const (
SizeEstimatorEwmaDecay = 100.0
)
2018-01-09 16:40:37 +01:00
type QuestionSizeEstimator struct {
sync.RWMutex
minQuestionSize int
2022-02-21 09:14:24 +01:00
ewma *ewma.EWMA
2018-01-09 16:40:37 +01:00
}
func NewQuestionSizeEstimator() QuestionSizeEstimator {
2022-02-21 14:16:13 +01:00
return QuestionSizeEstimator{minQuestionSize: InitialMinQuestionSize, ewma: ewma.NewMovingAverage(SizeEstimatorEwmaDecay)}
2018-01-09 16:40:37 +01:00
}
func (questionSizeEstimator *QuestionSizeEstimator) MinQuestionSize() int {
questionSizeEstimator.RLock()
minQuestionSize := questionSizeEstimator.minQuestionSize
questionSizeEstimator.RUnlock()
return minQuestionSize
}
func (questionSizeEstimator *QuestionSizeEstimator) blindAdjust() {
questionSizeEstimator.Lock()
if MaxDNSUDPPacketSize-questionSizeEstimator.minQuestionSize < questionSizeEstimator.minQuestionSize {
questionSizeEstimator.minQuestionSize = MaxDNSUDPPacketSize
} else {
questionSizeEstimator.minQuestionSize *= 2
}
questionSizeEstimator.ewma.Set(float64(questionSizeEstimator.minQuestionSize))
questionSizeEstimator.Unlock()
}
func (questionSizeEstimator *QuestionSizeEstimator) adjust(packetSize int) {
questionSizeEstimator.Lock()
questionSizeEstimator.ewma.Add(float64(packetSize))
ma, minQuestionSize := int(questionSizeEstimator.ewma.Value()), questionSizeEstimator.minQuestionSize
if ma > InitialMinQuestionSize && ma < minQuestionSize/2 {
questionSizeEstimator.minQuestionSize = Max(InitialMinQuestionSize, minQuestionSize/2)
}
2018-01-09 16:40:37 +01:00
questionSizeEstimator.Unlock()
}