From 92698363cd1252e86cc816ac6b7134d66bc4b0d4 Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Wed, 19 Feb 2025 22:17:40 +0400 Subject: [PATCH] add node mutex to model --- logic/acls.go | 17 ++++++++++------- logic/nodes.go | 13 +++++++++++++ models/node.go | 2 ++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/logic/acls.go b/logic/acls.go index 50be27ec..7267fd58 100644 --- a/logic/acls.go +++ b/logic/acls.go @@ -17,7 +17,6 @@ import ( var ( aclCacheMutex = &sync.RWMutex{} aclCacheMap = make(map[string]models.Acl) - aclTagsMutex = &sync.RWMutex{} ) func MigrateAclPolicies() { @@ -576,10 +575,12 @@ func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool { if peer.IsStatic { peer = peer.StaticNode.ConvertToStaticNode() } - aclTagsMutex.RLock() - peerTags := maps.Clone(peer.Tags) + node.Mutex.Lock() nodeTags := maps.Clone(node.Tags) - aclTagsMutex.RUnlock() + node.Mutex.Unlock() + peer.Mutex.Lock() + peerTags := maps.Clone(peer.Tags) + peer.Mutex.Unlock() if checkDefaultPolicy { // check default policy if all allowed return true defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy) @@ -661,10 +662,12 @@ func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool) if peer.IsStatic { peer = peer.StaticNode.ConvertToStaticNode() } - aclTagsMutex.RLock() - peerTags := maps.Clone(peer.Tags) + node.Mutex.Lock() nodeTags := maps.Clone(node.Tags) - aclTagsMutex.RUnlock() + node.Mutex.Unlock() + peer.Mutex.Lock() + peerTags := maps.Clone(peer.Tags) + peer.Mutex.Unlock() if checkDefaultPolicy { // check default policy if all allowed return true defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy) diff --git a/logic/nodes.go b/logic/nodes.go index 368d7d67..cdea2e38 100644 --- a/logic/nodes.go +++ b/logic/nodes.go @@ -35,12 +35,18 @@ var ( func getNodeFromCache(nodeID string) (node models.Node, ok bool) { nodeCacheMutex.RLock() node, ok = nodesCacheMap[nodeID] + if node.Mutex == nil { + node.Mutex = &sync.RWMutex{} + } nodeCacheMutex.RUnlock() return } func getNodesFromCache() (nodes []models.Node) { nodeCacheMutex.RLock() for _, node := range nodesCacheMap { + if node.Mutex == nil { + node.Mutex = &sync.RWMutex{} + } nodes = append(nodes, node) } nodeCacheMutex.RUnlock() @@ -425,6 +431,9 @@ func GetAllNodes() ([]models.Node, error) { } // add node to our array nodes = append(nodes, node) + if node.Mutex == nil { + node.Mutex = &sync.RWMutex{} + } nodesMap[node.ID.String()] = node } @@ -811,9 +820,11 @@ func GetTagMapWithNodes() (tagNodesMap map[models.TagID][]models.Node) { if nodeI.Tags == nil { continue } + nodeI.Mutex.RLock() for nodeTagID := range nodeI.Tags { tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI) } + nodeI.Mutex.RUnlock() } return } @@ -825,9 +836,11 @@ func GetTagMapWithNodesByNetwork(netID models.NetworkID, withStaticNodes bool) ( if nodeI.Tags == nil { continue } + nodeI.Mutex.RLock() for nodeTagID := range nodeI.Tags { tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI) } + nodeI.Mutex.RUnlock() } tagNodesMap["*"] = nodes if !withStaticNodes { diff --git a/models/node.go b/models/node.go index c9e55e5d..75f510b6 100644 --- a/models/node.go +++ b/models/node.go @@ -5,6 +5,7 @@ import ( "math/rand" "net" "strings" + "sync" "time" "github.com/google/uuid" @@ -117,6 +118,7 @@ type Node struct { IsUserNode bool `json:"is_user_node"` StaticNode ExtClient `json:"static_node"` Status NodeStatus `json:"node_status"` + Mutex *sync.RWMutex `json:"-"` } // LegacyNode - legacy struct for node model