1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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
- }
|