From 7f3c4ac1f4a0df40b0fba1573c849eaa95e6079e Mon Sep 17 00:00:00 2001
From: Gavin
Date: Fri, 6 Oct 2017 21:58:59 +0800
Subject: [PATCH] clarify pridicates message when no nodes available
fix space
address comment
---
.../pkg/scheduler/core/generic_scheduler.go | 8 +++++---
.../scheduler/core/generic_scheduler_test.go | 20 +++++++++++--------
plugin/pkg/scheduler/scheduler_test.go | 2 ++
3 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/plugin/pkg/scheduler/core/generic_scheduler.go b/plugin/pkg/scheduler/core/generic_scheduler.go
index e7ea63694f6..2ab01762b84 100644
--- a/plugin/pkg/scheduler/core/generic_scheduler.go
+++ b/plugin/pkg/scheduler/core/generic_scheduler.go
@@ -42,13 +42,14 @@ type FailedPredicateMap map[string][]algorithm.PredicateFailureReason
type FitError struct {
Pod *v1.Pod
+ NumAllNodes int
FailedPredicates FailedPredicateMap
}
var ErrNoNodesAvailable = fmt.Errorf("no nodes available to schedule pods")
const (
- NoNodeAvailableMsg = "No nodes are available that match all of the predicates"
+ NoNodeAvailableMsg = "0/%v nodes are available"
// NominatedNodeAnnotationKey is used to annotate a pod that has preempted other pods.
// The scheduler uses the annotation to find that the pod shouldn't preempt more pods
// when it gets to the head of scheduling queue again.
@@ -68,12 +69,12 @@ func (f *FitError) Error() string {
sortReasonsHistogram := func() []string {
reasonStrings := []string{}
for k, v := range reasons {
- reasonStrings = append(reasonStrings, fmt.Sprintf("%v (%v)", k, v))
+ reasonStrings = append(reasonStrings, fmt.Sprintf("%v %v", v, k))
}
sort.Strings(reasonStrings)
return reasonStrings
}
- reasonMsg := fmt.Sprintf(NoNodeAvailableMsg+": %v.", strings.Join(sortReasonsHistogram(), ", "))
+ reasonMsg := fmt.Sprintf(NoNodeAvailableMsg+": %v.", f.NumAllNodes, strings.Join(sortReasonsHistogram(), ", "))
return reasonMsg
}
@@ -122,6 +123,7 @@ func (g *genericScheduler) Schedule(pod *v1.Pod, nodeLister algorithm.NodeLister
if len(filteredNodes) == 0 {
return "", &FitError{
Pod: pod,
+ NumAllNodes: len(nodes),
FailedPredicates: failedPredicateMap,
}
}
diff --git a/plugin/pkg/scheduler/core/generic_scheduler_test.go b/plugin/pkg/scheduler/core/generic_scheduler_test.go
index cde1b5e1b4e..ce4ff1300dc 100644
--- a/plugin/pkg/scheduler/core/generic_scheduler_test.go
+++ b/plugin/pkg/scheduler/core/generic_scheduler_test.go
@@ -200,7 +200,8 @@ func TestGenericScheduler(t *testing.T) {
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}},
name: "test 1",
wErr: &FitError{
- Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}},
+ Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}},
+ NumAllNodes: 2,
FailedPredicates: FailedPredicateMap{
"machine1": []algorithm.PredicateFailureReason{algorithmpredicates.ErrFakePredicate},
"machine2": []algorithm.PredicateFailureReason{algorithmpredicates.ErrFakePredicate},
@@ -260,7 +261,8 @@ func TestGenericScheduler(t *testing.T) {
expectsErr: true,
name: "test 7",
wErr: &FitError{
- Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}},
+ Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}},
+ NumAllNodes: 3,
FailedPredicates: FailedPredicateMap{
"3": []algorithm.PredicateFailureReason{algorithmpredicates.ErrFakePredicate},
"2": []algorithm.PredicateFailureReason{algorithmpredicates.ErrFakePredicate},
@@ -290,7 +292,8 @@ func TestGenericScheduler(t *testing.T) {
expectsErr: true,
name: "test 8",
wErr: &FitError{
- Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}},
+ Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}},
+ NumAllNodes: 2,
FailedPredicates: FailedPredicateMap{
"1": []algorithm.PredicateFailureReason{algorithmpredicates.ErrFakePredicate},
"2": []algorithm.PredicateFailureReason{algorithmpredicates.ErrFakePredicate},
@@ -406,15 +409,16 @@ func makeNode(node string, milliCPU, memory int64) *v1.Node {
func TestHumanReadableFitError(t *testing.T) {
err := &FitError{
- Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}},
+ Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}},
+ NumAllNodes: 3,
FailedPredicates: FailedPredicateMap{
"1": []algorithm.PredicateFailureReason{algorithmpredicates.ErrNodeUnderMemoryPressure},
"2": []algorithm.PredicateFailureReason{algorithmpredicates.ErrNodeUnderDiskPressure},
"3": []algorithm.PredicateFailureReason{algorithmpredicates.ErrNodeUnderDiskPressure},
},
}
- if strings.Contains(err.Error(), NoNodeAvailableMsg) {
- if strings.Contains(err.Error(), "NodeUnderDiskPressure (2)") && strings.Contains(err.Error(), "NodeUnderMemoryPressure (1)") {
+ if strings.Contains(err.Error(), "0/3 nodes are available") {
+ if strings.Contains(err.Error(), "2 NodeUnderDiskPressure") && strings.Contains(err.Error(), "1 NodeUnderMemoryPressure") {
return
}
}
@@ -1180,7 +1184,7 @@ func TestPreempt(t *testing.T) {
scheduler := NewGenericScheduler(
cache, nil, map[string]algorithm.FitPredicate{"matches": algorithmpredicates.PodFitsResources}, algorithm.EmptyPredicateMetadataProducer, []algorithm.PriorityConfig{{Function: numericPriority, Weight: 1}}, algorithm.EmptyMetadataProducer, extenders)
// Call Preempt and check the expected results.
- node, victims, err := scheduler.Preempt(test.pod, schedulertesting.FakeNodeLister(makeNodeList(nodeNames)), error(&FitError{test.pod, failedPredMap}))
+ node, victims, err := scheduler.Preempt(test.pod, schedulertesting.FakeNodeLister(makeNodeList(nodeNames)), error(&FitError{Pod: test.pod, FailedPredicates: failedPredMap}))
if err != nil {
t.Errorf("test [%v]: unexpected error in preemption: %v", test.name, err)
}
@@ -1208,7 +1212,7 @@ func TestPreempt(t *testing.T) {
test.pod.Annotations[NominatedNodeAnnotationKey] = node.Name
}
// Call preempt again and make sure it doesn't preempt any more pods.
- node, victims, err = scheduler.Preempt(test.pod, schedulertesting.FakeNodeLister(makeNodeList(nodeNames)), error(&FitError{test.pod, failedPredMap}))
+ node, victims, err = scheduler.Preempt(test.pod, schedulertesting.FakeNodeLister(makeNodeList(nodeNames)), error(&FitError{Pod: test.pod, FailedPredicates: failedPredMap}))
if err != nil {
t.Errorf("test [%v]: unexpected error in preemption: %v", test.name, err)
}
diff --git a/plugin/pkg/scheduler/scheduler_test.go b/plugin/pkg/scheduler/scheduler_test.go
index b0743b7e17b..3772fbe8567 100644
--- a/plugin/pkg/scheduler/scheduler_test.go
+++ b/plugin/pkg/scheduler/scheduler_test.go
@@ -300,6 +300,7 @@ func TestSchedulerNoPhantomPodAfterDelete(t *testing.T) {
case err := <-errChan:
expectErr := &core.FitError{
Pod: secondPod,
+ NumAllNodes: 1,
FailedPredicates: core.FailedPredicateMap{node.Name: []algorithm.PredicateFailureReason{predicates.ErrPodNotFitsHostPorts}},
}
if !reflect.DeepEqual(expectErr, err) {
@@ -484,6 +485,7 @@ func TestSchedulerFailedSchedulingReasons(t *testing.T) {
case err := <-errChan:
expectErr := &core.FitError{
Pod: podWithTooBigResourceRequests,
+ NumAllNodes: len(nodes),
FailedPredicates: failedPredicatesMap,
}
if len(fmt.Sprint(expectErr)) > 150 {