Scheduler internal NodeTree thread-safe NumNodes

Signed-off-by: Adrián Orive <adrian.orive.oneca@gmail.com>
pull/564/head
Adrián Orive 2018-11-12 10:46:09 +01:00 committed by Adrián Orive
parent 468c99ea24
commit c7cba7370f
4 changed files with 16 additions and 9 deletions

View File

@ -390,7 +390,7 @@ func (g *genericScheduler) findNodesThatFit(pod *v1.Pod, nodes []*v1.Node) ([]*v
if len(g.predicates) == 0 { if len(g.predicates) == 0 {
filtered = nodes filtered = nodes
} else { } else {
allNodes := int32(g.cache.NodeTree().NumNodes) allNodes := int32(g.cache.NodeTree().NumNodes())
numNodesToFind := g.numFeasibleNodesToFind(allNodes) numNodesToFind := g.numFeasibleNodesToFind(allNodes)
// Create filtered list with enough space to avoid growing it // Create filtered list with enough space to avoid growing it

View File

@ -1056,7 +1056,7 @@ func TestNodeOperators(t *testing.T) {
if !found { if !found {
t.Errorf("Failed to find node %v in schedulerinternalcache.", node.Name) t.Errorf("Failed to find node %v in schedulerinternalcache.", node.Name)
} }
if cache.nodeTree.NumNodes != 1 || cache.nodeTree.Next() != node.Name { if cache.nodeTree.NumNodes() != 1 || cache.nodeTree.Next() != node.Name {
t.Errorf("cache.nodeTree is not updated correctly after adding node: %v", node.Name) t.Errorf("cache.nodeTree is not updated correctly after adding node: %v", node.Name)
} }
@ -1099,7 +1099,7 @@ func TestNodeOperators(t *testing.T) {
t.Errorf("Failed to update node in schedulercache:\n got: %+v \nexpected: %+v", got, expected) t.Errorf("Failed to update node in schedulercache:\n got: %+v \nexpected: %+v", got, expected)
} }
// Check nodeTree after update // Check nodeTree after update
if cache.nodeTree.NumNodes != 1 || cache.nodeTree.Next() != node.Name { if cache.nodeTree.NumNodes() != 1 || cache.nodeTree.Next() != node.Name {
t.Errorf("unexpected cache.nodeTree after updating node: %v", node.Name) t.Errorf("unexpected cache.nodeTree after updating node: %v", node.Name)
} }
@ -1110,7 +1110,7 @@ func TestNodeOperators(t *testing.T) {
} }
// Check nodeTree after remove. The node should be removed from the nodeTree even if there are // Check nodeTree after remove. The node should be removed from the nodeTree even if there are
// still pods on it. // still pods on it.
if cache.nodeTree.NumNodes != 0 || cache.nodeTree.Next() != "" { if cache.nodeTree.NumNodes() != 0 || cache.nodeTree.Next() != "" {
t.Errorf("unexpected cache.nodeTree after removing node: %v", node.Name) t.Errorf("unexpected cache.nodeTree after removing node: %v", node.Name)
} }
} }

View File

@ -32,7 +32,7 @@ type NodeTree struct {
tree map[string]*nodeArray // a map from zone (region-zone) to an array of nodes in the zone. tree map[string]*nodeArray // a map from zone (region-zone) to an array of nodes in the zone.
zones []string // a list of all the zones in the tree (keys) zones []string // a list of all the zones in the tree (keys)
zoneIndex int zoneIndex int
NumNodes int numNodes int
mu sync.RWMutex mu sync.RWMutex
} }
@ -91,7 +91,7 @@ func (nt *NodeTree) addNode(n *v1.Node) {
nt.tree[zone] = &nodeArray{nodes: []string{n.Name}, lastIndex: 0} nt.tree[zone] = &nodeArray{nodes: []string{n.Name}, lastIndex: 0}
} }
klog.V(5).Infof("Added node %v in group %v to NodeTree", n.Name, zone) klog.V(5).Infof("Added node %v in group %v to NodeTree", n.Name, zone)
nt.NumNodes++ nt.numNodes++
} }
// RemoveNode removes a node from the NodeTree. // RemoveNode removes a node from the NodeTree.
@ -111,7 +111,7 @@ func (nt *NodeTree) removeNode(n *v1.Node) error {
nt.removeZone(zone) nt.removeZone(zone)
} }
klog.V(5).Infof("Removed node %v in group %v from NodeTree", n.Name, zone) klog.V(5).Infof("Removed node %v in group %v from NodeTree", n.Name, zone)
nt.NumNodes-- nt.numNodes--
return nil return nil
} }
} }
@ -184,3 +184,10 @@ func (nt *NodeTree) Next() string {
} }
} }
} }
// NumNodes returns the number of nodes.
func (nt *NodeTree) NumNodes() int {
nt.mu.RLock()
defer nt.mu.RUnlock()
return nt.numNodes
}

View File

@ -116,8 +116,8 @@ func verifyNodeTree(t *testing.T, nt *NodeTree, expectedTree map[string]*nodeArr
for _, na := range expectedTree { for _, na := range expectedTree {
expectedNumNodes += len(na.nodes) expectedNumNodes += len(na.nodes)
} }
if nt.NumNodes != expectedNumNodes { if numNodes := nt.NumNodes(); numNodes != expectedNumNodes {
t.Errorf("unexpected NodeTree.numNodes. Expected: %v, Got: %v", expectedNumNodes, nt.NumNodes) t.Errorf("unexpected NodeTree.numNodes. Expected: %v, Got: %v", expectedNumNodes, numNodes)
} }
if !reflect.DeepEqual(nt.tree, expectedTree) { if !reflect.DeepEqual(nt.tree, expectedTree) {
t.Errorf("The node tree is not the same as expected. Expected: %v, Got: %v", expectedTree, nt.tree) t.Errorf("The node tree is not the same as expected. Expected: %v, Got: %v", expectedTree, nt.tree)