Cherrypick fixes for _addPeerLoop memory leak for now

This commit is contained in:
Neil Alexander 2019-09-19 08:55:55 +01:00
parent 909e4e29a8
commit 5a382e7e0b
No known key found for this signature in database
GPG Key ID: A02A2019A2BB0944
2 changed files with 37 additions and 14 deletions

View File

@ -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
}

View File

@ -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()
}