in pkg/coscheduling/core/core.go [161:210]
func (pgMgr *PodGroupManager) PreFilter(ctx context.Context, pod *corev1.Pod) error {
klog.V(5).InfoS("Pre-filter", "pod", klog.KObj(pod))
pgFullName, pg := pgMgr.GetPodGroup(ctx, pod)
if pg == nil {
return nil
}
if _, exist := pgMgr.backedOffPG.Get(pgFullName); exist {
return fmt.Errorf("podGroup %v failed recently", pgFullName)
}
pods, err := pgMgr.podLister.Pods(pod.Namespace).List(
labels.SelectorFromSet(labels.Set{v1alpha1.PodGroupLabel: util.GetPodGroupLabel(pod)}),
)
if err != nil {
return fmt.Errorf("podLister list pods failed: %w", err)
}
if len(pods) < int(pg.Spec.MinMember) {
return fmt.Errorf("pre-filter pod %v cannot find enough sibling pods, "+
"current pods number: %v, minMember of group: %v", pod.Name, len(pods), pg.Spec.MinMember)
}
if pg.Spec.MinResources == nil {
return nil
}
// TODO(cwdsuzhou): This resource check may not always pre-catch unschedulable pod group.
// It only tries to PreFilter resource constraints so even if a PodGroup passed here,
// it may not necessarily pass Filter due to other constraints such as affinity/taints.
if _, ok := pgMgr.permittedPG.Get(pgFullName); ok {
return nil
}
nodes, err := pgMgr.snapshotSharedLister.NodeInfos().List()
if err != nil {
return err
}
minResources := pg.Spec.MinResources.DeepCopy()
podQuantity := resource.NewQuantity(int64(pg.Spec.MinMember), resource.DecimalSI)
minResources[corev1.ResourcePods] = *podQuantity
err = CheckClusterResource(ctx, nodes, minResources, pgFullName)
if err != nil {
klog.ErrorS(err, "Failed to PreFilter", "podGroup", klog.KObj(pg))
return err
}
pgMgr.permittedPG.Add(pgFullName, pgFullName, *pgMgr.scheduleTimeout)
return nil
}