mirror of
https://github.com/k3s-io/kubernetes.git
synced 2026-01-04 23:17:50 +00:00
Fix back off when scheduling cycle is delayed
Signed-off-by: Aldo Culquicondor <acondor@google.com>
This commit is contained in:
@@ -1515,3 +1515,85 @@ func createAndRunPriorityQueue(fwk framework.Framework, opts ...Option) *Priorit
|
||||
q.Run()
|
||||
return q
|
||||
}
|
||||
|
||||
func TestBackOffFlow(t *testing.T) {
|
||||
cl := clock.NewFakeClock(time.Now())
|
||||
q := NewPriorityQueue(newDefaultFramework(), WithClock(cl))
|
||||
steps := []struct {
|
||||
wantBackoff time.Duration
|
||||
}{
|
||||
{wantBackoff: time.Second},
|
||||
{wantBackoff: 2 * time.Second},
|
||||
{wantBackoff: 4 * time.Second},
|
||||
{wantBackoff: 8 * time.Second},
|
||||
{wantBackoff: 10 * time.Second},
|
||||
{wantBackoff: 10 * time.Second},
|
||||
{wantBackoff: 10 * time.Second},
|
||||
}
|
||||
pod := &v1.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "test-pod",
|
||||
Namespace: "test-ns",
|
||||
UID: "test-uid",
|
||||
},
|
||||
}
|
||||
podID := nsNameForPod(pod)
|
||||
if err := q.Add(pod); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for i, step := range steps {
|
||||
t.Run(fmt.Sprintf("step %d", i), func(t *testing.T) {
|
||||
timestamp := cl.Now()
|
||||
// Simulate schedule attempt.
|
||||
podInfo, err := q.Pop()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if podInfo.Attempts != i+1 {
|
||||
t.Errorf("got attempts %d, want %d", podInfo.Attempts, i+1)
|
||||
}
|
||||
if err := q.AddUnschedulableIfNotPresent(podInfo, int64(i)); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// An event happens.
|
||||
q.MoveAllToActiveOrBackoffQueue("deleted pod")
|
||||
|
||||
if _, ok, _ := q.podBackoffQ.Get(podInfo); !ok {
|
||||
t.Errorf("pod %v is not in the backoff queue", podID)
|
||||
}
|
||||
|
||||
// Check backoff duration.
|
||||
deadline, ok := q.podBackoff.GetBackoffTime(podID)
|
||||
if !ok {
|
||||
t.Errorf("didn't get backoff for pod %s", podID)
|
||||
}
|
||||
backoff := deadline.Sub(timestamp)
|
||||
if backoff != step.wantBackoff {
|
||||
t.Errorf("got backoff %s, want %s", backoff, step.wantBackoff)
|
||||
}
|
||||
|
||||
// Simulate routine that continuously flushes the backoff queue.
|
||||
cl.Step(time.Millisecond)
|
||||
q.flushBackoffQCompleted()
|
||||
// Still in backoff queue after an early flush.
|
||||
if _, ok, _ := q.podBackoffQ.Get(podInfo); !ok {
|
||||
t.Errorf("pod %v is not in the backoff queue", podID)
|
||||
}
|
||||
// Moved out of the backoff queue after timeout.
|
||||
cl.Step(backoff)
|
||||
q.flushBackoffQCompleted()
|
||||
if _, ok, _ := q.podBackoffQ.Get(podInfo); ok {
|
||||
t.Errorf("pod %v is still in the backoff queue", podID)
|
||||
}
|
||||
})
|
||||
}
|
||||
// After some time, backoff information is cleared.
|
||||
cl.Step(time.Hour)
|
||||
q.podBackoff.CleanupPodsCompletesBackingoff()
|
||||
_, ok := q.podBackoff.GetBackoffTime(podID)
|
||||
if ok {
|
||||
t.Errorf("backoff information for pod %s was not cleared", podID)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user