()
| 298 | } |
| 299 | |
| 300 | func (w *WorkerPool) scaleInWorkerQueue() { |
| 301 | workers, err := w.podLister.List(labels.Set{constants.WorkerOwnerLabelKey: ""}.AsSelector()) |
| 302 | if err != nil { |
| 303 | klog.ErrorS(err, "error when listing pod from informer cache") |
| 304 | } |
| 305 | |
| 306 | idelWorkers := []*corev1.Pod{} |
| 307 | for _, pod := range workers { |
| 308 | // the tolerance time of not available pod is 30 minutes, if |
| 309 | // time out, we need to delete these pods. |
| 310 | if util.IsPodNotAvailable(pod, 30*60) { |
| 311 | if err := w.deleteWorker(pod); err != nil { |
| 312 | klog.ErrorS(err, "failed to delete worker that is not available for 30 minute", klog.KObjs(pod)) |
| 313 | } |
| 314 | } |
| 315 | |
| 316 | if util.IsPodReady(pod) { |
| 317 | if req := w.matchRequestFor(pod); req == nil { |
| 318 | idelWorkers = append(idelWorkers, pod) |
| 319 | } |
| 320 | } |
| 321 | } |
| 322 | |
| 323 | if len(idelWorkers) > w.coreWorkerLimit { |
| 324 | // Sort by number of bindings first, and then by chronological |
| 325 | // order of creation if they are equal. |
| 326 | sort.Slice(idelWorkers, func(i, j int) bool { |
| 327 | one, two := idelWorkers[i], idelWorkers[j] |
| 328 | |
| 329 | c1 := one.Labels[constants.WorkerBindingCountLabelKey] |
| 330 | c2 := two.Labels[constants.WorkerBindingCountLabelKey] |
| 331 | n1, _ := strconv.ParseInt(c1, 10, 32) |
| 332 | n2, _ := strconv.ParseInt(c2, 10, 32) |
| 333 | |
| 334 | if n1 == n2 { |
| 335 | return one.CreationTimestamp.Before(&two.CreationTimestamp) |
| 336 | } |
| 337 | |
| 338 | return n1 < n2 |
| 339 | }) |
| 340 | |
| 341 | scaleNumber := float64(len(idelWorkers)-w.coreWorkerLimit) * ScaleInQueueThreshold |
| 342 | l := int(math.Floor(scaleNumber + 0.5)) |
| 343 | |
| 344 | for i := 0; i < l; i++ { |
| 345 | worker := idelWorkers[i] |
| 346 | if err := w.deleteWorker(worker); err != nil { |
| 347 | klog.ErrorS(err, "failed to delete worker that needs to be scaled in", klog.KObjs(worker)) |
| 348 | } else { |
| 349 | key, _ := WorkerKeyFunc(worker) |
| 350 | w.workerQueue.Remove(key) |
| 351 | } |
| 352 | } |
| 353 | } |
| 354 | |
| 355 | klog.V(2).Infof("the worker pool size is %d", w.workerQueue.Len()) |
| 356 | } |
| 357 |
no test coverage detected