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.
This commit is contained in:
Danil-Grigorev 2020-08-13 20:59:01 +02:00
parent b497fa1d34
commit f67774bdb0

View File

@ -259,6 +259,16 @@ func (nm *NodeManager) GetNode(nodeName k8stypes.NodeName) (v1.Node, error) {
return *node, nil 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) { func (nm *NodeManager) addNode(node *v1.Node) {
nm.registeredNodesLock.Lock() nm.registeredNodesLock.Lock()
nm.registeredNodes[node.ObjectMeta.Name] = node 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. // This method is a getter but it can cause side-effect of updating NodeInfo objects.
func (nm *NodeManager) GetNodeDetails() ([]NodeDetails, error) { func (nm *NodeManager) GetNodeDetails() ([]NodeDetails, error) {
nm.registeredNodesLock.Lock()
defer nm.registeredNodesLock.Unlock()
var nodeDetails []NodeDetails var nodeDetails []NodeDetails
for nodeName, nodeObj := range nm.registeredNodes { for nodeName, nodeObj := range nm.getNodes() {
nodeInfo, err := nm.GetNodeInfoWithNodeObject(nodeObj) nodeInfo, err := nm.GetNodeInfoWithNodeObject(nodeObj)
if err != nil { if err != nil {
return nil, err return nil, err
@ -304,10 +312,7 @@ func (nm *NodeManager) GetNodeDetails() ([]NodeDetails, error) {
} }
func (nm *NodeManager) refreshNodes() (errList []error) { func (nm *NodeManager) refreshNodes() (errList []error) {
nm.registeredNodesLock.Lock() for nodeName := range nm.getNodes() {
defer nm.registeredNodesLock.Unlock()
for nodeName := range nm.registeredNodes {
nodeInfo, err := nm.getRefreshedNodeInfo(convertToK8sType(nodeName)) nodeInfo, err := nm.getRefreshedNodeInfo(convertToK8sType(nodeName))
if err != nil { if err != nil {
errList = append(errList, err) errList = append(errList, err)