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
}
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)