From f67774bdb0ec3c3152b869385e4048a9e5fd8d44 Mon Sep 17 00:00:00 2001 From: Danil-Grigorev Date: Thu, 13 Aug 2020 20:59:01 +0200 Subject: [PATCH] Refactor locks on registeredNodesLocks Their presence brought no need, as internal calls were already using atomic operatons such as addNode or GetNode. This lock, instead was blocking volume creation, and destroying the ability to provision volume with `thin` SC. Now the node map will be copied, and all group operatons will be executed on a copy, leaving lock for others to use. --- .../vsphere/nodemanager.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) 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)