MCPcopy Index your code
hub / github.com/cloudtty/cloudtty / scaleInWorkerQueue

Method scaleInWorkerQueue

pkg/workerpool/worker_pool.go:300–356  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

298}
299
300func (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

Callers 1

tryScaleInWorkerQueueMethod · 0.95

Calls 6

deleteWorkerMethod · 0.95
matchRequestForMethod · 0.95
WorkerKeyFuncFunction · 0.85
ListMethod · 0.65
RemoveMethod · 0.65
LenMethod · 0.65

Tested by

no test coverage detected