2018-01-09 16:40:37 +01:00
|
|
|
package main
|
|
|
|
|
2018-01-10 09:46:27 +01:00
|
|
|
import (
|
|
|
|
"sync"
|
|
|
|
|
2022-04-05 14:04:26 +02:00
|
|
|
"github.com/VividCortex/ewma"
|
2022-02-21 14:16:13 +01:00
|
|
|
)
|
|
|
|
|
2018-01-09 16:40:37 +01:00
|
|
|
type QuestionSizeEstimator struct {
|
|
|
|
sync.RWMutex
|
|
|
|
minQuestionSize int
|
2022-04-05 14:04:26 +02:00
|
|
|
ewma ewma.MovingAverage
|
2018-01-09 16:40:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewQuestionSizeEstimator() QuestionSizeEstimator {
|
2022-03-23 17:48:48 +01:00
|
|
|
return QuestionSizeEstimator{
|
|
|
|
minQuestionSize: InitialMinQuestionSize,
|
2022-04-05 14:04:26 +02:00
|
|
|
ewma: &ewma.SimpleEWMA{},
|
2022-03-23 17:48:48 +01:00
|
|
|
}
|
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()
|
2019-11-05 01:16:22 +01:00
|
|
|
if MaxDNSUDPPacketSize-questionSizeEstimator.minQuestionSize < questionSizeEstimator.minQuestionSize {
|
|
|
|
questionSizeEstimator.minQuestionSize = MaxDNSUDPPacketSize
|
|
|
|
} else {
|
|
|
|
questionSizeEstimator.minQuestionSize *= 2
|
|
|
|
}
|
2018-01-10 09:46:27 +01:00
|
|
|
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()
|
|
|
|
}
|