diff --git a/channeldb/db.go b/channeldb/db.go index e33a37d56..4d6958a3d 100644 --- a/channeldb/db.go +++ b/channeldb/db.go @@ -630,6 +630,26 @@ func (db *DB) pruneLinkNode(tx *bolt.Tx, remotePub *btcec.PublicKey) error { return db.deleteLinkNode(tx, remotePub) } +// PruneLinkNodes attempts to prune all link nodes found within the databse with +// whom we no longer have any open channels with. +func (db *DB) PruneLinkNodes() error { + return db.Update(func(tx *bolt.Tx) error { + linkNodes, err := db.fetchAllLinkNodes(tx) + if err != nil { + return err + } + + for _, linkNode := range linkNodes { + err := db.pruneLinkNode(tx, linkNode.IdentityPub) + if err != nil { + return err + } + } + + return nil + }) +} + // syncVersions function is used for safe db version synchronization. It // applies migration functions to the current database and recovers the // previous state of db if at least one error/panic appeared during migration. diff --git a/server.go b/server.go index 9234cb4e1..e8de45b4a 100644 --- a/server.go +++ b/server.go @@ -759,7 +759,12 @@ func (s *server) Start() error { // With all the relevant sub-systems started, we'll now attempt to // establish persistent connections to our direct channel collaborators - // within the network. + // within the network. Before doing so however, we'll prune our set of + // link nodes found within the database to ensure we don't reconnect to + // any nodes we no longer have open channels with. + if err := s.chanDB.PruneLinkNodes(); err != nil { + return err + } if err := s.establishPersistentConnections(); err != nil { return err }