fix: discovery.peers resource competition problem
This commit is contained in:
@@ -61,3 +61,20 @@ func (p *PresencePacket) SignPayload() []byte {
|
|||||||
// 格式: id|name|port|os|pk
|
// 格式: id|name|port|os|pk
|
||||||
return fmt.Appendf(nil, "%s|%s|%d|%s|%s", p.ID, p.Name, p.Port, p.OS, p.PublicKey)
|
return fmt.Appendf(nil, "%s|%s|%d|%s|%s", p.ID, p.Name, p.Port, p.OS, p.PublicKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeepCopy 返回 Peer 的深拷贝
|
||||||
|
func (p Peer) DeepCopy() *Peer {
|
||||||
|
newPeer := p // 结构体浅拷贝 (值类型字段已复制)
|
||||||
|
|
||||||
|
// 手动深拷贝引用类型字段 (Routes)
|
||||||
|
if p.Routes != nil {
|
||||||
|
newPeer.Routes = make(map[string]*RouteState, len(p.Routes))
|
||||||
|
for k, v := range p.Routes {
|
||||||
|
// RouteState 只有值类型字段,但它是指针,所以需要新建对象并解引用赋值
|
||||||
|
stateCopy := *v
|
||||||
|
newPeer.Routes[k] = &stateCopy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &newPeer
|
||||||
|
}
|
||||||
|
|||||||
@@ -337,7 +337,7 @@ func (s *Service) GetPeerByIP(ip string) (*Peer, bool) {
|
|||||||
|
|
||||||
for _, p := range s.peers {
|
for _, p := range s.peers {
|
||||||
if p.Routes[ip] != nil {
|
if p.Routes[ip] != nil {
|
||||||
return p, true
|
return p.DeepCopy(), true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, false
|
return nil, false
|
||||||
@@ -348,7 +348,10 @@ func (s *Service) GetPeerByID(id string) (*Peer, bool) {
|
|||||||
defer s.peersMutex.RUnlock()
|
defer s.peersMutex.RUnlock()
|
||||||
|
|
||||||
peer, ok := s.peers[id]
|
peer, ok := s.peers[id]
|
||||||
return peer, ok
|
if !ok {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
return peer.DeepCopy(), true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) GetPeers() []Peer {
|
func (s *Service) GetPeers() []Peer {
|
||||||
@@ -357,7 +360,7 @@ func (s *Service) GetPeers() []Peer {
|
|||||||
|
|
||||||
list := make([]Peer, 0)
|
list := make([]Peer, 0)
|
||||||
for _, p := range s.peers {
|
for _, p := range s.peers {
|
||||||
list = append(list, *p)
|
list = append(list, *p.DeepCopy())
|
||||||
}
|
}
|
||||||
sort.Slice(list, func(i, j int) bool {
|
sort.Slice(list, func(i, j int) bool {
|
||||||
return list[i].Name < list[j].Name
|
return list[i].Name < list[j].Name
|
||||||
|
|||||||
Reference in New Issue
Block a user