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,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

View File

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