mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-11-24 22:28:43 +00:00
Prevent scheduler crashing in default preemption
This commit is contained in:
@@ -334,7 +334,7 @@ func dryRunPreemption(ctx context.Context, fh framework.Handle,
|
||||
nodeInfoCopy := potentialNodes[(int(offset)+i)%len(potentialNodes)].Clone()
|
||||
stateCopy := state.Clone()
|
||||
pods, numPDBViolations, status := selectVictimsOnNode(ctx, fh, stateCopy, pod, nodeInfoCopy, pdbs)
|
||||
if status.IsSuccess() {
|
||||
if status.IsSuccess() && len(pods) != 0 {
|
||||
victims := extenderv1.Victims{
|
||||
Pods: pods,
|
||||
NumPDBViolations: int64(numPDBViolations),
|
||||
@@ -352,11 +352,14 @@ func dryRunPreemption(ctx context.Context, fh framework.Handle,
|
||||
if nvcSize > 0 && nvcSize+vcSize >= numCandidates {
|
||||
cancel()
|
||||
}
|
||||
} else {
|
||||
statusesLock.Lock()
|
||||
nodeStatuses[nodeInfoCopy.Node().Name] = status
|
||||
statusesLock.Unlock()
|
||||
return
|
||||
}
|
||||
if status.IsSuccess() && len(pods) == 0 {
|
||||
status = framework.AsStatus(fmt.Errorf("expected at least one victim pod on node %q", nodeInfoCopy.Node().Name))
|
||||
}
|
||||
statusesLock.Lock()
|
||||
nodeStatuses[nodeInfoCopy.Node().Name] = status
|
||||
statusesLock.Unlock()
|
||||
}
|
||||
fh.Parallelizer().Until(parallelCtx, len(potentialNodes), checkNode)
|
||||
return append(nonViolatingCandidates.get(), violatingCandidates.get()...), nodeStatuses
|
||||
@@ -391,6 +394,18 @@ func CallExtenders(extenders []framework.Extender, pod *v1.Pod, nodeLister frame
|
||||
}
|
||||
return nil, framework.AsStatus(err)
|
||||
}
|
||||
// Check if the returned victims are valid.
|
||||
for nodeName, victims := range nodeNameToVictims {
|
||||
if victims == nil || len(victims.Pods) == 0 {
|
||||
if extender.IsIgnorable() {
|
||||
delete(nodeNameToVictims, nodeName)
|
||||
klog.InfoS("Ignoring node without victims", "node", nodeName)
|
||||
continue
|
||||
}
|
||||
return nil, framework.AsStatus(fmt.Errorf("expected at least one victim pod on node %q", nodeName))
|
||||
}
|
||||
}
|
||||
|
||||
// Replace victimsMap with new result after preemption. So the
|
||||
// rest of extenders can continue use it as parameter.
|
||||
victimsMap = nodeNameToVictims
|
||||
|
||||
Reference in New Issue
Block a user