diff --git a/staging/src/k8s.io/legacy-cloud-providers/vsphere/nodemanager.go b/staging/src/k8s.io/legacy-cloud-providers/vsphere/nodemanager.go index ff5d4df7bfb..196f776599b 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/vsphere/nodemanager.go +++ b/staging/src/k8s.io/legacy-cloud-providers/vsphere/nodemanager.go @@ -259,6 +259,16 @@ func (nm *NodeManager) GetNode(nodeName k8stypes.NodeName) (v1.Node, error) { return *node, nil } +func (nm *NodeManager) getNodes() map[string]*v1.Node { + nm.registeredNodesLock.RLock() + defer nm.registeredNodesLock.RUnlock() + registeredNodes := make(map[string]*v1.Node, len(nm.registeredNodes)) + for nodeName, node := range nm.registeredNodes { + registeredNodes[nodeName] = node + } + return registeredNodes +} + func (nm *NodeManager) addNode(node *v1.Node) { nm.registeredNodesLock.Lock() nm.registeredNodes[node.ObjectMeta.Name] = node @@ -288,11 +298,9 @@ func (nm *NodeManager) GetNodeInfo(nodeName k8stypes.NodeName) (NodeInfo, error) // // This method is a getter but it can cause side-effect of updating NodeInfo objects. func (nm *NodeManager) GetNodeDetails() ([]NodeDetails, error) { - nm.registeredNodesLock.Lock() - defer nm.registeredNodesLock.Unlock() var nodeDetails []NodeDetails - for nodeName, nodeObj := range nm.registeredNodes { + for nodeName, nodeObj := range nm.getNodes() { nodeInfo, err := nm.GetNodeInfoWithNodeObject(nodeObj) if err != nil { return nil, err @@ -304,10 +312,7 @@ func (nm *NodeManager) GetNodeDetails() ([]NodeDetails, error) { } func (nm *NodeManager) refreshNodes() (errList []error) { - nm.registeredNodesLock.Lock() - defer nm.registeredNodesLock.Unlock() - - for nodeName := range nm.registeredNodes { + for nodeName := range nm.getNodes() { nodeInfo, err := nm.getRefreshedNodeInfo(convertToK8sType(nodeName)) if err != nil { errList = append(errList, err)