mirror of
https://github.com/yggdrasil-network/yggdrasil-go
synced 2024-11-10 15:30:34 +03:00
Cherrypick fixes for _addPeerLoop memory leak for now
This commit is contained in:
parent
909e4e29a8
commit
5a382e7e0b
@ -368,13 +368,34 @@ func (c *Core) SetLogger(log *log.Logger) {
|
|||||||
// connection drops.
|
// connection drops.
|
||||||
func (c *Core) AddPeer(addr string, sintf string) error {
|
func (c *Core) AddPeer(addr string, sintf string) error {
|
||||||
if err := c.CallPeer(addr, sintf); err != nil {
|
if err := c.CallPeer(addr, sintf); err != nil {
|
||||||
|
// TODO: We maybe want this to write the peer to the persistent
|
||||||
|
// configuration even if a connection attempt fails, but first we'll need to
|
||||||
|
// move the code to check the peer URI so that we don't deliberately save a
|
||||||
|
// peer with a known bad URI. Loading peers from config should really do the
|
||||||
|
// same thing too but I don't think that happens today
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
c.config.Mutex.Lock()
|
c.config.Mutex.Lock()
|
||||||
if sintf == "" {
|
if sintf == "" {
|
||||||
|
for _, peer := range c.config.Current.Peers {
|
||||||
|
if peer == addr {
|
||||||
|
return errors.New("peer already added")
|
||||||
|
}
|
||||||
|
}
|
||||||
c.config.Current.Peers = append(c.config.Current.Peers, addr)
|
c.config.Current.Peers = append(c.config.Current.Peers, addr)
|
||||||
} else {
|
} else {
|
||||||
c.config.Current.InterfacePeers[sintf] = append(c.config.Current.InterfacePeers[sintf], addr)
|
if _, ok := c.config.Current.InterfacePeers[sintf]; ok {
|
||||||
|
for _, peer := range c.config.Current.InterfacePeers[sintf] {
|
||||||
|
if peer == addr {
|
||||||
|
return errors.New("peer already added")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if _, ok := c.config.Current.InterfacePeers[sintf]; !ok {
|
||||||
|
c.config.Current.InterfacePeers[sintf] = []string{addr}
|
||||||
|
} else {
|
||||||
|
c.config.Current.InterfacePeers[sintf] = append(c.config.Current.InterfacePeers[sintf], addr)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
c.config.Mutex.Unlock()
|
c.config.Mutex.Unlock()
|
||||||
return nil
|
return nil
|
||||||
|
@ -21,16 +21,17 @@ type Core struct {
|
|||||||
// We're going to keep our own copy of the provided config - that way we can
|
// We're going to keep our own copy of the provided config - that way we can
|
||||||
// guarantee that it will be covered by the mutex
|
// guarantee that it will be covered by the mutex
|
||||||
phony.Inbox
|
phony.Inbox
|
||||||
config config.NodeState // Config
|
config config.NodeState // Config
|
||||||
boxPub crypto.BoxPubKey
|
boxPub crypto.BoxPubKey
|
||||||
boxPriv crypto.BoxPrivKey
|
boxPriv crypto.BoxPrivKey
|
||||||
sigPub crypto.SigPubKey
|
sigPub crypto.SigPubKey
|
||||||
sigPriv crypto.SigPrivKey
|
sigPriv crypto.SigPrivKey
|
||||||
switchTable switchTable
|
switchTable switchTable
|
||||||
peers peers
|
peers peers
|
||||||
router router
|
router router
|
||||||
link link
|
link link
|
||||||
log *log.Logger
|
log *log.Logger
|
||||||
|
addPeerTimer *time.Timer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Core) _init() error {
|
func (c *Core) _init() error {
|
||||||
@ -91,7 +92,7 @@ func (c *Core) _addPeerLoop() {
|
|||||||
|
|
||||||
// Add peers from the Peers section
|
// Add peers from the Peers section
|
||||||
for _, peer := range current.Peers {
|
for _, peer := range current.Peers {
|
||||||
if err := c.AddPeer(peer, ""); err != nil {
|
if err := c.CallPeer(peer, ""); err != nil {
|
||||||
c.log.Errorln("Failed to add peer:", err)
|
c.log.Errorln("Failed to add peer:", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -99,14 +100,14 @@ func (c *Core) _addPeerLoop() {
|
|||||||
// Add peers from the InterfacePeers section
|
// Add peers from the InterfacePeers section
|
||||||
for intf, intfpeers := range current.InterfacePeers {
|
for intf, intfpeers := range current.InterfacePeers {
|
||||||
for _, peer := range intfpeers {
|
for _, peer := range intfpeers {
|
||||||
if err := c.AddPeer(peer, intf); err != nil {
|
if err := c.CallPeer(peer, intf); err != nil {
|
||||||
c.log.Errorln("Failed to add peer:", err)
|
c.log.Errorln("Failed to add peer:", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sit for a while
|
// Sit for a while
|
||||||
time.AfterFunc(time.Minute, func() {
|
c.addPeerTimer = time.AfterFunc(time.Minute, func() {
|
||||||
c.Act(c, c._addPeerLoop)
|
c.Act(c, c._addPeerLoop)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -187,4 +188,5 @@ func (c *Core) Stop() {
|
|||||||
// This function is unsafe and should only be ran by the core actor.
|
// This function is unsafe and should only be ran by the core actor.
|
||||||
func (c *Core) _stop() {
|
func (c *Core) _stop() {
|
||||||
c.log.Infoln("Stopping...")
|
c.log.Infoln("Stopping...")
|
||||||
|
c.addPeerTimer.Stop()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user