Merge pull request #93971 from Danil-Grigorev/vsphere-secret-deadlock

Refactor locks logic on registeredNodesLock to be non-blocking
This commit is contained in:
Kubernetes Prow Robot 2020-08-20 04:55:23 -07:00 committed by GitHub
commit 1c548c328a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

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)