in pkg/coscheduling/core/core.go [100:149]
func (pgMgr *PodGroupManager) PreFilter(ctx context.Context, pod *corev1.Pod) error {
klog.V(5).Infof("Pre-filter %v", pod.Name)
pgFullName, pg := pgMgr.GetPodGroup(pod)
if pg == nil {
return nil
}
if _, ok := pgMgr.lastDeniedPG.Get(pgFullName); ok {
err := fmt.Errorf("pod with pgName: %v last failed in 3s, deny", pgFullName)
klog.V(6).Info(err)
return err
}
pods, err := pgMgr.podLister.Pods(pod.Namespace).List(
labels.SelectorFromSet(labels.Set{util.PodGroupLabel: util.GetPodGroupLabel(pod)}),
)
if err != nil {
return fmt.Errorf("podLister list pods failed: %v", 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(nodes, minResources, pgFullName)
if err != nil {
klog.Errorf("PreFilter pod group %v error: %v", pgFullName, err)
pgMgr.AddDeniedPodGroup(pgFullName)
return err
}
pgMgr.permittedPG.Add(pgFullName, pgFullName, *pgMgr.scheduleTimeout)
return nil
}