mirror of https://github.com/k3s-io/k3s
Avoid computing ports multiple times
parent
ae6b66207a
commit
ea1d797f98
|
@ -69,6 +69,7 @@ func (c *CachedNodeInfo) GetNodeInfo(id string) (*api.Node, error) {
|
||||||
type predicateMetadata struct {
|
type predicateMetadata struct {
|
||||||
podBestEffort bool
|
podBestEffort bool
|
||||||
podRequest *resourceRequest
|
podRequest *resourceRequest
|
||||||
|
podPorts map[int]bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func PredicateMetadata(pod *api.Pod) interface{} {
|
func PredicateMetadata(pod *api.Pod) interface{} {
|
||||||
|
@ -79,6 +80,7 @@ func PredicateMetadata(pod *api.Pod) interface{} {
|
||||||
return &predicateMetadata{
|
return &predicateMetadata{
|
||||||
podBestEffort: isPodBestEffort(pod),
|
podBestEffort: isPodBestEffort(pod),
|
||||||
podRequest: getResourceRequest(pod),
|
podRequest: getResourceRequest(pod),
|
||||||
|
podPorts: getUsedPorts(pod),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -479,8 +481,7 @@ func PodFitsResources(pod *api.Pod, meta interface{}, nodeInfo *schedulercache.N
|
||||||
}
|
}
|
||||||
|
|
||||||
var podRequest *resourceRequest
|
var podRequest *resourceRequest
|
||||||
predicateMeta, ok := meta.(*predicateMetadata)
|
if predicateMeta, ok := meta.(*predicateMetadata); ok {
|
||||||
if ok {
|
|
||||||
podRequest = predicateMeta.podRequest
|
podRequest = predicateMeta.podRequest
|
||||||
} else {
|
} else {
|
||||||
// We couldn't parse metadata - fallback to computing it.
|
// We couldn't parse metadata - fallback to computing it.
|
||||||
|
@ -751,16 +752,21 @@ func (s *ServiceAffinity) CheckServiceAffinity(pod *api.Pod, meta interface{}, n
|
||||||
}
|
}
|
||||||
|
|
||||||
func PodFitsHostPorts(pod *api.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, error) {
|
func PodFitsHostPorts(pod *api.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, error) {
|
||||||
wantPorts := getUsedPorts(pod)
|
var wantPorts map[int]bool
|
||||||
|
if predicateMeta, ok := meta.(*predicateMetadata); ok {
|
||||||
|
wantPorts = predicateMeta.podPorts
|
||||||
|
} else {
|
||||||
|
// We couldn't parse metadata - fallback to computing it.
|
||||||
|
wantPorts = getUsedPorts(pod)
|
||||||
|
}
|
||||||
if len(wantPorts) == 0 {
|
if len(wantPorts) == 0 {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Aggregate it at the NodeInfo level.
|
||||||
existingPorts := getUsedPorts(nodeInfo.Pods()...)
|
existingPorts := getUsedPorts(nodeInfo.Pods()...)
|
||||||
for wport := range wantPorts {
|
for wport := range wantPorts {
|
||||||
if wport == 0 {
|
if wport != 0 && existingPorts[wport] {
|
||||||
continue
|
|
||||||
}
|
|
||||||
if existingPorts[wport] {
|
|
||||||
return false, ErrPodNotFitsHostPorts
|
return false, ErrPodNotFitsHostPorts
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -768,7 +774,6 @@ func PodFitsHostPorts(pod *api.Pod, meta interface{}, nodeInfo *schedulercache.N
|
||||||
}
|
}
|
||||||
|
|
||||||
func getUsedPorts(pods ...*api.Pod) map[int]bool {
|
func getUsedPorts(pods ...*api.Pod) map[int]bool {
|
||||||
// TODO: Aggregate it at the NodeInfo level.
|
|
||||||
ports := make(map[int]bool)
|
ports := make(map[int]bool)
|
||||||
for _, pod := range pods {
|
for _, pod := range pods {
|
||||||
for j := range pod.Spec.Containers {
|
for j := range pod.Spec.Containers {
|
||||||
|
|
Loading…
Reference in New Issue