Update semantics of EvenPodsSpread metadata object

- Now `nil` represents the meta is not set at all (in PreFilter phase)
- An empty `PodTopologySpreadMetadata` object denotes it's a legit meta and is set in PreFilter phase.
This commit is contained in:
Wei Huang 2019-12-12 10:57:56 -08:00
parent 468aebc17f
commit 3d353f5122
No known key found for this signature in database
GPG Key ID: BE5E9752F8B6E005
3 changed files with 8 additions and 6 deletions

View File

@ -400,7 +400,7 @@ func GetPodTopologySpreadMetadata(pod *v1.Pod, allNodes []*schedulernodeinfo.Nod
return nil, err
}
if len(constraints) == 0 {
return nil, nil
return &PodTopologySpreadMetadata{}, nil
}
var lock sync.Mutex

View File

@ -14,6 +14,7 @@ go_library(
"//pkg/scheduler/nodeinfo:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/klog:go_default_library",
],
)

View File

@ -22,6 +22,7 @@ import (
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/klog"
"k8s.io/kubernetes/pkg/scheduler/algorithm/predicates"
"k8s.io/kubernetes/pkg/scheduler/algorithm/priorities"
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/migration"
@ -55,6 +56,8 @@ func (pl *PodTopologySpread) Name() string {
// preFilterState computed at PreFilter and used at Filter.
type preFilterState struct {
// `nil` represents the meta is not set at all (in PreFilter phase)
// An empty `PodTopologySpreadMetadata` object denotes it's a legit meta and is set in PreFilter phase.
meta *predicates.PodTopologySpreadMetadata
}
@ -118,11 +121,9 @@ func (pl *PodTopologySpread) RemovePod(ctx context.Context, cycleState *framewor
func getPodTopologySpreadMetadata(cycleState *framework.CycleState) (*predicates.PodTopologySpreadMetadata, error) {
c, err := cycleState.Read(preFilterStateKey)
if err != nil {
return nil, err
}
// It's possible that meta is set to nil intentionally.
if c == nil {
// The metadata wasn't pre-computed in prefilter. We ignore the error for now since
// we are able to handle that by computing it again (e.g. in Filter()).
klog.Error(err)
return nil, nil
}