63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
package hostpool
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// --- hostEntry - this is due to get upgraded
|
|
|
|
type hostEntry struct {
|
|
host string
|
|
nextRetry time.Time
|
|
retryCount int16
|
|
retryDelay time.Duration
|
|
dead bool
|
|
epsilonCounts []int64
|
|
epsilonValues []int64
|
|
epsilonIndex int
|
|
epsilonValue float64
|
|
epsilonPercentage float64
|
|
}
|
|
|
|
func (h *hostEntry) canTryHost(now time.Time) bool {
|
|
if !h.dead {
|
|
return true
|
|
}
|
|
if h.nextRetry.Before(now) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (h *hostEntry) willRetryHost(maxRetryInterval time.Duration) {
|
|
h.retryCount += 1
|
|
newDelay := h.retryDelay * 2
|
|
if newDelay < maxRetryInterval {
|
|
h.retryDelay = newDelay
|
|
} else {
|
|
h.retryDelay = maxRetryInterval
|
|
}
|
|
h.nextRetry = time.Now().Add(h.retryDelay)
|
|
}
|
|
|
|
func (h *hostEntry) getWeightedAverageResponseTime() float64 {
|
|
var value float64
|
|
var lastValue float64
|
|
|
|
// start at 1 so we start with the oldest entry
|
|
for i := 1; i <= epsilonBuckets; i += 1 {
|
|
pos := (h.epsilonIndex + i) % epsilonBuckets
|
|
bucketCount := h.epsilonCounts[pos]
|
|
// Changing the line below to what I think it should be to get the weights right
|
|
weight := float64(i) / float64(epsilonBuckets)
|
|
if bucketCount > 0 {
|
|
currentValue := float64(h.epsilonValues[pos]) / float64(bucketCount)
|
|
value += currentValue * weight
|
|
lastValue = currentValue
|
|
} else {
|
|
value += lastValue * weight
|
|
}
|
|
}
|
|
return value
|
|
}
|