Skip to content

Commit

Permalink
remove old gov node ip from members in subnet
Browse files Browse the repository at this point in the history
  • Loading branch information
laizy committed Aug 12, 2020
1 parent 2b598ed commit 9d95aec
Showing 1 changed file with 39 additions and 14 deletions.
53 changes: 39 additions & 14 deletions p2pserver/protocols/subnet/subnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,10 +201,11 @@ func (self *SubNet) OnMembersRequest(ctx *p2p.Context, msg *types.SubnetMembersR
}

self.lock.Lock()
members := make([]types.MemberInfo, 0, len(self.members))
memberInfos := self.cleanAndGetMembersInfoLocked()
members := make([]types.MemberInfo, 0, len(memberInfos))

for addr, status := range self.members {
members = append(members, types.MemberInfo{PubKey: status.PubKey, Addr: addr})
for _, info := range memberInfos {
members = append(members, types.MemberInfo{PubKey: info.PubKey, Addr: info.ListenAddr})
}

//update self.members
Expand Down Expand Up @@ -403,15 +404,10 @@ func (self *SubNet) GetMaskAddrFilter() p2p.AddressFilter {
}
}

//restful api
func (self *SubNet) GetMembersInfo() []common.SubnetMemberInfo {
self.lock.RLock()
defer self.lock.RUnlock()
return self.getMembersInfoLocked()
}

func (self *SubNet) getMembersInfoLocked() []common.SubnetMemberInfo {
var members []common.SubnetMemberInfo
// some gov node may change its listen ip address,
// this function will try to remove old address
func (self *SubNet) cleanAndGetMembersInfoLocked() map[string]common.SubnetMemberInfo {
members := make(map[string]common.SubnetMemberInfo)
for addr, mem := range self.members {
connected := self.selfAddr == addr
height := uint64(0)
Expand All @@ -421,14 +417,43 @@ func (self *SubNet) getMembersInfoLocked() []common.SubnetMemberInfo {
height = p.Height()
version = p.SoftVersion
}
members = append(members, common.SubnetMemberInfo{

curr := common.SubnetMemberInfo{
PubKey: mem.PubKey,
ListenAddr: addr,
Connected: connected,
Height: height,
Version: version,
})
}

prev, ok := members[mem.PubKey]
if !ok {
members[mem.PubKey] = curr
} else { // already has one item
if connected && !prev.Connected { // delete prev if curr is connected, but prev is not
delete(self.members, prev.ListenAddr)
members[mem.PubKey] = curr
} else if prev.Connected && !connected { // delete curr if prev is connected, but curr is not
delete(self.members, addr)
}

// keep both if both not connected, (both connected is not possible because of p2p handshake)
}
}

return members
}

//restful api
func (self *SubNet) GetMembersInfo() []common.SubnetMemberInfo {
self.lock.Lock()
members := self.cleanAndGetMembersInfoLocked()
self.lock.Unlock()

result := make([]common.SubnetMemberInfo, 0, len(members))
for _, info := range members {
result = append(result, info)
}

return result
}

0 comments on commit 9d95aec

Please sign in to comment.