mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-11-22 18:50:27 +00:00
Cherrypick fixes for _addPeerLoop memory leak for now
This commit is contained in:
parent
909e4e29a8
commit
5a382e7e0b
@ -368,14 +368,35 @@ func (c *Core) SetLogger(log *log.Logger) {
|
||||
// connection drops.
|
||||
func (c *Core) AddPeer(addr string, sintf string) error {
|
||||
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
|
||||
}
|
||||
c.config.Mutex.Lock()
|
||||
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)
|
||||
} else {
|
||||
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()
|
||||
return nil
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ type Core struct {
|
||||
router router
|
||||
link link
|
||||
log *log.Logger
|
||||
addPeerTimer *time.Timer
|
||||
}
|
||||
|
||||
func (c *Core) _init() error {
|
||||
@ -91,7 +92,7 @@ func (c *Core) _addPeerLoop() {
|
||||
|
||||
// Add peers from the Peers section
|
||||
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)
|
||||
}
|
||||
}
|
||||
@ -99,14 +100,14 @@ func (c *Core) _addPeerLoop() {
|
||||
// Add peers from the InterfacePeers section
|
||||
for intf, intfpeers := range current.InterfacePeers {
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sit for a while
|
||||
time.AfterFunc(time.Minute, func() {
|
||||
c.addPeerTimer = time.AfterFunc(time.Minute, func() {
|
||||
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.
|
||||
func (c *Core) _stop() {
|
||||
c.log.Infoln("Stopping...")
|
||||
c.addPeerTimer.Stop()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user