diff --git a/server/meta/edge.go b/server/meta/edge.go index 0622c06ba74273c4387c8b95afc9923048001973..6d84c95627f866ebd71a1b2dd5362ed3ca800a06 100644 --- a/server/meta/edge.go +++ b/server/meta/edge.go @@ -8,6 +8,7 @@ import ( ) type Edges struct { + Lock sync.Mutex SrcToDsts map[string][]string DstToSrcs map[string][]string Lookup sync.Map @@ -23,19 +24,28 @@ type Edge struct { Metrics map[string]string } -// 镜像id检测:多个goruntine并发添加、访问、修改相同的edge实例 +// 网络边镜像id检测:多个goruntine并发添加、访问、修改相同的edge实例 func (e *Edges) Add(edge *Edge) { - id_slice := strings.Split(edge.ID, "_") - id_slice[0], id_slice[2] = id_slice[2], id_slice[0] + if edge.Type == EDGE_TCP || edge.Type == EDGE_UDP { + id_slice := strings.Split(edge.ID, "_") + id_slice[0], id_slice[2] = id_slice[2], id_slice[0] + mirror_id := strings.Join(id_slice, "_") - mirror_id := strings.Join(id_slice, "_") + e.Lock.Lock() + if _, ok := e.Lookup.Load(mirror_id); !ok { + e.Lookup.Store(edge.ID, edge) + e.Edges = append(e.Edges, edge) + } + e.Lock.Unlock() - if _, ok := e.Lookup.Load(mirror_id); ok { return } - e.Lookup.Store(edge.ID, edge) - e.Edges = append(e.Edges, edge) + e.Lock.Lock() + if _, ok := e.Lookup.LoadOrStore(edge.ID, edge); !ok { + e.Edges = append(e.Edges, edge) + } + e.Lock.Unlock() } func (e *Edges) Remove(id string) error { diff --git a/server/meta/node.go b/server/meta/node.go index d583141a5a5edb403f9251541efebb90f75660a8..5827cf17c5e0d63487d1f05df5b87600ed9ee0cb 100755 --- a/server/meta/node.go +++ b/server/meta/node.go @@ -2,11 +2,13 @@ package meta import ( "fmt" + "sync" "github.com/pkg/errors" ) type Nodes struct { + Lock sync.Mutex Lookup map[string]*Node LookupByType map[string][]*Node LookupByUUID map[string][]*Node @@ -22,21 +24,19 @@ type Node struct { } func (ns *Nodes) Add(node *Node) { - _, ok := ns.Lookup[node.ID] - if ok { + ns.Lock.Lock() + if _, ok := ns.Lookup[node.ID]; !ok { // for k, v := range node.Attrs { // if _, ok := old_n.Attrs[k]; !ok { // old_n.Attrs[k] = v // } // } - - return + ns.Lookup[node.ID] = node + ns.LookupByType[node.Type] = append(ns.LookupByType[node.Type], node) + ns.LookupByUUID[node.UUID] = append(ns.LookupByUUID[node.UUID], node) + ns.Nodes = append(ns.Nodes, node) } - - ns.Lookup[node.ID] = node - ns.LookupByType[node.Type] = append(ns.LookupByType[node.Type], node) - ns.LookupByUUID[node.UUID] = append(ns.LookupByUUID[node.UUID], node) - ns.Nodes = append(ns.Nodes, node) + ns.Lock.Unlock() } func (ns *Nodes) Remove(node *Node) error {