Browse Source

add peer mutex

abhishek9686 6 months ago
parent
commit
ce50b965d4
3 changed files with 47 additions and 16 deletions
  1. 31 12
      logic/acls.go
  2. 13 4
      logic/nodes.go
  3. 3 0
      models/extclient.go

+ 31 - 12
logic/acls.go

@@ -575,12 +575,22 @@ func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool {
 	if peer.IsStatic {
 		peer = peer.StaticNode.ConvertToStaticNode()
 	}
-	node.Mutex.Lock()
-	nodeTags := maps.Clone(node.Tags)
-	node.Mutex.Unlock()
-	peer.Mutex.Lock()
-	peerTags := maps.Clone(peer.Tags)
-	peer.Mutex.Unlock()
+	var nodeTags, peerTags map[models.TagID]struct{}
+	if node.Mutex != nil {
+		node.Mutex.Lock()
+		nodeTags = maps.Clone(node.Tags)
+		node.Mutex.Unlock()
+	} else {
+		nodeTags = node.Tags
+	}
+	if peer.Mutex != nil {
+		peer.Mutex.Lock()
+		peerTags = maps.Clone(peer.Tags)
+		peer.Mutex.Unlock()
+	} else {
+		peerTags = peer.Tags
+	}
+
 	if checkDefaultPolicy {
 		// check default policy if all allowed return true
 		defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
@@ -662,12 +672,21 @@ func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool)
 	if peer.IsStatic {
 		peer = peer.StaticNode.ConvertToStaticNode()
 	}
-	node.Mutex.Lock()
-	nodeTags := maps.Clone(node.Tags)
-	node.Mutex.Unlock()
-	peer.Mutex.Lock()
-	peerTags := maps.Clone(peer.Tags)
-	peer.Mutex.Unlock()
+	var nodeTags, peerTags map[models.TagID]struct{}
+	if node.Mutex != nil {
+		node.Mutex.Lock()
+		nodeTags = maps.Clone(node.Tags)
+		node.Mutex.Unlock()
+	} else {
+		nodeTags = node.Tags
+	}
+	if peer.Mutex != nil {
+		peer.Mutex.Lock()
+		peerTags = maps.Clone(peer.Tags)
+		peer.Mutex.Unlock()
+	} else {
+		peerTags = peer.Tags
+	}
 	if checkDefaultPolicy {
 		// check default policy if all allowed return true
 		defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)

+ 13 - 4
logic/nodes.go

@@ -820,11 +820,16 @@ func GetTagMapWithNodes() (tagNodesMap map[models.TagID][]models.Node) {
 		if nodeI.Tags == nil {
 			continue
 		}
-		nodeI.Mutex.RLock()
+		if nodeI.Mutex != nil {
+			nodeI.Mutex.RLock()
+		}
 		for nodeTagID := range nodeI.Tags {
 			tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
 		}
-		nodeI.Mutex.RUnlock()
+		if nodeI.Mutex != nil {
+			nodeI.Mutex.RUnlock()
+		}
+
 	}
 	return
 }
@@ -836,11 +841,15 @@ func GetTagMapWithNodesByNetwork(netID models.NetworkID, withStaticNodes bool) (
 		if nodeI.Tags == nil {
 			continue
 		}
-		nodeI.Mutex.RLock()
+		if nodeI.Mutex != nil {
+			nodeI.Mutex.RLock()
+		}
 		for nodeTagID := range nodeI.Tags {
 			tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI)
 		}
-		nodeI.Mutex.RUnlock()
+		if nodeI.Mutex != nil {
+			nodeI.Mutex.RUnlock()
+		}
 	}
 	tagNodesMap["*"] = nodes
 	if !withStaticNodes {

+ 3 - 0
models/extclient.go

@@ -1,5 +1,7 @@
 package models
 
+import "sync"
+
 // ExtClient - struct for external clients
 type ExtClient struct {
 	ClientID               string              `json:"clientid" bson:"clientid"`
@@ -55,5 +57,6 @@ func (ext *ExtClient) ConvertToStaticNode() Node {
 		Tags:       ext.Tags,
 		IsStatic:   true,
 		StaticNode: *ext,
+		Mutex:      &sync.RWMutex{},
 	}
 }