123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package queue
- import (
- "sync"
- "time"
- ktypes "k8s.io/apimachinery/pkg/types"
- )
- type PodBackoffMap struct {
-
- lock sync.RWMutex
-
- initialDuration time.Duration
-
- maxDuration time.Duration
-
- podAttempts map[ktypes.NamespacedName]int
-
- podLastUpdateTime map[ktypes.NamespacedName]time.Time
- }
- func NewPodBackoffMap(initialDuration, maxDuration time.Duration) *PodBackoffMap {
- return &PodBackoffMap{
- initialDuration: initialDuration,
- maxDuration: maxDuration,
- podAttempts: make(map[ktypes.NamespacedName]int),
- podLastUpdateTime: make(map[ktypes.NamespacedName]time.Time),
- }
- }
- func (pbm *PodBackoffMap) GetBackoffTime(nsPod ktypes.NamespacedName) (time.Time, bool) {
- pbm.lock.RLock()
- defer pbm.lock.RUnlock()
- if _, found := pbm.podAttempts[nsPod]; found == false {
- return time.Time{}, false
- }
- lastUpdateTime := pbm.podLastUpdateTime[nsPod]
- backoffDuration := pbm.calculateBackoffDuration(nsPod)
- backoffTime := lastUpdateTime.Add(backoffDuration)
- return backoffTime, true
- }
- func (pbm *PodBackoffMap) calculateBackoffDuration(nsPod ktypes.NamespacedName) time.Duration {
- backoffDuration := pbm.initialDuration
- if _, found := pbm.podAttempts[nsPod]; found {
- for i := 1; i < pbm.podAttempts[nsPod]; i++ {
- backoffDuration = backoffDuration * 2
- if backoffDuration > pbm.maxDuration {
- return pbm.maxDuration
- }
- }
- }
- return backoffDuration
- }
- func (pbm *PodBackoffMap) clearPodBackoff(nsPod ktypes.NamespacedName) {
- delete(pbm.podAttempts, nsPod)
- delete(pbm.podLastUpdateTime, nsPod)
- }
- func (pbm *PodBackoffMap) ClearPodBackoff(nsPod ktypes.NamespacedName) {
- pbm.lock.Lock()
- pbm.clearPodBackoff(nsPod)
- pbm.lock.Unlock()
- }
- func (pbm *PodBackoffMap) CleanupPodsCompletesBackingoff() {
- pbm.lock.Lock()
- defer pbm.lock.Unlock()
- for pod, value := range pbm.podLastUpdateTime {
- if value.Add(pbm.maxDuration).Before(time.Now()) {
- pbm.clearPodBackoff(pod)
- }
- }
- }
- func (pbm *PodBackoffMap) BackoffPod(nsPod ktypes.NamespacedName) {
- pbm.lock.Lock()
- pbm.podLastUpdateTime[nsPod] = time.Now()
- pbm.podAttempts[nsPod]++
- pbm.lock.Unlock()
- }
|